Python 如何在Tensorflow中实施预培训?如何部分使用检查点文件中保存的权重?

Python 如何在Tensorflow中实施预培训?如何部分使用检查点文件中保存的权重?,python,tensorflow,transfer-learning,Python,Tensorflow,Transfer Learning,为了便于讨论,对以下模型进行了简化。 假设我的训练集中有大约40000个512x512图像。我正在尝试实施预培训,我的计划如下: 1.训练一个接收256x256图像的神经网络(称之为net_1),并将训练后的模型保存为tensorflow检查点文件格式 net_1: input -> 3 conv2d -> maxpool2d -> 2 conv2d -> rmspool -> flatten -> dense 我们将此结构称为net_1_内核: net_1

为了便于讨论,对以下模型进行了简化。

假设我的训练集中有大约40000个512x512图像。我正在尝试实施预培训,我的计划如下:

1.训练一个接收256x256图像的神经网络(称之为net_1),并将训练后的模型保存为tensorflow检查点文件格式

net_1: input -> 3 conv2d -> maxpool2d -> 2 conv2d -> rmspool -> flatten -> dense
我们将此结构称为net_1_内核:

net_1_kernel: 3 conv2d -> maxpool2d -> 3 conv2d
并将其余部分称为其他_层:

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_内核部分。我怎样才能做到这一点?

我知道我可以加载检查点来预测测试数据。但在这种情况下,它将加载所有内容(net_1_内核和其他_层)。我想要的是只加载net_1_内核,并将其用于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\u variables()保存的所有变量
  • var=[tf.trainable_variables()中的v代表v,如果v.name中的“net_1_kernel”]

    saverAndRestore=tf.train.Saver(var)

  • 现在,您可以轻松地保存或恢复var列表中的所有变量,如下所示:
  • saverAndRestore.save(sess_1,“net_1.ckpt”)

    这将仅将列表var中的变量保存到net_1.ckpt

    saverAndRestore.restore(sess_1,“net_1.ckpt”)

    这将仅从net_1.ckpt恢复列表变量中的变量


    除此之外,您所要做的就是命名/确定变量的范围,以便轻松执行上面的步骤1。

    谢谢您的回答。我想要的是将上面创建的“var”恢复到另一个网络(netu 2)中。你的意思是我可以将net_1.ckpt中的var恢复到net_2中,只要它们具有相同的变量名吗?是的,只要它们具有相同的名称/范围,就可以如上所示进行恢复。