为什么我的回归模型中每个时代的损失都是相同的?



代码如下:

datagen = ImageDataGenerator(rescale=1./255, validation_split=0.1)
train_generator = datagen.flow_from_dataframe(
df,
directory=img_data_dir,
x_col="image_name",
y_col=["top_x", "top_y", "bottom_x", "bottom_y"],
target_size=(WIDTH, HEIGHT),
batch_size=32, 
class_mode="other",
subset="training")
validation_generator = datagen.flow_from_dataframe(
df,
directory=img_data_dir,
x_col="image_name",
y_col=["top_x", "top_y", "bottom_x", "bottom_y"],
target_size=(WIDTH, HEIGHT),
batch_size=32, 
class_mode="other",
subset="validation")
model = Sequential()
model.add(VGG16(weights="imagenet", include_top=False, input_shape=(HEIGHT, WIDTH, CHANNEL)))
model.add(Flatten())
model.add(Dense(128, activation="relu"))
model.add(Dense(64, activation="relu"))
model.add(Dense(64, activation="relu"))
model.add(Dense(4, activation="sigmoid"))
model.layers[-6].trainable = False
model.summary()
STEP_SIZE_TRAIN = int(np.ceil(train_generator.n / train_generator.batch_size))
STEP_SIZE_VAL = int(np.ceil(validation_generator.n / validation_generator.batch_size))
print("Train step size:", STEP_SIZE_TRAIN)
print("Validation step size:", STEP_SIZE_VAL)
train_generator.reset()
validation_generator.reset()
adam = Adam(lr=1e-4)
model.compile(optimizer=adam, loss="mse")
history = model.fit(train_generator,
steps_per_epoch=STEP_SIZE_TRAIN,
validation_data=validation_generator,
validation_steps=STEP_SIZE_VAL,
epochs=10)

下面是每个epoch的结果,

时代1/1020/20 [==============================] - 376年代18 s/步骤——损失:436570.7812 - val_loss: 524766.6875时代2/1020/20 [==============================] - 14年代732 ms/步骤——损失:436464.6250 - val_loss: 524765.2500时代3/1020/20 [==============================] - 14年代721 ms/步骤——损失:436464.2188 - val_loss: 524765.1250时代4/1020/20 [==============================] - 14年代721 ms/步骤——损失:436464.1875 - val_loss: 524765.0625时代5/1020/20 [==============================] - 14年代722 ms/步骤——损失:436464.1875 - val_loss: 524765.0625时代6/1020/20 [==============================] - 14年代707 ms/步骤——损失:436464.1875 - val_loss: 524765.0625时代7/1020/20 [==============================] - 14年代715 ms/步骤——损失:436464.1875 - val_loss: 524765.0000时代8/1020/20 [==============================] - 14年代713 ms/步骤——损失:436464.1875 - val_loss: 524765.0000时代9/1020/20 [==============================] - 15秒741 ms/步骤——损失:436464.1250 - val_loss: 524765.0000时代10/1020/20 [==============================] - 17 s 827 ms/步骤——损失:436464.0625 - 524765.0000 val_loss:

为它绘图,输入图片描述

简短地浏览一下您的代码,似乎这行代码阻碍了您的模型的训练:

model.layers[-6].trainable = False

来自[Keras文档:][1]

层,模型还具有布尔属性trainable。该值可以修改。设置层。trainable to False将所有层的权重从可训练到不可训练。这被称为"冷冻"。层:在训练期间,冻结层的状态不会更新(无论是用fit()训练,还是用任何依赖trainable_weights应用梯度更新的自定义循环训练)。

训练一个模型是关于更新权重矩阵,所以这可能会阻碍优化损失。尝试将其设置为True,看看会发生什么。不过,我从来没有在cnn工作过。也许这条线冻结了一层你不想冻结的东西?

[1]: https://keras.io/guides/transfer_learning/: ~:文本=可训练的% 20 % 20错误% 20移动% 20,trainable_weights % 20 % 20应用% 20梯度% 20更新)。

最新更新