如何重用现有的神经网络来训练使用TensorFlow的新神经网络?

时间:2016-08-16 15:32:42

标签: neural-network tensorflow

我想通过重用现有神经网络(已经训练过的)的较低层来使用TensorFlow训练新的神经网络。我想删除现有网络的顶层并用新层替换它们,我还想锁定最低层以防止反向传播修改它们。这是一个简单的ascii艺术总结:

*Original model*           *New model*

Output Layer                Output Layer (new)
     |                          |
Hidden Layer 3             Hidden Layer 3 (copied)
     |             ==>          |
Hidden Layer 2             Hidden Layer 2 (copied+locked)
     |                          |
Hidden Layer 1             Hidden Layer 1 (copied+locked)
     |                          |
   Inputs                     Inputs

这样做的好方法是什么?

修改

我的原始网络是这样创建的:

X = tf.placeholder(tf.float32, shape=(None, 500), name="X")
y = tf.placeholder(tf.int64, shape=(None), name="y")

hidden1 = fully_connected(X, 300, scope="hidden1")
hidden2 = fully_connected(hidden1, 100, scope="hidden2")
hidden3 = fully_connected(hidden2, 50, scope="hidden3")
output = fully_connected(hidden3, 5, activation_fn=None, scope="output)

xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, y)
loss = tf.reduce_mean(xentropy, name="loss")
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
training_op = optimizer.minimize(loss)

init = tf.initialize_all_variables()
saver = tf.train.Saver()

# ... Train then save the network using the saver

加载此网络的代码是什么,锁定2个较低的隐藏层,并替换输出层?如果可能的话,能够为每个输入缓存顶部锁定层(hidden2)的输出会很棒,以加快训练。

额外详情

我查看了retrain.py和相应的How-To(一个非常有趣的读物)。代码基本上加载原始模型,然后计算每个输入的瓶颈层(即输出层之前的最后一个隐藏层)的输出。然后它创建一个全新的模型,并使用瓶颈输出作为输入进行训练。这基本上回答了我对复制+锁定图层的问题:我只需要在整个训练集上运行原始模型并存储最顶层锁定图层的输出。但我不知道如何处理复制但解锁(即可训练)的图层(例如我图中的隐藏图层3)。

谢谢!

1 个答案:

答案 0 :(得分:3)

TensorFlow为您在每个训练步骤中更新的参数集(Variable s)提供精细控制。例如,在您的模型中,假设图层都是完全连接的图层。然后,每个图层都有一个权重参数和偏差参数。假设您在VariableW1b1W2b2W3,{中有相应的b3个对象{1}}和Woutput。假设您正在使用Optimizer接口,并假设boutput是您要最小化的值,则只能通过执行以下操作训练隐藏和输出图层:

loss

注意opt = GradientDescentOptimizer(learning_rate=0.1) grads_and_vars = opt.compute_gradients(loss, var_list=[W3, b3, Woutput, boutput]) train_op = opt.apply_gradients(grads_and_vars) 执行上述操作,但我将其拆分为两个以说明详细信息。

opt.minimize(loss, var_list)计算与特定模型参数集相关的渐变,并且您可以完全控制您认为的模型参数。请注意,您必须从旧模型初始化隐藏第3层参数,并随机初始化输出图层参数。您可以通过从原始模型恢复新模型来执行此操作,该模型将复制原始模型中的所有参数,并添加额外的opt.compute_gradients操作以随机初始化输出图层参数。