Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 训练具有不同输入形状的预训练序列模型_Python 3.x_Tensorflow_Keras_Conv Neural Network_Pre Trained Model - Fatal编程技术网

Python 3.x 训练具有不同输入形状的预训练序列模型

Python 3.x 训练具有不同输入形状的预训练序列模型,python-3.x,tensorflow,keras,conv-neural-network,pre-trained-model,Python 3.x,Tensorflow,Keras,Conv Neural Network,Pre Trained Model,我有一个预先训练过的顺序CNN模型,我在224x224x3的图像上训练过。以下是体系结构: model = Sequential() model.add(Conv2D(filters = 64, kernel_size = (5, 5), strides = 1, activation = 'relu', input_shape = (224, 224, 3))) model.add(MaxPool2D(pool_size = (3, 3))) model.add(Dropout(0.2))

我有一个预先训练过的顺序CNN模型,我在224x224x3的图像上训练过。以下是体系结构:

model = Sequential()
model.add(Conv2D(filters = 64, kernel_size = (5, 5), strides = 1, activation = 'relu', input_shape = (224, 224, 3)))
model.add(MaxPool2D(pool_size = (3, 3)))
model.add(Dropout(0.2))

model.add(Conv2D(filters = 128, kernel_size = (3, 3), strides = 1, activation = 'relu'))
model.add(MaxPool2D(pool_size = (2, 2)))
model.add(Dropout(0.2))

model.add(Conv2D(filters = 256, kernel_size = (2, 2), strides = 1, activation = 'relu'))
model.add(MaxPool2D(pool_size = (2, 2)))
model.add(Dropout(0.2))

model.add(Flatten())
model.add(Dense(128, activation = 'relu', use_bias=False))

model.add(Dense(num_classes, activation = 'softmax'))     

model.summary()
以下是模型摘要,供参考:

我想在尺寸为40x40x3的图像上重新训练此模型。但是,我面临以下错误:“ValueError:layer Density_12的输入0与layer不兼容:输入形状的预期轴-1的值为200704,但收到的输入为shape(无,256)”。 我应该如何解决此错误


注意:我使用的是Tensorflow版本2.4.1,问题是,在预先训练的模型中,您有一个200704的扁平形状作为输入形状(最后一行的第4行),然后密集层的输出大小是128(最后一行的第3行)。现在你想对40X40的图像使用同样的预先训练过的模型,它将不起作用。原因是:

1-模型取决于输入图像形状。它不是端到端的conv模型,因为在模型之间使用密集层,这使得模型输入图像的大小依赖于此

2-所有conv层后40x40图像的展平大小为256,而不是200704

解决方案

1-或者使用自适应平均池层更改展平部分,然后使用softmax更改最后一个密集层即可。再次在224x224图像上重新训练旧模型。接下来,您可以在40x40图像上进行训练


2-或者最简单的方法是只使用预先训练的模型的子集,直到展平部分(不包括展平部分),然后添加具有密集层和分类层(具有softmax的层)的展平部分。对于这种方法,您必须编写一个自定义模型,如这里所示,只有第一部分是预训练模型的子集,而展平和分类部分是附加的。然后可以在新的数据集上训练整个模型。您还可以使用这种方法利用迁移学习的好处,只允许后向梯度通过新创建的线性层,而不通过预先训练的层。

您可以发布model.summary的输出吗?@BerkayBerabi我已经在问题中包含了model summary。请查收。:)非常感谢。第二种解决方案解决了这个错误。另外,keras.tensorflow中是否有自适应平均池的实现,还是仅在pytorch中有实现?这里有一个链接-