python - 我如何只训练新的重量?
问题描述
考虑一个 10 个单元的(密集)层。我现在想在这一层添加另一个(单个)单元。但是我如何确保之前的 10 个权重没有被训练,而只有新的权重被训练呢?
解决方案
您可以将变量列表传递给不同的优化器。一个用于训练前 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)
小心代码没有经过测试。
推荐阅读
- angular - 单击覆盖关闭弹出窗口 - 错误类型错误:无法读取未定义的属性“nativeElement”
- python-3.x - 如何访问函数外的函数变量
- reactjs - Redux 没有将状态传递给 reducer
- validation - 如何使用 SPARQL 验证 RDF 文字?
- amazon-web-services - 超过 DAX Dynamodb 上下文最后期限
- android - 用于互联网连接的 Delphi XE7 Android FMX 线程
- javascript - 使用国际电话输入库的自动国家/地区不起作用
- odoo - Oddo Button 返回供应商账单而不是客户发票
- javascript - 单击提交 ReactJS 时页面刷新
- python - 将可执行字节流可视化为图像文件,为什么要旋转 45 度?