在训练步骤之后,是否可以直接更新图层/变量的权重?

时间:2019-07-26 23:35:07

标签: python tensorflow keras pytorch

有很多方法可以直接在训练之外获取和更新权重,但是我想要做的是在每个训练步骤之后,在梯度更新了特定变量或图层之后,我想将这些权重保存为文件,然后用全新的替换图层或可变权重。然后继续下一步训练(使用变量或图层中的新值进行前向传递,然后使用计算出的损耗/梯度进行后向传递)训练。

我曾经考虑过单独调用每个训练步骤,但是我想知道这是否在时间/内存上效率很低。

1 个答案:

答案 0 :(得分:2)

您可以尝试使用Callback来做到这一点。

定义所需的功能:

def afterBatch(batch, logs):
    model.save_weights('weights'+str(batch)) #maybe you want also a method to save the current epoch....

    #option 1
    model.layers[select_a_layer].set_weights(listOfNumpyWeights) #not sure this works

    #option 2
    K.set_value(model.layers[select_a_layer].kernel, newValueInNumpy) 
       #depending on the layer you have kernel, bias and maybe other weight names 
       #take a look at the source code of the layer you are changing the weights

使用LambdaCallback

from keras.callbacks import LambdaCallback

batchCallback = LambdaCallback(on_batch_end = aterBatch)
model.fit(x, y, callbacks = [batchCallback, ....])

每批之后都有重量更新(如果您每次都节省重量,这可能太多了)。您也可以尝试使用on_epoch_end代替on_batch_end