【问题标题】:How to use augumented data when using transfer learning?使用迁移学习时如何使用增强数据?
【发布时间】:2019-09-09 20:50:27
【问题描述】:

我使用 VGG16 进行迁移学习,但准确率非常低。使用迁移学习时是否可以使用数据增强技术来提高准确性?

Following is the code for better understanding:


# Show the image paths
train_path = 'myNetDB/train'      # Relative Path
valid_path = 'myNetDB/valid'
test_path = 'myNetDB/test'

train_batches = ImageDataGenerator().flow_from_directory(train_path, target_size=(224, 224), classes=['dog', 'cat'], batch_size=10)
valid_batches = ImageDataGenerator().flow_from_directory(valid_path, target_size=(224, 224), classes=['dog', 'cat'], batch_size=4)
test_batches = ImageDataGenerator().flow_from_directory(test_path, target_size=(224, 224), classes=['dog', 'cat'], batch_size=10)


vgg16_model= load_model('Fetched_VGG.h5') 

# transform the model to Sequential
model= Sequential()
for layer in vgg16_model.layers[:-1]: 
    model.add(layer)

# Freezing the layers (Oppose weights to be updated)
for layer in model.layers:
    layer.trainable = False

# adding the last layer
model.add(Dense(2, activation='softmax'))

model.compile(Adam(lr=.0001), loss='categorical_crossentropy', metrics=['accuracy'])
model.fit_generator(train_batches, steps_per_epoch=4,
                    validation_data=valid_batches, validation_steps=4, epochs=5, verbose=2)


predictions = model.predict_generator(test_batches, steps=1, verbose=0)

【问题讨论】:

  • 有可能。但是你应该提供更多关于你如何训练你的模型以及你的数据是什么的信息。您确定数据增强会解决您的问题吗?
  • 我正在尝试对 X 射线图像中的盐状微小钙沉积物进行分类。这是一个二元分类问题。我用过,Training : 228, Validation: 58, Testing : 21。首先我从 keras 库中下载了 Vgg16 模型,然后去掉最后一个输出层,冻结模型(反对权重更新)。之后,我添加了最后一个输出层。然后我训练和测试模型。我的问题是如何在整个过程中执行数据增强?我知道如何在 keras 中进行数据增强,但不知道如何同时使用迁移学习和数据增强?

标签: tensorflow keras deep-learning transfer-learning data-augmentation


【解决方案1】:

如果您的准确率非常低,则可能是您的数据集与训练 VGG16 的数据集非常不同。有两种可能:

  1. 您的数据集足够大,可以从预训练的权重开始训练模型。

  2. 您的数据集很小。在这种情况下,没有捷径。您应该考虑一个比 VGG16 更简单的模型,这样您就不太可能发生过度拟合。

在这两种情况下,要回答您的问题,是的,增强技术在有意识地进行时有助于提高准确性。

【讨论】:

  • 但是我的问题是在使用迁移学习时如何使用数据增强?我知道如何在 keras 中进行数据增强,但我不知道如何同时进行数据增强和迁移学习。
  • 首先扩充您的数据集。然后,使用预训练的权重初始化网络的权重(这是迁移学习部分)。最后,训练网络。
  • 感谢您的帮助。您能否确认以下步骤是否正确:(1)扩充数据(2)加载vgg16(例如)及其权重,删除它的最后一个输出层,并冻结模型以使权重无法更新.(这是迁移学习的部分吧?)(3)加一个输出层,训练模型
  • 是的,第 2 部分确实是迁移学习部分。请注意,如果您的数据集与用于训练 vgg16 的数据集非常不同并且足够大,那么您应该考虑解冻某些层,例如最后 2 层或 3 层。而且,是的,您的步骤是正确的。如果我以某种方式帮助了你,你能接受我的回答吗?谢谢!
  • 谢谢!!另一个问题是,在使用增强数据时如何更新权重,因为对于迁移学习,我用之前的权重冻结了网络(最后一个密集层/输出层除外)?模型是从冻结的预训练权重中更新的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 2019-12-17
  • 2017-10-20
  • 2021-12-14
相关资源
最近更新 更多