tf.nn.conv2d(input_tensor, conv1_weight, strides=[1,1,1,1], padding='SAME')
tf.nn.max_pool(relu1, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
tf.nn.dropout(fc1, 0.5)
tf.nn.relu(tf.nn.bias_add(conv1 , conv1_biases))
卷积函数的细微差异:
1.tf.nn.conv2d
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
这样写x,输入的图片全部信息,W即偏重
W=[h,w,channel,outchannel_size],输出空间的维度即W是filter为一个形状为[filter_height * filter_width * in_channels, output_channels]的二维矩阵
tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')
2.tf.layers.conv2d或者tf.contrib.layers.conv2d
tf.layers.conv2d(inputs, filters, kernel_size, strides=(1, 1), padding='valid', data_format='channels_last',dilation_rate=(1, 1), activation=None, use_bias=True,kernel_initializer=None,bias_initializer=None,kernel_regularizer=None,bias_regularizer=None,ctivity_regularizer=None,kernel_constraint=None, bias_constraint=None, trainable=True, name=None, reuse=None)
举例:
conv2 = tf.layers.conv2d(x, 32, 5, 1, 'same', activation=tf.nn.relu)
下面只要讲解cnn卷积和池化的计算及参数(具体理论知识自己补充):
卷积:
strides:第1,第4参数都为1,中间两个参数为卷积步幅,如:[1,1,1,1],[1,2,2,1]
1、使用VALID方式,feature map的尺寸为 (3,3,1,32)卷积权重
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1])) (28-3+1) / 1 = 26,(28-3+1) / 2 = 13
out_width = ceil(float(in_width - filter_width + 1) / float(strides[2])) (28-3+1) / 1 = 26,(28-3+1) / 2 = 13
2、使用使用SAME方式,feature map的尺寸为 (3,3,1,32)卷积权重
out_height = ceil(float(in_height) / float(strides[1])) 28 / 1 = 28,28 / 2 = 14
out_width = ceil(float(in_width) / float(strides[2])) 28 / 1 = 28,28 / 2 = 14
ceil:函数返回数字的上入整数
池化:
ksize:第1,第4参数都为1,中间两个参数为池化窗口的大小,如:[1,1,1,1],[1,2,2,1]
实验证明:对于实际的池化后的数据尺寸,ksize没有影响,只是计算的范围不同。
strides:第1,第4参数都为1,中间两个参数为池化窗口的步幅,如:[1,1,1,1],[1,2,2,1]
实验证明:对于实际的池化后的数据尺寸,strides产生影响,具体的计算方式和卷积中的strides相同。'''
一般来说如果:
输入图片大小 W×W
Filter大小 F×F
步长 S
padding的像素数 P
可以得出:N = (W - F + 2P )/S+1
输出图片大小为 N×N
池化: