假设我的网络定义如下:
image_input_1 = tf.layers.conv2d(name='image_input_1', inputs=self.batch_images, filters=30, kernel_size=[3, 3], strides=(2, 2), padding='same', activation=tf.nn.relu)
image_input_2 = tf.layers.conv2d(name='image_input_2', inputs=image_input_1, filters=50, kernel_size=[3, 3], strides=(2, 2), padding='same', activation=tf.nn.relu)
然后我训练该网络,并使用以下命令保存其参数:
self.saver = tf.train.Saver()
saver.save(sess, save_directory)
我现在想使用相同的网络架构,但是我想为image_input_1
层加载预先训练的权重和偏差(我不想为image_input_2
层执行此操作,因为这些将被随机初始化)。
我尝试了以下方法:
loader = tf.train.Saver(var_list=[image_input_1])
loader.restore(sess, tf.train.latest_checkpoint(save_directory))
但这给我一个错误:
TypeError: Variable to save is not a Variable: Tensor("image_input_1/Relu:0", shape=(?, 50, 38, 30), dtype=float32)
因此,看来我不能仅将var_list
作为参数传递给该层,因为这不是变量。相反,我需要在该层中传递实际变量。
因此,我尝试:
loader = tf.train.Saver(var_list=[image_input_1/kernel:0, image_input_1/bias:0])
loader.restore(sess, tf.train.latest_checkpoint(save_directory))
但这也给我一个错误:
SyntaxError: invalid syntax
因为image_input_1/kernel:0
和image_input_1/bias:0
实际上不是我的代码中定义的变量。
那我应该传递给var_list
呢?