首页 > 解决方案 > 我如何只训练新的重量?

问题描述

考虑一个 10 个单元的(密集)层。我现在想在这一层添加另一个(单个)单元。但是我如何确保之前的 10 个权重没有被训练,而只有新的权重被训练呢?

标签: pythontensorflowmachine-learningdeep-learning

解决方案


您可以将变量列表传递给不同的优化器。一个用于训练前 10 个单元,另一个用于与 a 一起训练另一个单元,tf.cond()因此当您只想使用 10 或 11 个神经元时,您可以在图中有两个分支。您也可以使用tf.stop_gradient()它,这取决于您的用例。

如果没有更多信息,很难回答,但大致如下:

import tensorflow as tf

choose_branch=tf.placeholder(tf.bool)
w_old=tf.Variable(np.random.normal(size=(1,10)).astype("float32"))
b=tf.Variable(np.zeros((1)).astype("float32"))
x=tf.placeholder(tf.float32,size=[None,1])
target=tf.placeholder(tf.float32,size=[None,1])

hidden_old=tf.nn.relu(tf.matmul(x,w_old)+b)

w_proj_old=tf.Variable(np.random.normal(size=(10,1)).astype("float32")

y_old=tf.matmul(hidden_old, w_proj_old)

cost_old=tf.reduce_mean(tf.square(y_old-target))

w_plus=tf.Variable(np.random.normal(size=(1,1)).astype("float32"))
w_proj_plus=tf.Variable(np.random.normal(size=(1,1)).astype("float32")

w_proj_new=tf.concat([w_proj_old,w_proj_plus],axis=1)

w_new=tf.concat([w_old,w_plus],axis=1)
hidden_new=tf.nn.relu(tf.matmul(x,w_new,axis=1))+b))

y_new=tf.matmul(hidden_new, w_proj_new)

cost_new=tf.reduce_mean(tf.square(y_new-target))

opt_old=tf.train.GradientDescentOptimizer(0.001)
opt_new=tf.train.GradientDescentOptimizer(0.0001)

train_step_old=opt_old.minimize(var_list=[w_old,b,w_proj_old,b])
train_step_new=opt_new.minimize(var_list=[w_plus,w_proj_plus])
y=tf.cond(choose_branch,lambda: y_old,lambda: y_new)

小心代码没有经过测试。


推荐阅读