2D CNN 和 MaxPool2D 维度问题



我正试图用MaxPooling2D建立一个2D CNN模型,但我遇到了维度问题。我相信我知道MaxPool2D在做什么(根据pool_size中的最大值缩小图像(,但我不理解尺寸问题,我希望有人能帮我看看。

因此,我的输入数据按batch_size、行、列、深度的顺序排列-(14000、96、96、1(由于数据在0和1之间缩放,因此它本质上是一个黑白图像。我正在将其输入Conv2D层:

Conv2D(filters=32, kernels_size=(3,3), activation='relu', padding='same', input_shape=(96,96,1)),

我可以将这个层馈送到另一个Conv2D层,没有问题。但我正试图在这些Conv2D层之间放置一个MaxPool2D层。然而,当我试图添加时:

MaxPool2D(pool_size=(2,2))

我最终得到

"ValueError:  Dimensions must be equal, but are 48 and 96 for '{{node mean_squared_error/SquaredDifference}} = SquaredDifference[T=DT_FLOAT](sequential/conf2d_2/Relu, IteratorGetNext:1)' with input shapes: [?,48,48,1],[?,96,96,1]."

有没有关于如何设置填充的规则?(在conv2d层和MaxPool2D层中(我为MaxPooling2D层设置填充值(相同或有效(似乎并不重要,我总是会得到尺寸错误。

我看过的每一个教程/操作指南似乎都只是浏览了一下任何需求,并解释了一些应该是常识的东西。我得到了设置为(2,2(的池应该将图像减半,因此输出形状为48x48。我得到的输入是96,96,32,因为我在上一个Conv2D层中将过滤器设置为32。我的理解是,MaxPooling只是通过查看2x2子区域中的最大值来缩小数据集,所以我希望是48x48x32维度,那么与原始96值相关的维度问题从哪里来?是因为它缩小了训练集,而不是试图与之比较的另一组数据吗?我需要进行批量规范化吗?然而,我试图效仿的例子似乎都没有做到这一点。

希望有人能为我阐明这一点——我完全是个傻瓜。如果有人在实现2D CNN和构建/优化模型的方法方面有一些好的资源,我很乐意看到它。我觉得我在黑暗中四处游荡。谢谢

Model Summary:
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #  
=================================================================
conv2d (Conv2D)              (None, 96, 96, 32)        320      
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 48, 48, 32)        0        
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 48, 48, 64)        18496    
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 48, 48, 1)         577      
=================================================================
Total params: 19,393
Trainable params: 19,393
Non-trainable params: 0
_________________________________________________________________ 
model = Sequential([
Conv2D(filters=32, kernel_size=(3,3), activation='relu', padding = 'same', input_shape=(96,96,1)),
MaxPool2D(pool_size=(2,2)),
Conv2D(filters=64, kernel_size=(3,3), activation='relu', padding = 'same'),
Conv2D(filters=1, kernel_size=(3,3), activation='relu', padding='same')
])

模型的定义中没有错误,应该编译得很好。

简单地回答你所有的问题:是的,维度匹配在实现中花费了最多的时间,再多的阅读也无法让你成为它的大师

参考原始资料和批判性思维作为起点:https://www.tensorflow.org/api_docs/python/tf

编辑: (添加清晰度和示例代码(

与之比较的输出也应具有(高度、宽度(为(48、48(。如果没有,则model.fit()将出错。

供参考的示例程序:

import tensorflow as tf
from tensorflow import keras
from keras import Sequential, layers
from keras.layers import Conv2D, MaxPool2D
x = tf.ones((1400, 96, 96, 1))
model = Sequential([
Conv2D(filters=32, kernel_size=(3,3), activation='relu', padding = 'same', input_shape=(96,96,1)),
MaxPool2D(pool_size=(2,2), padding='valid'),
Conv2D(filters=32, kernel_size=(3,3), activation='relu', padding = 'same'),
Conv2D(filters=1, kernel_size=(3,3), activation='relu', padding='same'), 
])
keras.utils.plot_model(model)
model.summary()
y = model(x)
model.compile(optimizer='adam', 
loss='mean_absolute_error', 
metrics=['mean_absolute_error'])
y = tf.ones((1400, 48, 48, 1))
model.fit(x, y, epochs=50)

CCD_ 2层将输入的空间维度减少了CCD_ 3的因子。

计算MSE损失时,预测和目标大小不匹配导致错误。由于MaxPool2D,型号输出为48x48x1,但目标仍然是原来的96x96x1尺寸。为了解决这个问题,增加了一个上采样层,使其恢复到96x96。

model = Sequential([
Conv2D(filters=32, kernel_size=(3,3), activation='relu', padding = 'same', input_shape=(96,96,1)),
MaxPool2D(pool_size=(2,2), padding='valid'),
Conv2D(filters=32, kernel_size=(3,3), activation='relu', padding = 'same'),
UpSampling2D(size=(2,2), data_format=None, interpolation='bilinear'),
Conv2D(filters=1, kernel_size=(3,3), activation='relu', padding='same'), 
])

您只需将模型更改为以下代码:


model = Sequential([
Conv2D(filters=32, kernel_size=(3,3), activation='relu', padding= 'same', input_shape=(96,96,1)),
MaxPool2D(pool_size=(2,2), padding='valid'),
Conv2D(filters=32, kernel_size=(3,3), activation='relu', padding= 'same'),
Conv2D(filters=1, kernel_size=(3,3), activation='relu', padding='same'), 
])

最新更新