如何载入第三方词向量作为模型的参数进行训练并保存

本文介绍如何载入第三方词向量作为模型参数进行训练,并在训练后保存模型,以便后续继续训练或预测。通过示例代码分析了在Tensorflow中正确保存和恢复训练状态的方法。
摘要由CSDN通过智能技术生成

如何载入第三方词向量作为模型的参数进行训练并保存

目的:载入第三方词向量后接着训练微调,保存后能再次载入微调后的词向量训练或预测。

例如:初始时候a=1,载入后被用作参数训练成a=3并保存;再次载入保存的模型时a就应该是上次训练后的结果3,而不再是1。

示例1.

import numpy as np
import tensorflow as tf


load_embedding = np.array([[2, 3, 4, 5], [1, 2, 3, 4]], dtype=np.int32)
embedding = tf.Variable(tf.constant(0, shape=[2, 4]), name='temp',trainable=True)
embedding_op = tf.assign(embedding, load_embedding)
embedding = embedding+embedding
saver = tf.train.Saver()
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    check_point = tf.train.latest_checkpoint('./test')
    if check_point:
        saver.restore(sess, check_point)
        print(sess.run('temp:0'))
        print('Load successfuly!')
    else:
        sess.run(embedding_op)
        a = sess.run(embedding)
        print('训练后的结果:')
        print(a)
        saver.save(sess, './test/model', write_meta_graph=False)

P.S. 此处直接用了load_embedding这个numpy变量来表示第三方词向量矩阵,实际处理时不管用什么方法载入第三方词向量,只需要得到这么一个numpy类型的变量即可

load_embedding = np.array([[2, 3, 4, 5], [1, 2, 3, 4]], dtype=np.int32) 为需要被载入进行训练的一个词向量矩阵,embedding为用来接收load_embedding的张量,但此时embedding中的值并不是我们想要的;在第7行中,通过tf.assign操作后,载入的词向量就被分配到了张量embedding中;第8行代码我们对embedding这个变量进行了相应的运算用来模拟"训练“这以操作。 第13行到第18行代码的作用就是:如果存在已有模型,则直接载入已有模型并输出其值。

首先来理论分析一下结果:

第一次运行这段代码时,由于本地不存在保存的模型,所有不会执行15-18行部分的代码;同时,在经历过第13行代码后,embedding中的结果就应该和load_embedding的结果相同,在经历过第19行代码后,embedding 中的值,就应该是之前的两倍。

第二次运行这段代码时,由于第一次运行后已经保存了上次训练后的结果(也就是embedding这个可被用于训练变量的值),所有此时会先运行if部分的代码,然后再是后面部分;且if部分输出的结果应该是上次保存时的结果,也就是embedding 中的值,是load_embedding的两倍;而第21行输出的结果应该就应该是load_embedding的四倍。因为第16行恢复了上次的结果,而第19行又进行了加法操作。

分析完了理论值,我们来看看实际情况:

第一次运行的结果:

训练后的结果:
[[ 4  6  8 10]
 [ 2  4  6  8]]

同我们猜想中的一致,接下来再来看看第二次运行后的结果;

第二次运行的结果:

[[2 3 4 5]
 [1 2 3 4]]
Load successfuly!
训练后的结果:
[[ 4  6  8 10]
 [ 2  4  6  8]]

可以看到模型载入成功,但值却不对。第一次运行后embedding的值并没有得到保存,而保存的是tf.assign后的值。问题出在哪儿呢? 经过多番排查发现,原来像第8行这样的运算操作在Tensorflow看来并不称之为训练,所有这也是我在之前说模拟训练时,给训练两字加上引号的原因。在Tensorflow中,通过优化器(SGD,Adam等)计算后的结果可以称之为训练。所有,我们下面通过一个简单的线性回归,再来做一次实验。

P.S. 其实将第8行替换成 embedding =tf.assign_add(embedding,embedding)可以得到分析的结果,但是为了能更贴合实际,示例2更能说明问题

示例2.

def train_model():
    x_data = np.random.rand(100, 4).astype(np.float32)
    y_data = np.dot(x_data, [[1], [2], [1], [1]]) + 0.5

    x = tf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值