转载,出自另一个跟笔者有同样疑惑的网友,希望在知乎找到答案。
以下是转载内容:
对比学习极客学院中tensorflow中的深入MNIST与本论坛中的matlab实现源码,有几个问题不明,想请教各位高人:
1. mnist问题中,输入均为一个28*28的图形,tensorflow说明中进行处理时,经过一层卷积和池化后,卷积在每个5x5的patch中算出32个特征。而在第二层卷积中,每个5*5的patch会得到64个特征。不知道这个32和64是如何得出的?matlab实现中,第一层和第二层分别使用的是6个特征和12个特征。这有什么区别或讲究呢?
2. tensorflow中,密集连接层时,原文说图片尺寸减小到7*7,不清楚这个7*7是如何得出的?我的计算如下,输入为28*28,第一层卷积使用5*5的patch,则第一个隐层输出为24*24,用2*2进行池化后得到12*12的池化层;再次用5*5的patch进行卷积时,将得到8*8的第二个隐层。此时,若再次池化,则应该得到4*4的输出。请问这个7*7是如何得出的呢?
3. tensorflow中模型迭代训练时,源代码中迭代学习了2万次,每次提取50个样本,可是,根据mnist_data的有关说明,似乎总共才6万个样本,2万次每次50个样本,不是已经远超样本总值了吗?这样是否会导致同一个样本的重复训练?而matlab的示例中,似乎是对所有的这6万个样本进行多次训练。训练次数从1-10次不等。
4. tensorflow中使用dropout来避免过度拟合,请问其作用和原理是什么呢?
5. tensorflow中进行2万次迭代训练,但过程中发现准确率会出现反复,比如800次训练的准确率为98%,但900次训练的准确率则返回到96%,请问这个迭代的次数如何确定较好呢?
1、输入时一幅二值图像,只有一个通道,所以输入层只有一幅图像,第1个卷积层:
W_conv1 = weight_variable([5, 5, 1, 32]),表示1个输入层,然后有32个输出层,相当于32个特征
第二个卷积层接第一个卷积层,第一个卷积层有32个输出,所以第二个卷积层有32个输入
W_conv2 = weight_variable([5, 5, 32, 64]),表示32个输入层,然后有64个输出层,相当于了64个特征
2、卷积采用‘SAME’模式,对边界进行填充,原始的是28*28,一次卷积之后折半,变成14*14;再做一次卷积变成7*7.
def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
'SAME' 相当于 padding = floor(ksize/2)
'VALID' 相当于 padding = 0
你所说的应该是丢弃边界情况
3. 建议你了解一下batch-随机梯度下降法算法。取样并不是你说的那样,是有重的。
4. dropout请看论文,直观的感觉:设keep=0.5,那么每次随机取一半的权值参与训练,学习到的特征具有广泛性,这样可以避免过拟合
5.这时候需要使用校验集,选定最佳的参数
楼主最近还看过