【发布时间】:2020-03-04 09:38:39
【问题描述】:
我在 mnist 上用 keras 训练了我自己的模型。我只有 conv2d 层,因为我想在小图像(mnist:28x28 px)上训练网络,然后对 1920x1080 的大图像进行推理。
我的形状(用于训练):
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1 (Conv2D) (None, 28, 28, 64) 640
_________________________________________________________________
batch_normalization_117 (Bat (None, 28, 28, 64) 256
_________________________________________________________________
leaky_re_lu_117 (LeakyReLU) (None, 28, 28, 64) 0
_________________________________________________________________
max_pooling2d_119 (MaxPoolin (None, 14, 14, 64) 0
_________________________________________________________________
conv2 (Conv2D) (None, 14, 14, 128) 73856
_________________________________________________________________
batch_normalization_118 (Bat (None, 14, 14, 128) 512
_________________________________________________________________
leaky_re_lu_118 (LeakyReLU) (None, 14, 14, 128) 0
_________________________________________________________________
max_pooling2d_120 (MaxPoolin (None, 7, 7, 128) 0
_________________________________________________________________
conv3 (Conv2D) (None, 7, 7, 256) 295168
_________________________________________________________________
batch_normalization_119 (Bat (None, 7, 7, 256) 1024
_________________________________________________________________
leaky_re_lu_119 (LeakyReLU) (None, 7, 7, 256) 0
_________________________________________________________________
max_pooling2d_121 (MaxPoolin (None, 4, 4, 256) 0
_________________________________________________________________
conv4 (Conv2D) (None, 4, 4, 128) 295040
_________________________________________________________________
batch_normalization_120 (Bat (None, 4, 4, 128) 512
_________________________________________________________________
leaky_re_lu_120 (LeakyReLU) (None, 4, 4, 128) 0
_________________________________________________________________
max_pooling2d_122 (MaxPoolin (None, 2, 2, 128) 0
_________________________________________________________________
conv5 (Conv2D) (None, 1, 1, 10) 5130
=================================================================
Total params: 672,138
Trainable params: 670,986
Non-trainable params: 1,152
推理形状:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1 (Conv2D) (None, 1920, 1080, 64) 640
_________________________________________________________________
batch_normalization_113 (Bat (None, 1920, 1080, 64) 256
_________________________________________________________________
leaky_re_lu_113 (LeakyReLU) (None, 1920, 1080, 64) 0
_________________________________________________________________
max_pooling2d_115 (MaxPoolin (None, 960, 540, 64) 0
_________________________________________________________________
conv2 (Conv2D) (None, 960, 540, 128) 73856
_________________________________________________________________
batch_normalization_114 (Bat (None, 960, 540, 128) 512
_________________________________________________________________
leaky_re_lu_114 (LeakyReLU) (None, 960, 540, 128) 0
_________________________________________________________________
max_pooling2d_116 (MaxPoolin (None, 480, 270, 128) 0
_________________________________________________________________
conv3 (Conv2D) (None, 480, 270, 256) 295168
_________________________________________________________________
batch_normalization_115 (Bat (None, 480, 270, 256) 1024
_________________________________________________________________
leaky_re_lu_115 (LeakyReLU) (None, 480, 270, 256) 0
_________________________________________________________________
max_pooling2d_117 (MaxPoolin (None, 240, 135, 256) 0
_________________________________________________________________
conv4 (Conv2D) (None, 240, 135, 128) 295040
_________________________________________________________________
batch_normalization_116 (Bat (None, 240, 135, 128) 512
_________________________________________________________________
leaky_re_lu_116 (LeakyReLU) (None, 240, 135, 128) 0
_________________________________________________________________
max_pooling2d_118 (MaxPoolin (None, 120, 68, 128) 0
_________________________________________________________________
conv5 (Conv2D) (None, 119, 67, 10) 5130
=================================================================
Total params: 672,138
Trainable params: 670,986
Non-trainable params: 1,152
这里的目标是用我的输出类的尺寸创建一个卷积图像,它代表我的大图像中的滑动窗口以进行推理。
但是 keras 不会让我训练,因为在最后一层它会减少我的前一层输出的形状(从 (batch,x,y,channels) 到 (batch,channels)):
ValueError: Error when checking target: expected conv5 to have 4 dimensions, but got array with shape (48000, 10)
形状需要是 (48000, 1, 1, 10) !!!我能做些什么来防止这种情况发生?当我引入flatten和dense时,我以后不能用它来推断大图像吗?
感谢您的时间和帮助。
【问题讨论】:
-
您能否详细说明为什么您有两种不同的模型用于训练和推理?你要复制卷积核吗?另外,训练“训练模型”的损失函数是什么?哪个形状需要 (48000,1,1,10) ?训练模型最后一层输入,训练模型最后一层输出,推理模型最后一层输入还是推理模型最后一层输出?
-
我修正了我的答案,以免混淆其他人。我的训练和推理模型是相同的。在我以前的方法中,我使用 flatten 和 dense 训练模型,然后将权重复制到新模型中,丢弃 flatten 和 dense。因为我注意到这不起作用,所以我在同一个模型中进行训练和推理。对于我得到的损失:keras.losses.categorical_crossentropy,我的优化器是 keras.optimizers.Adam()。训练的输入是 bx28x28x1,输出是 bx1x1x10。推理的输入是 bx1920x1080x1,输出是 bx119x67x10。
标签: python tensorflow keras conv-neural-network keras-layer