为了方便讨论,简化了以下模型。
假设我的训练集中有大约40,000个512x512图像。我正在尝试实施预培训,我的计划如下:
1.训练一个神经网络(称其为net_1),该网络可以捕获256x256的图像,并将训练后的模型保存为tensorflow检查点文件格式。
net_1: input -> 3 conv2d -> maxpool2d -> 2 conv2d -> rmspool -> flatten -> dense
我们将此结构称为net_1_kernel:
net_1_kernel: 3 conv2d -> maxpool2d -> 3 conv2d
并将其余部分称为other_layers:
other_layers: rmspool -> flatten -> dense
因此,我们可以用以下形式表示net_1:
net_1: input -> net_1_kernel -> other_layers
2.在net_1的结构中插入几层,现在将其称为net_2。它看起来应该像这样:
net_2: input -> net_1_kernel -> maxpool2d -> 3 conv2d -> other_layers
net_2将采用512x512的图像作为输入。
训练net_2时,我想使用net_1的检查点文件中保存的权重和偏差来初始化net_2中的net_1_kernel部分。我怎样才能做到这一点?
我知道我可以加载检查点来预测测试数据。但是在那种情况下,它将加载所有内容(net_1_kernel和other_layers)。我想要的是仅加载net_1_kernel并将其用于net_2中的权重/偏差初始化。
我也知道我可以将检查点文件中的内容打印到txt,然后复制并粘贴以手动初始化权重和偏差。但是,这些权重和偏见有很多,这将是我的最后选择。
最佳答案
首先,可以使用以下代码检查所保存的ckpt文件中所有检查点的列表。
from tensorflow.python.tools import inspect_checkpoint as chkp
chkp.print_tensors_in_checkpoint_file(file_name="file.ckpt", tensor_name="xxx", all_tensors=False, all_tensor_names=True)
请记住,还原检查点文件时,它将还原检查点文件中的所有变量。如果必须保存和还原特定变量,可以按以下步骤进行:
列出要从
tf.trainable_variables()
保存的所有变量var = [v for v in tf.trainable_variables() if "net_1_kernel" in v.name]
saverAndRestore = tf.train.Saver(var)
现在,您可以轻松地将变量列表中的所有变量保存或恢复,如下所示:
saverAndRestore.save(sess_1,"net_1.ckpt")
这只会将列表var中的变量保存到net_1.ckpt。
saverAndRestore.restore(sess_1,"net_1.ckpt")
这只会从net_1.ckpt恢复列表var中的变量。
除了上面所述,您要做的就是命名/作用域变量,以便您可以轻松地执行上面的步骤1。
关于python - 如何在Tensorflow中实现预训练?如何部分使用检查点文件中保存的权重?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52289736/