关于深度学习第三次课代码的疑问

weights = {
    'conv1': tf.Variable(tf.random_normal([5, 5, 1, 32])),
    'conv2': tf.Variable(tf.random_normal([5, 5, 32, 64])),
    'fc1' : tf.Variable(tf.random_normal([7*7*64,256])),
    'out': tf.Variable(tf.random_normal([256,n_classes]))
}
1.我是这样理解的,对于这个CNN对手写体数据的识别,老师看下哪错了。第一层 输入28*28*1 经过5*5*32的卷积核 输出为32个24*24(24是通过28-5+1计算的)的特征图  ,然后通过池化变为32个12*12的特征图;第二层 采用5*5*64的卷积核,输出为64个8*8(12-5+1计算的)的特征图,池化变为64个4*4的特征图。然后的FC1层的输入不应该是4*4*64吗为什么是7*7*64?
2.还有注明的2012年的ALEXnet结构,关于结构中输入为224*224*3,RGB三个通道的,第一层是通过48个11*11的卷积核,输出为48个55*55的特征图。如果是按227*227是可以计算出来55个,按224不能计算啊 看课件的高级篇你也写的是227*227为什么和图片的224*224不一样呢?
3.关于全连接层的理解:前面通过多层的卷积层+池化层从低级到高级逐步提取到了抽象的特征表征,本质也就是很多个特征图很多个矩阵,然后通过全连接层是把这些特征给拉伸为对应输入的维度而已吗。它的本质是什么.

zwblst007

赞同来自:

关于第三次课代码里的7 * 7 * 64,我也觉得应该是4 * 4 * 64  不过程序为什么不报错呢

cunywei

赞同来自:

课上提到过,227x227 会被从中间切割出来224x224, 这个是训练过程中数据augmentation用的。7x7x256是最后一层特征图的size,你算成4x4是不是忘了pad?

沈澄泓607

赞同来自:

def conv_net(x, weights, biases, dropout): #可以简单理解为,将输入数据还原为28*28的矩阵 #输入x为[128,784] 经过reshape后变为 [128,28,28,1]的tensor(依次为[batchSize,width,height,channel]) x = tf.reshape(x, shape=[-1, 28, 28, 1]) #卷积层1 #卷积核为[5,5,1,32]([width,height,input_channel,out_channel])即采用5*5的卷积核,输入图像的通道是1,输出通道是32 #[128,28,28,1]的输入,采用[5,5,1,32]的filter,得到[128,28,28,32]输出 conv1 = conv2d(x, weights['wc1'], biases['bc1']) #池化层 池化后得到[128,14,14,32]的输出 conv1 = maxpool2d(conv1, k=2) #卷积层2 #上面的结果是32通道的,所以这里的卷积核采用[5,5,32,64],输出通道是64 #卷积计算后输出[128,14,14,64] conv2 = conv2d(conv1, weights['wc2'], biases['bc2']) #池化层 输出[128,7,7,64] conv2 = maxpool2d(conv2, k=2) # 全连接层 # reshape后数据变成[128,7*7*64] fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]]) #矩阵乘法 [128,7*7*64] X [7*7*64,1024] -> [128,1024] fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1']) #非线性激活,这里采用relu fc1 = tf.nn.relu(fc1) #失活层 #对结果进行随机失活 fc1 = tf.nn.dropout(fc1, dropout) # 分类 实际上就是做WX+b 这个运算 #[128,1024]X[1024,10] ->[128,10] 即得到每个图片在10个分类中的得分

要回复问题请先登录注册