我正在尝试将一个不可训练的Dense层包括在内,并将其初始化为一个单位矩阵,作为我的Tensorflow Estimator的一部分。直觉是该密集层在标准训练过程中以及随后的微调步骤中通过其输入。问题是,我不希望这些权重在最初的回合中完全更新,而只是在微调期间。
我可以做一些事情来使这些权重不可训练,包括在Dense构造函数中使用可训练参数,或者在传递给MomentumOptimizer.compute_gradients()之前过滤掉名称密集的任何东西。
但是在任何一种情况下(使密集型不可训练或只是不将其传递给优化器),tf都会抛出一个错误,指出无法找到与密集层相关的密钥。
我了解到,由于第一次运行时,密集是不可训练的,因此不会将其持久化在检查点文件中。同样,如果将其从传递给compute_gradients的过程中过滤掉,则会发生相同的问题。
是否有任何方法可以在运行过程中仅保留未经训练的变量,即使只有初始化值也是如此?
NotFoundError(请参阅上面的回溯):按键密集/内核/动量不大 在检查点中找到
答案 0 :(得分:0)
我将在这里回答我自己的问题,因为对于tf文档而言似乎并不清楚,这对我而言并不是立即显而易见的。如果您想引入一个新的可训练变量,那么从根本上讲,它将成为后面的模型。因此,为了处理现有权重的微调,必须从热启动设置中解析新模型中的那些现有权重。
因此训练模型,当Estimator的模型函数运行时,有条件地不包括微调层。训练现有模型,然后创建另一个单独的模型。从技术上讲,这仅意味着您需要使用新的模型目录,但是热启动设置应指向您事先训练的模型。
在微调运行中,您的模型函数应有条件地包括微调图层,但应从上一次运行中恢复权重,并设置热启动设置以查看先前的模型目录。