问题:我有两个预训练模型,变量W1,b1和W2,b2保存为numpy数组。
我想将这两个预训练模型的混合设置为我的模型的变量,并且只在训练期间更新混合权重alpha1和alpha2 。
为此,我创建了两个变量alpha1和alpha2并加载 numpy 数组并创建混合节点:W_new, b_new。
我想用W_new和b_new替换计算图中的 W 和 b ,然后只训练alpha1和alpha2参数opt.minimize(loss, var_list= [alpha1, alpha2])
。
我不知道如何在计算图中替换 W_new 和 b_new 。我尝试分配tf.trainable_variables()[0] = W_new
,但这不起作用。
如果有人能给我一些线索,我将不胜感激。
注意 1:我不想为 W 和 b 赋值(这会使图形与alpha1和alpha2断开),我希望参数的混合成为图形的一部分。
注意 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)
在这里为此创建了一个单独的问题,因为由于不同的原因它可能对其他人有用。