相关疑难解决方法(0)

使用不同的损失函数恢复训练

我想实施一个两步学习过程,其中:

  1. 使用损失函数预训练几个时期的模型 loss_1
  2. 将损失函数更改为loss_2并继续训练以进行微调

目前,我的做法是:

model.compile(optimizer=opt, loss=loss_1, metrics=['accuracy'])
model.fit_generator(…)
model.compile(optimizer=opt, loss=loss_2, metrics=['accuracy'])
model.fit_generator(…)
Run Code Online (Sandbox Code Playgroud)

请注意,优化器保持不变,只有损失函数发生变化。我想顺利地继续训练,但损失函数不同。根据这篇文章,重新编译模型会失去优化器状态。问题:

a) 即使我使用相同的优化器,例如 Adam,我会丢失优化器状态吗?
b) 如果 a) 的答案是肯定的,关于如何在不重置优化器状态的情况下将损失函数更改为新函数的任何建议?

编辑:
根据 Simon Caby 的建议并基于此线程,我创建了一个自定义损失函数,其中包含两个依赖于纪元数的损失计算。但是,它对我不起作用。我的做法:

model.compile(optimizer=opt, loss=loss_1, metrics=['accuracy'])
model.fit_generator(…)
model.compile(optimizer=opt, loss=loss_2, metrics=['accuracy'])
model.fit_generator(…)
Run Code Online (Sandbox Code Playgroud)

初始化后,我编译如下current_epoch

def loss_wrapper(t_change, current_epoch):
    def custom_loss(y_true, y_pred):
       c_epoch = K.get_value(current_epoch)
       if c_epoch < t_change:
           # compute loss_1
       else:
           # compute loss_2
    return custom_loss
Run Code Online (Sandbox Code Playgroud)

为了更新current_epoch,我创建了以下回调:

current_epoch = K.variable(0.)
model.compile(optimizer=opt, loss=loss_wrapper(5, current_epoch), metrics=...)
Run Code Online (Sandbox Code Playgroud)

回调self.current_epoch正确更新每个时期。但是更新没有达到自定义损失函数。相反, …

keras loss-function

8
推荐指数
1
解决办法
1405
查看次数

保存并加载模型优化器状态

我有一套相当复杂的模型,我正在训练,我正在寻找一种方法来保存和加载模型优化器状态."训练模型"由几个其他"体重模型"的不同组合组成,其中一些具有共同的权重,一些具有取决于训练者的冻结权重等.分享的例子有点过于复杂,但简而言之,我无法使用model.save('model_file.h5'),keras.models.load_model('model_file.h5')停止和开始训练时.

model.load_weights('weight_file.h5')如果训练已经完成,使用可以很好地测试我的模型,但是如果我尝试使用这种方法继续训练模型,那么损失甚至不会回到最后位置.我已经读过这是因为没有使用这种方法保存优化器状态是有意义的.但是,我需要一种方法来保存和加载我的教练模型的优化器的状态.似乎keras曾经拥有过,model.optimizer.get_sate()而且model.optimizer.set_sate()这将完成我所追求的目标,但似乎不再是这种情况了(至少对于Adam优化器而言).当前的Keras还有其他解决方案吗?

python machine-learning keras tensorflow

6
推荐指数
2
解决办法
4406
查看次数

如何在训练期间替换损失函数 tensorflow.keras

我想在训练期间替换与我的神经网络相关的损失函数,这是网络:

model = tensorflow.keras.models.Sequential()
        model.add(tensorflow.keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=input_shape))
        model.add(tensorflow.keras.layers.Conv2D(64, (3, 3), activation="relu"))
        model.add(tensorflow.keras.layers.MaxPooling2D(pool_size=(2, 2)))
        model.add(tensorflow.keras.layers.Dropout(0.25))
        model.add(tensorflow.keras.layers.Flatten())
        model.add(tensorflow.keras.layers.Dense(128, activation="relu"))
        model.add(tensorflow.keras.layers.Dropout(0.5))
        model.add(tensorflow.keras.layers.Dense(output_classes, activation="softmax"))
        model.compile(loss=tensorflow.keras.losses.categorical_crossentropy, optimizer=tensorflow.keras.optimizers.Adam(0.001), metrics=['accuracy'])
        history = model.fit(x_train, y_train, batch_size=128, epochs=5, validation_data=(x_test, y_test))
Run Code Online (Sandbox Code Playgroud)

所以现在我想换tensorflow.keras.losses.categorical_crossentropy一个,所以我做了这个:

model.compile(loss=tensorflow.keras.losses.mse, optimizer=tensorflow.keras.optimizers.Adam(0.001), metrics=['accuracy'])
    history = model.fit(x_improve, y_improve, epochs=1, validation_data=(x_test, y_test)) #FIXME bug during training
Run Code Online (Sandbox Code Playgroud)

但我有这个错误:

ValueError: No gradients provided for any variable: ['conv2d/kernel:0', 'conv2d/bias:0', 'conv2d_1/kernel:0', 'conv2d_1/bias:0', 'dense/kernel:0', 'dense/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0'].
Run Code Online (Sandbox Code Playgroud)

为什么?我该如何解决?还有另一种改变损失函数的方法吗?

谢谢

python keras tensorflow loss-function

4
推荐指数
2
解决办法
2506
查看次数