【问题标题】:How do I solve this problem during transfer learning ResNet-50?在迁移学习 ResNet-50 期间如何解决这个问题?
【发布时间】:2020-10-23 02:06:32
【问题描述】:

我正在训练 Resnet-50 对 9 个类进行分类。我正在使用以下代码迁移学习来训练模型。

训练和测试损失和准确性似乎很好,但是当我针对新图像测试网络时,我发现了很多错误。 我觉得这个模型学得不好,我想知道你是否请让我知道我的方法有什么问题?我该如何解决这个问题?

NUM_CLASSES = 9

CHANNELS = 3

IMAGE_RESIZE = 224
RESNET50_POOLING_AVERAGE = 'avg'
DENSE_LAYER_ACTIVATION = 'softmax'
OBJECTIVE_FUNCTION = 'categorical_crossentropy'

LOSS_METRICS = ['accuracy']

NUM_EPOCHS = 100
EARLY_STOP_PATIENCE = 3


STEPS_PER_EPOCH_TRAINING = 10
STEPS_PER_EPOCH_VALIDATION = 10


BATCH_SIZE_TRAINING = 100
BATCH_SIZE_VALIDATION = 100

BATCH_SIZE_TESTING = 1

from tensorflow.python.keras.applications import ResNet50
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense



resnet_weights_path = '/path/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5'
model = Sequential()

model.add(ResNet50(include_top = False, pooling = RESNET50_POOLING_AVERAGE, weights = resnet_weights_path))

model.add(Dense(NUM_CLASSES, activation = DENSE_LAYER_ACTIVATION))

model.layers[0].trainable = False

from tensorflow.python.keras import optimizers

sgd = optimizers.SGD(lr = 0.01, decay = 1e-6, momentum = 0.9, nesterov = True)
model.compile(optimizer = sgd, loss = OBJECTIVE_FUNCTION, metrics = LOSS_METRICS)


model.summary()
from tensorflow.python.keras import optimizers

sgd = optimizers.SGD(lr = 0.01, decay = 1e-6, momentum = 0.9, nesterov = True)
model.compile(optimizer = sgd, loss = OBJECTIVE_FUNCTION, metrics = LOSS_METRICS)


from keras.applications.resnet50 import preprocess_input
from keras.preprocessing.image import ImageDataGenerator

image_size = IMAGE_RESIZE


data_generator = ImageDataGenerator(preprocessing_function=preprocess_input)


train_generator = data_generator.flow_from_directory(
        '/path train folder/train',
        target_size=(image_size, image_size),
        batch_size=BATCH_SIZE_TRAINING,
        class_mode='categorical')

validation_generator = data_generator.flow_from_directory(
        '/path test folder/test',
        target_size=(image_size, image_size),
        batch_size=BATCH_SIZE_VALIDATION,
        class_mode='categorical')


(BATCH_SIZE_TRAINING, len(train_generator), BATCH_SIZE_VALIDATION, len(validation_generator))


from tensorflow.python.keras.callbacks import EarlyStopping, ModelCheckpoint

cb_early_stopper = EarlyStopping(monitor = 'val_loss', patience = EARLY_STOP_PATIENCE)
cb_checkpointer = ModelCheckpoint(filepath = '/path/best.hdf5', monitor = 'val_loss', save_best_only = True, mode = 'auto')




fit_history = model.fit_generator(
        train_generator,
        steps_per_epoch=STEPS_PER_EPOCH_TRAINING,
        epochs = NUM_EPOCHS,
        validation_data=validation_generator,
        validation_steps=STEPS_PER_EPOCH_VALIDATION,
        callbacks=[cb_checkpointer, cb_early_stopper]
)
model.load_weights("/path/best.hdf5")

model.save('transfer_resnet.h5')


print(fit_history.history.keys())

【问题讨论】:

  • 我认为您可以通过删除不必要的部分将代码减少一半。这将使我们更容易提供帮助。此外,缺少一些关键部分,例如,您进行预测的部分。

标签: python keras resnet transfer-learning


【解决方案1】:

这可能有很多原因。 一方面,您的数据集可能太小或变化不够。 您可以尝试在顶部添加更多 Dense Layers。

【讨论】:

  • 我的数据集不小,@Nicolas 我编辑了我的帖子。
猜你喜欢
  • 2020-10-21
  • 2019-07-03
  • 2019-03-31
  • 1970-01-01
  • 2021-08-25
  • 2011-05-12
  • 2021-08-16
  • 2022-09-22
  • 2020-05-05
相关资源
最近更新 更多