使用 ResNet50 进行图像分类的迁移学习

时间:2021-05-26 08:25:17

标签: python tensorflow deep-learning transfer-learning resnet

大家好,我可以就我在resNet50模型上应用迁移学习所采用的方法是否正确提出一些建议,在网上阅读了许多文章和资源后,很难说我采用的方法是否正确.我应该提到我使用 500 个图像/标签(标签范围为 0-25)来运行我的模型。让我们先回顾一下构建模型的第一部分,请找到以下代码:

X_train, X_test, y_train, y_test = train_test_split(files, labels, test_size=0.2)
X_train = np.array(X_train)
X_test = np.array(X_test)
y_train = np.array(y_train)
y_test = np.array(y_test)

input_t = (224, 224, 3)
resnet = ResNet50(input_shape=input_t, weights='imagenet', include_top=False)

for layer in resnet.layers:
    layer.trainable = False

所以我创建了我的训练/测试组并实例化了我的 resNet50 模型。然后我冻结模型的层,这样它们就不必进行训练,但是我不清楚是应该冻结所有层还是只冻结部分层。

现在让我们进入下一部分,请找到下面的代码:

model = tensorflow.keras.models.Sequential()
model.add(tensorflow.keras.layers.Lambda(lambda image: tensorflow.image.resize(image, to_res)))
model.add(resnet)
model.add(tensorflow.keras.layers.Flatten())
model.add(tensorflow.keras.layers.BatchNormalization())
model.add(tensorflow.keras.layers.Dense(256, activation='relu'))
model.add(tensorflow.keras.layers.Dropout(0.5))
model.add(tensorflow.keras.layers.BatchNormalization())
model.add(tensorflow.keras.layers.Dense(128, activation='relu'))
model.add(tensorflow.keras.layers.Dropout(0.5))
model.add(tensorflow.keras.layers.BatchNormalization())
model.add(tensorflow.keras.layers.Dense(64, activation='relu'))
model.add(tensorflow.keras.layers.Dropout(0.5))
model.add(tensorflow.keras.layers.BatchNormalization())
model.add(tensorflow.keras.layers.Dense(26, activation='softmax'))

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(X_train, y_train, batch_size=32, epochs=5, verbose=1, validation_data=(X_test, y_test))

在本节中,我基本上向 resNet50 模型添加了额外的层,以便在我的数据上训练它们。最后我使用 softmax 激活函数,因为我的标签范围是 0-25,然后通过在我的数据上拟合模型来结束。 如果您同意/不同意某些事情,或者也欢迎任何类型的提示/建议,请告诉我。感谢阅读。

2 个答案:

答案 0 :(得分:0)

我认为你的数据集很小,所以你不需要那么多的全连接层。或者您可以尝试将 train_test_split

中的数据打乱

答案 1 :(得分:0)

不幸的是,很多深度学习都是基于猜测或利用其他人发现的成功方法。无法确切地告诉您您需要什么,但这里有一些建议:

  1. 您根本没有通过冻结卷积层来训练它们。当且仅当预训练的权重实际上形成一个可以分离您的数据的特征提取器时(例如,如果您的数据类似于 ImageNet),这是可以的。我建议采用无头 resnet 的输出并通过 T-SNE 或类似方法降低维度,以查看您的分离情况(对每个标签进行颜色编码)。如果 T-SNE 图显示分离不佳,您可能需要解冻 resnet 的一些层(从最后一层开始)甚至所有层,并以较小的学习率训练它们。

  2. 您只有 26 个类别的 500 张图片。如果您的数据是平衡的,那么每类大约有 20 张图像,这并不多。研究增强,或者您有机会获得更多数据(甚至可能是一些合成数据?)。

  3. 你的 FC-Head 看起来很复杂。如果特征提取器做得很好,就不需要如此复杂的架构。尝试池化(如果 resnet 还没有这样做)、展平和单个 sigmoid 密集层。如果这不起作用,您可以随时添加 Dropout、BN 和更多隐藏层。

  4. 5 Epochs 可能过于乐观,尝试更大的东西并使用良好的早期停止技术。