我正在尝试加载MCnet model的预训练权重并恢复训练。此处提供的预训练模型使用参数K=4, T=7
进行训练。但是,我想要一个带有参数K=4,T=1
的模型。与其从头开始训练,不如从此预先训练的模型中加载权重。但是由于图形已更改,所以我无法加载预训练的模型。
InvalidArgumentError (see above for traceback): Restoring from checkpoint failed. This is most likely due to a mismatch between the current graph and the graph from the checkpoint. Please ensure that you have not altered the graph expected based on the checkpoint. Original error:
Assign requires shapes of both tensors to match. lhs shape= [5,5,15,64] rhs shape= [5,5,33,64]
[[node save/Assign_13 (defined at /media/nagabhushan/Data02/SNB/IISc/Research/04_Gaming_Video_Prediction/Workspace/VideoPrediction/Literature/01_MCnet/src/snb/mcnet.py:108) ]]
是否可以使用新图形加载预训练模型?
我尝试过的事情:
以前,我想将预训练模型从旧版本的tensorflow移植到新版本。我得到了this answer,这有助于我移植模型。这个想法是创建新图并从保存的图中加载新图中现有的变量。
with tf.Session() as sess:
_ = MCNET(image_size=[240, 320], batch_size=8, K=4, T=1, c_dim=3, checkpoint_dir=None, is_train=True)
tf.global_variables_initializer().run(session=sess)
ckpt_vars = tf.train.list_variables(model_path.as_posix())
ass_ops = []
for dst_var in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES):
for (ckpt_var, ckpt_shape) in ckpt_vars:
if dst_var.name.split(":")[0] == ckpt_var and dst_var.shape == ckpt_shape:
value = tf.train.load_variable(model_path.as_posix(), ckpt_var)
ass_ops.append(tf.assign(dst_var, value))
# Assign the variables
sess.run(ass_ops)
saver = tf.train.Saver()
saver.save(sess, save_path.as_posix())
我在这里尝试了同样的方法,并且成功了,这意味着我为K=4,T=1
获得了新的训练模型。但是我不确定它是否有效!我的意思是,权重有意义吗?这是正确的方法吗?
有关模型的信息:
MCnet是用于视频预测的模型,即给定K
个过去的帧,它可以预测接下来的T
个帧。
感谢您的帮助
答案 0 :(得分:4)
MCnet模型具有一个生成器和一个鉴别器。生成器基于LSTM,因此通过更改时间步长T
来加载权重没有问题。但是,正如他们所编码的那样,鉴别器是卷积的。为了在视频上应用卷积层,它们将帧合并为通道尺寸。使用K=4,T=7
,您可以通过11
个频道获得长度为3
的视频。当沿通道维度将它们串联时,您将获得一个具有33
个通道的图像。当他们定义鉴别符时,他们将鉴别符的第一层定义为具有33
个输入通道,因此权重具有相似的尺寸。但是对于K=4,T=1
,视频长度为5
,最终图像具有15
个通道,因此权重将为15个通道。这是您观察到的不匹配错误。要解决此问题,您只能从前15个频道中选择权重(我想不到的一种更好的方法)。下面的代码:
with tf.Session() as sess:
_ = MCNET(image_size=[240, 320], batch_size=8, K=4, T=1, c_dim=3, checkpoint_dir=None, is_train=True)
tf.global_variables_initializer().run(session=sess)
ckpt_vars = tf.train.list_variables(model_path.as_posix())
ass_ops = []
for dst_var in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES):
for (ckpt_var, ckpt_shape) in ckpt_vars:
if dst_var.name.split(":")[0] == ckpt_var:
if dst_var.shape == ckpt_shape:
value = tf.train.load_variable(model_path.as_posix(), ckpt_var)
ass_ops.append(tf.assign(dst_var, value))
else:
value = tf.train.load_variable(model_path.as_posix(), ckpt_var)
if dst_var.shape[2] <= value.shape[2]:
adjusted_value = value[:, :, :dst_var.shape[2]]
else:
adjusted_value = numpy.random.random(dst_var.shape)
adjusted_value[:, :, :value.shape[2], ...] = value
ass_ops.append(tf.assign(dst_var, adjusted_value))
# Assign the variables
sess.run(ass_ops)
saver = tf.train.Saver()
saver.save(sess, save_path.as_posix())