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

Transfer Learning with ResNet50 for image classification

大家好我可以使用一些建议来判断我在resNet50模型上应用迁移学习的方法是否正确,在网上阅读了很多文章和资源之后,很难说我采用的方法是否正确是正确的。我应该提到我正在使用 500 images/labels(标签范围从 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

所以我创建了我的 train/test 组并实例化了我的 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,然后通过在我的数据上拟合模型来完成。 请让我知道您是否 agree/disagree 有什么,或者任何类型的 tips/recommendations 也欢迎。感谢阅读。

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

中的数据

不幸的是,很多深度学习都是基于猜测或利用其他人已经取得成功的成果。不可能准确地告诉您您需要什么,但这里有一些建议:

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

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

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

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