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

Min*_*ark 5 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
Run Code Online (Sandbox Code Playgroud)

这样做的好方法是什么?

编辑

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

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
Run Code Online (Sandbox Code Playgroud)

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

额外细节

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

谢谢!

kev*_*man 3

TensorFlow 为您提供对每个训练步骤中更新的参数集的细粒度控制Variable。例如,在您的模型中,假设这些层都是全连接层。然后,每层都会有一个权重参数和偏差参数。假设您在VariableW1b1W2b2W3b3中有相应的对象Woutputboutput假设您正在使用该Optimizer接口,并且假设这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)
Run Code Online (Sandbox Code Playgroud)

注意opt.minimize(loss, var_list)与上面的效果相同,但我将其分成两部分以说明细节。

opt.compute_gradients计算相对于特定模型参数集的梯度,并且您可以完全控制您所认为的模型参数。请注意,您必须随机初始化旧模型中的隐藏层 3 参数和输出层参数。您可以通过从原始模型恢复新模型来实现此目的,这将复制原始模型中的所有参数,并添加额外的tf.assign操作来随机初始化输出层参数。