Python 迁移学习:模型给出不变的损失结果。这不是训练吗?

Python 迁移学习:模型给出不变的损失结果。这不是训练吗?,python,tensorflow,keras,deep-learning,transfer-learning,Python,Tensorflow,Keras,Deep Learning,Transfer Learning,我正在尝试在《盗梦空间》V3上训练一个回归模型。输入是大小为(96320,3)的图像。总共有16k+个图像,其中12k+用于培训,其余用于验证。我在《盗梦空间》中冻结了所有层,但解冻它们也没有帮助(已经尝试过)。我已经用下面代码中所示的几个层替换了预训练模型的顶部 X_train = preprocess_input(X_train) inception = InceptionV3(weights='imagenet', include_top=False, input_shape=(299,2

我正在尝试在《盗梦空间》V3上训练一个回归模型。输入是大小为(96320,3)的图像。总共有16k+个图像,其中12k+用于培训,其余用于验证。我在《盗梦空间》中冻结了所有层,但解冻它们也没有帮助(已经尝试过)。我已经用下面代码中所示的几个层替换了预训练模型的顶部

X_train = preprocess_input(X_train)
inception = InceptionV3(weights='imagenet', include_top=False, input_shape=(299,299,3))
inception.trainable = False
print(inception.summary())

driving_input = Input(shape=(96,320,3))
resized_input = Lambda(lambda image: tf.image.resize(image,(299,299)))(driving_input)
inp = inception(resized_input)

x = GlobalAveragePooling2D()(inp)

x = Dense(512, activation = 'relu')(x)
x = Dense(256, activation = 'relu')(x)
x = Dropout(0.25)(x)
x = Dense(128, activation = 'relu')(x)
x = Dense(64, activation = 'relu')(x)
x = Dropout(0.25)(x)
result = Dense(1, activation = 'relu')(x)

lr_schedule = ExponentialDecay(initial_learning_rate=0.1, decay_steps=100000, decay_rate=0.95)
optimizer = Adam(learning_rate=lr_schedule)
loss = Huber(delta=0.5, reduction="auto", name="huber_loss")
model = Model(inputs = driving_input, outputs = result)
model.compile(optimizer=optimizer, loss=loss)

checkpoint = ModelCheckpoint(filepath="./ckpts/model.h5", monitor='val_loss', save_best_only=True)
stopper = EarlyStopping(monitor='val_loss', min_delta=0.0003, patience = 10)

batch_size = 32
epochs = 100

model.fit(x=X_train, y=y_train, shuffle=True, validation_split=0.2, epochs=epochs, 
          batch_size=batch_size, verbose=1, callbacks=[checkpoint, stopper])
这导致:


为什么我的模型没有训练,我能做些什么来修复它?

因为你的问题是回归问题,最后一层的激活应该是
线性的
,而不是
relu
。而且学习速度太高,你应该考虑根据你的整体设置来降低。这里我展示了一个带有MNIST的代码示例

#数据
(xtrain,train_target),(xtest,test_target)=tf.keras.datasets.mnist.load_data()
#列x,MNIST是灰度,因此为了在预训练权重中使用它,将其扩展到3轴
x_列=np。展开尺寸(x列,轴=-1)
x_列=np。重复(x_列,3,轴=-1)
x_-train=x_-train.astype('float32')/255
#准备回归模型的标签
ytrain4=tf.square(tf.cast(train_-target,tf.float32))
#基本模型
inception=InceptionV3(weights='imagenet',include_top=False,input_shape=(75,75,3))
inception.trainable=False
#输入层
驱动输入=tf.keras.layers.input(形状=(28,28,3))
调整大小的_输入=tf.keras.layers.Lambda(Lambda图像:tf.image.resize(图像,(75,75)))(驱动_输入)
inp=初始值(调整大小的输入)
#顶级模特
x=全局平均池2D()(inp)
x=密集(512,激活='relu')(x)
x=密集(256,激活='relu')(x)
x=辍学率(0.25)(x)
x=密集(128,激活='relu')(x)
x=密集(64,激活='relu')(x)
x=辍学率(0.25)(x)
结果=密集(1,激活='线性')(x)
#超参数
lr_计划=tf.keras.optimizers.schedules.ExponentialDecay(初始学习率=0.0001,
衰减步数=100000,衰减率=0.95)
optimizer=tf.keras.optimizers.Adam(学习率=lr计划)
损失=tf.keras.loss.Huber(delta=0.5,reduce=“auto”,name=“Huber\u损失”)
#建立模型
模型=tf.keras.model(输入=驱动输入,输出=结果)
compile(优化器=优化器,损失=损失)
#回调
checkpoint=tf.keras.callbacks.ModelCheckpoint(filepath=“./ckpts/model.h5”,monitor='val\u loss',save\u best\u only=True)
stopper=tf.keras.callbacks.earlystoping(监视器=val_loss',最小增量=0.0003,耐心=10)
批量大小=32
纪元=10
#合身
模型拟合(x=x\u序列,y=ytrain4,shuffle=True,validation\u split=0.2,epochs=epochs,
batch\u size=batch\u size,verbose=1,回调=[checkpoint,stopper])
输出

1500/1500 [==============================] - 27s 18ms/step - loss: 5.2239 - val_loss: 3.6060
Epoch 2/10
1500/1500 [==============================] - 26s 17ms/step - loss: 3.5634 - val_loss: 2.9022
Epoch 3/10
1500/1500 [==============================] - 26s 17ms/step - loss: 3.0629 - val_loss: 2.5063
Epoch 4/10
1500/1500 [==============================] - 26s 17ms/step - loss: 2.7615 - val_loss: 2.3764
Epoch 5/10
1500/1500 [==============================] - 26s 17ms/step - loss: 2.5371 - val_loss: 2.1303
Epoch 6/10
1500/1500 [==============================] - 26s 17ms/step - loss: 2.3848 - val_loss: 2.1373
Epoch 7/10
1500/1500 [==============================] - 26s 17ms/step - loss: 2.2653 - val_loss: 1.9039
Epoch 8/10
1500/1500 [==============================] - 26s 17ms/step - loss: 2.1581 - val_loss: 1.9087
Epoch 9/10
1500/1500 [==============================] - 26s 17ms/step - loss: 2.0518 - val_loss: 1.7193
Epoch 10/10
1500/1500 [==============================] - 26s 17ms/step - loss: 1.9699 - val_loss: 1.8837


请注意,使用更大的NASNet(84M参数,与InceptionV3的22M参数相比)也可以观察到这种行为,再次使用冻结重量、排除顶部和少量增加的致密层进行训练。无法给出问题的精确解决方案,因为在损失没有减少的情况下,有许多因素是造成这种情况的原因。您可以尝试在InceptionV3/NASNet中解冻一些顶层,即设置
trainable=True
。这将允许预先训练的模型更好地概括提供给它的新数据。为什么最后一层激活是
relu
,而不是
linear
?另外,你的
lr
太高了。我想知道为什么这个问题会被一个基于意见的标签所关闭,而它却不一样。这不是一篇基于观点的文章。我试着把模型解开,正确的提示是在最后一层从relu变为线性。非常感谢你指出这一点。主要问题是从“relu”变为“线性”。感谢您提出了一个好的lr值。我是个新手。在这个问题之后,我被禁止在论坛上提问。我不知道为什么。我最近才试着问相关的问题,这听起来不公平。请联系版主,或者您可能会收到一些关于此的邮件。