神经网络相关操作
1.1 tf.nn.conv2(input,filter,strides,padding,use_cudnn_gpu=None,name=None)input:指需要做卷积的输入图像,它要求是一个Tensor, 具有[batch,in_height,in_width,in_channels] 这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数], 注意这是一个4维的Tensor,要求类型为float32和 float64其中之一 filter:相当于CNN中的卷积核,它要求是一个Tensor, 具有[filter_height, filter_width,in_channels, out_channels]这样的shape, 具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷 积核个数], 要求类型与参数input相同,filter的通道数要求与input的 in_channels一致, 有一个地方需要注意,第三维in_channels,就是参数 input的第四维 strides:卷积时在图像每一维的步长,这是一个一维的向 量,长度4,strides[0]=strides[3]=1 padding:string类型的量,只能是"SAME","VALID"其中 之一,这个值决定了不同的卷积方式 第五个参数:use_cudnn_on_gpu:bool类型,是否使用 cudnn加速,默认为true 结果返回一个Tensor,这个输出,就是我们常说的featuremap
input=tf.Variable(tf.random_normal([1,3,3,5]))
filter=tf.Variable(tf.random_normal([1,1,5,1]))
op=tf.nn.conv2d(input=input,filter=filter,strides=
[1,1,1,1],padding='VALID')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
res=(sess.run(op))
print(res.shape)#(1, 3, 3, 1)
print(res)
1.2
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]这种形式
a=tf.constant([#(2, 4, 4)
[[1.0,2.0,3.0,4.0],
[5.0,6.0,7.0,8.0],
[8.0,7.0,6.0,5.0],
[4.0,3.0,2.0,1.0]],
[[4.0,3.0,2.0,1.0],
[8.0,7.0,6.0,5.0],
[1.0,2.0,3.0,4.0],
[5.0,6.0,7.0,8.0]]
])
print(a.shape)
a=tf.reshape(a,[1,4,4,2])
pooling=tf.nn.max_pool(a,[1,2,2,1],[1,1,1,1],padding='VALID')
with tf.Session() as sess:
print('image:')
image=sess.run(a)
print(image)
print("result:")
result=sess.run(pooling)
print(result)
print(result.shape)#(1, 3, 3, 2)
1.3
tf.nn.dr