我正在尝试使用带有tensorflow后端的keras定制resnet50。但是,转义后,我的val_loss不断增加。尝试不同的学习率和批次大小不能解决问题。
在ImageDataGenerator内部使用不同的预处理方法(例如重新缩放)或对resnet50使用preprocess_input函数也不能解决问题。
这是我正在使用的代码
导入和预处理数据
from keras.preprocessing.image import ImageDataGenerator
from keras.applications.resnet50 import preprocess_input, decode_predictions
IMAGE_SIZE = 224
BATCH_SIZE = 32
num_classes = 27
main_path = "C:/Users/aaron/Desktop/DATEN/data"
gesamt_path = os.path.join(main_path, "ML_DATA")
labels = listdir(gesamt_path)
data_generator = ImageDataGenerator(#rescale=1./255,
validation_split=0.20,
preprocessing_function=preprocess_input)
train_generator = data_generator.flow_from_directory(gesamt_path, target_size=(IMAGE_SIZE, IMAGE_SIZE), shuffle=True, seed=13,
class_mode='categorical', batch_size=BATCH_SIZE, subset="training")
validation_generator = data_generator.flow_from_directory(gesamt_path, target_size=(IMAGE_SIZE, IMAGE_SIZE), shuffle=False, seed=13,
class_mode='categorical', batch_size=BATCH_SIZE, subset="validation")
定义和训练模型
img_width = 224
img_height = 224
model = keras.applications.resnet50.ResNet50()
classes = list(iter(train_generator.class_indices))
model.layers.pop()
for layer in model.layers:
layer.trainable=False
last = model.layers[-1].output
x = Dense(len(classes), activation="softmax")(last)
finetuned_model = Model(model.input, x)
finetuned_model.compile(optimizer=Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])
for c in train_generator.class_indices:
classes[train_generator.class_indices[c]] = c
finetuned_model.classes = classes
earlystopCallback = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=8, verbose=1, mode='auto')
tbCallBack = keras.callbacks.TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=True)
history = finetuned_model.fit_generator(train_generator,
validation_data=validation_generator,
epochs=85, verbose=1,callbacks=[tbCallBack,earlystopCallback])
答案 0 :(得分:1)
您需要匹配用于预训练网络的预处理,而不是自己进行预处理。仔细检查网络输入张量,即输入的通道平均值是否与用于预训练网络的数据相匹配。
您的新数据可能与用于预训练网络的数据有很大不同。在这种情况下,所有BN层都会将其预先训练的均值/变量迁移到新值,因此损失也可能增加(但最终损失应该减少)。
答案 1 :(得分:0)
在训练中,您使用的是预训练模型(class QaCommissionSerializer(serializers.ModelSerializer):
class Meta:
model = QaCommission
fields = '__all__'
),仅更改最后一层,因为您只想预测几类,而不是预训练模型所训练的1000个类(这就是转移的含义学习)。
您正在冻结所有重量,并且不让模型训练。试试:
class QaCommissionList(viewsets.ModelViewSet):
queryset = QaCommission.objects.all()
serializer_class = QaCommissionSerializer
您可以修改上面的代码,更改512个神经元的数量,添加或不删除/批量归一化,使用任意数量的密集层。...
答案 2 :(得分:0)
在Keras中有一个关于BN的已知“问题”(奇怪的设计),您的不良结果可能与this issue.
有关