1

问题:我有两个预训练模型,变量W1,b1W2,b2保存为numpy数组。

我想将这两个预训练模型的混合设置为我的模型的变量,并且只在训练期间更新混合权重alpha1alpha2 。

为此,我创建了两个变量alpha1alpha2并加载 numpy 数组并创建混合节点:W_new, b_new

我想用W_newb_new替换计算图中的 W 和 b ,然后只训练alpha1alpha2参数opt.minimize(loss, var_list= [alpha1, alpha2])

我不知道如何在计算图中替换 W_new 和 b_new 。我尝试分配tf.trainable_variables()[0] = W_new,但这不起作用。

如果有人能给我一些线索,我将不胜感激。

注意 1:我不想为 W 和 b 赋值(这会使图形与alpha1alpha2断开),我希望参数的混合成为图形的一部分。

注意 2:您可能会说您可以使用新变量计算 y,但问题是,这里的代码只是一个简化的玩具示例。实际上,我有几个带有crf的bilstms而不是线性回归。所以我不能手动计算公式。我将不得不在图中替换这些变量。

import tensorflow as tf
import numpy as np
np.random.seed(7)
tf.set_random_seed(7)

#define a linear regression model with 10 params and 1 bias
with tf.variable_scope('main'):
    X = tf.placeholder(name='input', dtype=float)
    y_gold = tf.placeholder(name='output', dtype=float)
    W = tf.get_variable('W', shape=(10, 1))
    b = tf.get_variable('b', shape=(1,))
    y = tf.matmul(X, W) + b
    #loss = tf.losses.mean_squared_error(y_gold, y)


#numpy matrices saved from two different trained models with the exact same architecture
W1 = np.random.rand(10, 1)
W2 = np.random.rand(10, 1)
b1 = np.random.rand(1)
b2 = np.random.rand(1)

with tf.variable_scope('mixture'):
    alpha1 = tf.get_variable('alpha1', shape=(1,))
    alpha2 = tf.get_variable('alpha2', shape=(1,))

    W_new = alpha1 * W1 + alpha2 * W2
    b_new = alpha1 * b1 + alpha2 * b2

all_trainable_vars = tf.trainable_variables()
print(all_trainable_vars)


#replace the original W and b with the new mixture variables in the computation graph (**doesn't do what I want**)
all_trainable_vars[0] = W_new
all_trainable_vars[1] = b_new
#this doesn't work

#note that I could just do the computation for y using the new variables as y = tf.matmul(X, W_new) + b_new
#but the problem is this is just a toy example. In real world, my model has a big architecture with several
#bilstms whose variables I want to replace with these new ones.

#Now what I need is to replace W and b trainable parameters (items 0 and 1 in all_trainable vars)
#with W_new and b_new in the computation graph.

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    train_writer = tf.summary.FileWriter('./' + 'graph',
                                         sess.graph)
    #print(sess.run([W, b]))
    #give the model 3 samples and predict on them
    print(sess.run(y, feed_dict={X:np.random.rand(3, 10)}))

我为什么要这样做?

假设您有多个预训练模型(在不同的域中),但您无权访问它们的任何数据。

然后你有一点来自另一个领域的训练数据,它不会给你带来那么多性能,但是如果你可以与你没有的数据一起训练模型,你可以获得良好的性能。

假设数据以某种方式在训练模型中表示,我们希望通过学习混合系数,使用我们作为监督的少量标记数据来学习预训练模型的混合。

我们不想预训练任何参数,我们只想学习预训练模型的混合。什么是混合重量?我们需要从我们所拥有的小监督中学习到这一点。

更新1:

我意识到我可以在创建模型之前将模型的参数设置为:

model = Model(W_new, b_new)

但正如我所说,我的真实模型使用了几个tf.contrib.rnn.LSTMCell对象。所以我需要提供 LSTMCell 类和新变量,而不是让它创建自己的新变量。所以现在的问题是如何设置 LSTMCell 的变量而不是让它创建它们。我想我需要继承LSTMCell 类并进行更改。有什么简单的方法可以做到这一点,这是我现在的问题。也许我应该将此作为一个新问题提出。

我想做的事:

W = tf.get_variable(...)
b = tf.get_variable(...)
cell_fw = tf.contrib.rnn.LSTMCell(W, b,
                        state_is_tuple=True)

在这里为此创建了一个单独的问题,因为由于不同的原因它可能对其他人有用。

4

0 回答 0