更改张量流图并恢复训练

时间:2020-05-05 11:35:17

标签: python tensorflow

我正在尝试加载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个帧。

感谢您的帮助

1 个答案:

答案 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())