1.调用tf.nn.conv2d()实现卷积

首先是调用卷积函数实现卷积操作:
这里说明一下conv2d的定义及参数含义: 参考
【定义:】

tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

【参数:】
input : 输入的要做卷积的图片,要求为一个张量,shape为 [ batch, in_height, in_weight, in_channel ],其中batch为图片的数量,in_height 为图片高度,in_weight 为图片宽度,in_channel 为图片的通道数,灰度图该值为1,彩色图为3。(也可以用其它值,但是具体含义不是很理解)
filter: 卷积核,要求也是一个张量,shape为 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 为卷积核高度,filter_weight 为卷积核宽度,in_channel 是图像通道数 ,和 input 的 in_channel 要保持一致,out_channel 是卷积核数量。
strides: 卷积时在图像每一维的步长,这是一个一维的向量,[ 1, strides, strides, 1],第一位和最后一位固定必须是1
padding: string类型,值为“SAME” 和 “VALID”,表示的是卷积的形式,是否考虑边界。"SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑
use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true

2.TensorFlow tf.nn.max_pool实现池化操作方式

max pooling是CNN当中的最大值池化操作,其实用法和卷积很类似

tf.nn.max_pool(value, ksize, strides, padding, name=None)

参数是四个,和卷积很类似:

第一个参数value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape

第二个参数ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1

第三个参数strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]

第四个参数padding:和卷积类似,可以取'VALID' 或者'SAME'

返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式

import tensorflow as tf
import numpy as np
input = np.array([[12,21,1,1],
                   [11,10,10,2],
                   [1,10,10,23],
                   [45,31,11,32]],dtype='float32')
input = input.reshape([1,4,4,1]) #因为conv2d的参数都是四维的,因此要reshape成四维
kernel = np.array([[2,-1],[-1,0]])
kernel = kernel.reshape([2,2,1,1]) #kernel也要reshape
print(input.shape,kernel.shape) #(1, 4, 4, 1) (2, 2, 1, 1)

x = tf.placeholder(tf.float32,[1,4,4,1])
k = tf.placeholder(tf.float32,[2,2,1,1])
conv_result = tf.nn.conv2d(x,k,strides=[1,1,1,1],padding='SAME')
max_pooling=tf.nn.max_pool(input,[1,2,2,1],[1,1,1,1],padding='VALID')
ave_polling = tf.nn.avg_pool(input,[1,2,2,1],[1,1,1,1],padding='VALID')

with tf.Session() as sess:
    y = sess.run(conv_result,feed_dict={x:input,k:kernel})
    max_polling=sess.run(max_pooling)
    ave_polling=sess.run(ave_polling)

    y=y.reshape([4,4])
    max_polling = max_polling.reshape([3,3])
    ave_polling = ave_polling.reshape([3,3])
    print(y.shape) #(1,3,3,1)
    print(max_polling.shape)
    print(ave_polling.shape)
    print(y) #因为y有四维,输出太长了,我就只写一下中间两维的结果(3*3部分):[[4,3,4],[2,4,3],[2,3,4]]
    print(max_polling)
    print(ave_polling)

 

reference:https://blog.csdn.net/aaon22357/article/details/85283502

https://www.jb51.net/article/177799.htm

GitHub 加速计划 / te / tensorflow
184.55 K
74.12 K
下载
一个面向所有人的开源机器学习框架
最近提交(Master分支:2 个月前 )
a49e66f2 PiperOrigin-RevId: 663726708 2 个月前
91dac11a This test overrides disabled_backends, dropping the default value in the process. PiperOrigin-RevId: 663711155 2 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐