Tensorflow CNN MNIST示例,重量尺寸
我刚开始用Tensorflow编程,虽然我对神经网络的概念已经非常熟悉(我知道,怪我的大学很奇怪)。我一直在试图改变的实现,以使我自己的设计工作。我的问题是有关权重初始化的:Tensorflow CNN MNIST示例,重量尺寸,tensorflow,conv-neural-network,Tensorflow,Conv Neural Network,我刚开始用Tensorflow编程,虽然我对神经网络的概念已经非常熟悉(我知道,怪我的大学很奇怪)。我一直在试图改变的实现,以使我自己的设计工作。我的问题是有关权重初始化的: weights = { # 5x5 conv, 1 input, 32 outputs (i.e. 32 filters) 'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])), # 5x5 conv, 32 inputs, 64 outputs
weights = {
# 5x5 conv, 1 input, 32 outputs (i.e. 32 filters)
'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])),
# 5x5 conv, 32 inputs, 64 outputs
'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])),
# fully connected, 7*7*64 inputs, 1024 outputs
'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])),
# 1024 inputs, 10 outputs (class prediction)
'out': tf.Variable(tf.random_normal([1024, n_classes]))
}
如果第二层有32个输入和64个输出,这是否意味着它只应用2个过滤器?(似乎太少了?)这是否意味着,为了实现5个连续的3x3 conv层,我应该将之前的输出数量与该层中的过滤器数量相乘,如下所示:
weights = {
'wc1': tf.Variable(tf.random_normal([3, 3, 1, 20])),
'wc2': tf.Variable(tf.random_normal([3, 3, 20, 41])),
'wc3': tf.Variable(tf.random_normal([3, 3, 20*41, 41])),
'wc4': tf.Variable(tf.random_normal([3, 3, 20*41*41, 62])),
'wc5': tf.Variable(tf.random_normal([3, 3, 20*41*41*62, 83])),
'out': tf.Variable(tf.random_normal([3, 3, 20*41*41*62*83, n_classes]))
}
我只是觉得我做错了什么。是的,你做错了什么 您的输入矩阵为[批次、高度、宽度、深度],其中深度最初为1 让我们以wc1为例[3,3,1,20]。这意味着它将有20个不同的过滤器,每个过滤器将跨越1个深度,覆盖3x3的高度x宽度。每个过滤器将通过整个图像,覆盖所有深度。因为有20个不同的过滤器将创建[batch,height,width,20]的输出张量 从概念上讲,我们有机会将像素强度的深度改为前一个像素周围每3x3像素20类 如果我们应用[3,3,20,41],我们将创建41个过滤器,其中每个过滤器的深度为20,高度x宽度为3x3,在所有高度和宽度上滑动以生成41个不同的过滤器。结果是[batch,height,width,41],或每像素41个类 下一个变换是[3,3,20*41,41],这是错误的。没有20*41深度,你有41深度 以下是您需要的更新:
weights = {
'wc1': tf.Variable(tf.random_normal([3, 3, 1, 20])),
'wc2': tf.Variable(tf.random_normal([3, 3, 20, 41])),
'wc3': tf.Variable(tf.random_normal([3, 3, 41, 41])),
'wc4': tf.Variable(tf.random_normal([3, 3, 41, 62])),
'wc5': tf.Variable(tf.random_normal([3, 3, 62, 83])),
'out': tf.Variable(tf.random_normal([1, 1, 83, n_classes]))
}
应用wc5后,是否填充将决定输出形状,这取决于您是否正在进行最大池(max_pooling)操作
如果在wc1之后应用[1,2,2,1]max_池,则[height,width]将从[28,28]减少到[14,14]
如果wc2之后有另一个[1,2,2,1]最大值池,则[height,width]从[14,14]减少到[7,7]
7不能被2整除。如果应用wc3时没有填充,则[height,width]从[7,7]减少到[5,5]。对wc4->[3,3]和wc5->[1,1]执行相同的操作
最后,out将位于[batch,1,1,83]矩阵上,该矩阵将其转换为[batch,1,1,class]矩阵 是啊,你做错了什么 您的输入矩阵为[批次、高度、宽度、深度],其中深度最初为1 让我们以wc1为例[3,3,1,20]。这意味着它将有20个不同的过滤器,每个过滤器将跨越1个深度,覆盖3x3的高度x宽度。每个过滤器将通过整个图像,覆盖所有深度。因为有20个不同的过滤器将创建[batch,height,width,20]的输出张量 从概念上讲,我们有机会将像素强度的深度改为前一个像素周围每3x3像素20类 如果我们应用[3,3,20,41],我们将创建41个过滤器,其中每个过滤器的深度为20,高度x宽度为3x3,在所有高度和宽度上滑动以生成41个不同的过滤器。结果是[batch,height,width,41],或每像素41个类 下一个变换是[3,3,20*41,41],这是错误的。没有20*41深度,你有41深度 以下是您需要的更新:
weights = {
'wc1': tf.Variable(tf.random_normal([3, 3, 1, 20])),
'wc2': tf.Variable(tf.random_normal([3, 3, 20, 41])),
'wc3': tf.Variable(tf.random_normal([3, 3, 41, 41])),
'wc4': tf.Variable(tf.random_normal([3, 3, 41, 62])),
'wc5': tf.Variable(tf.random_normal([3, 3, 62, 83])),
'out': tf.Variable(tf.random_normal([1, 1, 83, n_classes]))
}
应用wc5后,是否填充将决定输出形状,这取决于您是否正在进行最大池(max_pooling)操作
如果在wc1之后应用[1,2,2,1]max_池,则[height,width]将从[28,28]减少到[14,14]
如果wc2之后有另一个[1,2,2,1]最大值池,则[height,width]从[14,14]减少到[7,7]
7不能被2整除。如果应用wc3时没有填充,则[height,width]从[7,7]减少到[5,5]。对wc4->[3,3]和wc5->[1,1]执行相同的操作
最后,out将位于[batch,1,1,83]矩阵上,该矩阵将其转换为[batch,1,1,class]矩阵 谢谢你解释整件事!你帮了我很多忙。谢谢你解释了整件事!你帮了我很多忙。