有很多方法可以直接在训练之外获取和更新权重,但是我想要做的是在每个训练步骤之后,在梯度更新了特定变量或图层之后,我想将这些权重保存为文件,然后用全新的替换图层或可变权重。然后继续下一步训练(使用变量或图层中的新值进行前向传递,然后使用计算出的损耗/梯度进行后向传递)训练。
我曾经考虑过单独调用每个训练步骤,但是我想知道这是否在时间/内存上效率很低。
答案 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
。