如何在TensorFlow训练过程中修改自编码器的输出层?
嘿,针对你用TensorFlow实现自编码器时想在训练过程中修改输出层的需求,我给你分两种常见场景说具体做法,适配你代码里用的TensorFlow 1.x版本~
如何在训练过程中修改TensorFlow自编码器的输出层
1. 动态切换输出层结构(比如改神经元数量、激活函数)
TensorFlow 1.x是静态计算图,没法在训练循环里直接修改图结构,所以我们可以提前把所有可能用到的输出分支都定义好,再用一个占位符来控制训练时启用哪一个:
# 先假设你的解码器输出是decoder_out(根据你的自编码器结构调整) # 定义原来的自编码输出层(还原28x28图像) original_output = tf.layers.dense(decoder_out, 28*28, activation=tf.sigmoid, name='original_output') # 定义你想切换的另一种输出层,比如改成分类输出(MNIST 10类) classify_output = tf.layers.dense(decoder_out, 10, activation=tf.softmax, name='classify_output') # 用占位符做开关,选择当前用哪个输出层 output_switch = tf.placeholder(tf.int32, shape=(), name='output_switch') current_output = tf.cond(tf.equal(output_switch, 0), lambda: original_output, lambda: classify_output)
接下来要给不同的输出层定义对应的损失函数和训练操作:
# 自编码的损失(还原图像用MSE) recon_loss = tf.reduce_mean(tf.square(current_output - tf.reshape(inputs_, (-1, 28*28)))) train_recon_op = tf.train.AdamOptimizer(learning_rate).minimize(recon_loss) # 分类任务的损失(交叉熵) labels_ = tf.placeholder(tf.int32, (None,)) classify_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels_, logits=current_output)) train_classify_op = tf.train.AdamOptimizer(learning_rate).minimize(classify_loss)
然后在训练循环里,根据阶段切换开关就行:
with tf.Session() as sess: sess.run(tf.global_variables_initializer()) # 前1000步训练自编码,用还原输出层 for step in range(1000): batch_x, _ = mnist.train.next_batch(64) batch_x = batch_x.reshape((-1,28,28,1)) sess.run(train_recon_op, feed_dict={inputs_: batch_x, output_switch: 0}) # 1000步之后切换到分类输出层训练 for step in range(1000, 2000): batch_x, batch_y = mnist.train.next_batch(64) batch_x = batch_x.reshape((-1,28,28,1)) sess.run(train_classify_op, feed_dict={inputs_: batch_x, labels_: batch_y, output_switch: 1})
2. 调整输出层的参数(权重/偏置)
如果只是想修改输出层的权重、偏置值,不需要改动结构,直接在训练循环里通过会话给变量赋值就行:
# 获取输出层的权重和偏置变量(根据你定义的输出层name调整) output_weights = tf.get_default_graph().get_tensor_by_name('original_output/kernel:0') output_biases = tf.get_default_graph().get_tensor_by_name('original_output/bias:0') with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for step in range(500): # 正常训练自编码器 batch_x = mnist.train.next_batch(64)[0].reshape((-1,28,28,1)) sess.run(train_recon_op, feed_dict={inputs_: batch_x}) # 每100步修改一次输出层的偏置(比如用随机值更新) if step % 100 == 0: new_bias_values = np.random.randn(*output_biases.shape.as_list()) * 0.01 sess.run(output_biases.assign(new_bias_values))
这样就能在训练过程中动态调整输出层的参数了~
内容的提问来源于stack exchange,提问作者maedeh
相关产品推荐
相关产品推荐

