返回信息流楼主毕设用tensorflow做关于图像的,老师让在momentum算法上加参数矫正,就是m = m / (1 - u ** t),所以我就用tensorflow自己写了一个momentum算法以及其矫正算法(因为要两个算法比较嘛,两个算法都是自己写的感觉会比较好),但是非常奇怪,自己写的跑的特别慢,而且是越来越慢,我测了时间,问题出现在session.run(train_step)这一步,就是这一步越来越慢。实验室提供了一块titanX的gpu,跑官网的demo超级快,1分钟左右就可以跑完10多个epochs了,但是我自己的算法2个小时,也就1/3个epoch,这两天纠结这个问题,严重影响毕设的进度呀[ema1][ema1]
我的momentum的算法:
def momentum(loss, t, parameter_list):
opt = GradientDescentOptimizer(1e-3)
grads_and_vars = opt.compute_gradients(loss, parameter_list)
capped_grads_and_vars = []
for i in range(len(grads_and_vars)):
gradient = grads_and_vars[i][0]
variable = grads_and_vars[i][1]
if t != 0:
momentum = gradient + mu * last_momentum0[i]
capped_grads_and_vars.append((momentum, variable))
else:
momentum = gradient
capped_grads_and_vars.append((momentum, variable))
if t != 0:
for i in range(len(grads_and_vars)):
last_momentum0[i] = capped_grads_and_vars[i][0]
else:
for i in range(len(grads_and_vars)):
last_momentum0.append(capped_grads_and_vars[i][0])
return opt.apply_gradients(capped_grads_and_vars)
改进的momentum
def momentum_modified(loss, t, parameter_list):
opt = GradientDescentOptimizer(1e-3)
grads_and_vars = opt.compute_gradients(loss, parameter_list)
capped_grads_and_vars = []
for i in range(len(grads_and_vars)):
gradient = grads_and_vars[i][0]
variable = grads_and_vars[i][1]
if t != 0:
momentum = (gradient + mu * last_momentum1[i]) / (1 - mu ** t)
capped_grads_and_vars.append((momentum, variable))
else:
momentum = gradient
capped_grads_and_vars.append((momentum, variable))
if t != 0:
for i in range(len(grads_and_vars)):
last_momentum1[i] = capped_grads_and_vars[i][0]
else:
for i in range(len(grads_and_vars)):
last_momentum1.append(capped_grads_and_vars[i][0])
return opt.apply_gradients(capped_grads_and_vars)
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #23569同步于 2017/4/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖
求助tensorflow自定义梯度算法,跑的非常慢?
xuehuanran
2017/4/11镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
LZ你这样就每次都新建一个train_op,然后tf每次都要编译一次计算图了。。
【 在 xuehuanran 的大作中提到: 】
: 楼主毕设用tensorflow做关于图像的,老师让在momentum算法上加参数矫正,就是m = m / (1 - u ** t),所以我就用tensorflow自己写了一个momentum算法以及其矫正算法(因为要两个算法比较嘛,两个算法都是自己写的感觉会比较好),但是非常奇怪,自己写的跑的特别慢,而且是越来越慢,我测了时间,问题出现在session.run(train_step)这一步,就是这一步越来越慢。实验室提供了一块titanX的gpu,跑官网的demo超级快,1分钟左右就可以跑完10多个epochs了,但是我自己的算法2个小时,也就1/3个epoch,这两天纠结这个问题,严重影响毕设的进度呀
: 我的momentum的算法:
: def momentum(loss, t, parameter_list):
: ...................
我现在也觉得是这个问题....但是有的算法比如momentum需要用到上一步的梯度或者是迭代次数的 如何在循环外面一次定义好呢?tensorflow里momentum的源码看不太懂
【 在 LayneH 的大作中提到: 】
: LZ你这样就每次都新建一个train_op,然后tf每次都要编译一次计算图了。。
:
试一下`tf.train..exponential_decay()`,像下面这样应该可以:
```python
def momentum_modified(loss, mu):
t= tf.Variable(0, trainable=False)
exp_mu= tf.train.exponential_decay(mu, t, 1, mu)
adaptive_mu = mu / (1 - exp_mu)
opt = tf.train.MomentumOptimizer(learning_rate, adaptive_mu)
return opt.minimize(loss, global_step=t)
```
只要在第一次定义一个opt就行了
【 在 xuehuanran 的大作中提到: 】
: 我现在也觉得是这个问题....但是有的算法比如momentum需要用到上一步的梯度或者是迭代次数的 如何在循环外面一次定义好呢?tensorflow里momentum的源码看不太懂
: :
好的,我去试试,谢谢![ema11][ema11]
【 在 LayneH 的大作中提到: 】
: [md]
: 试一下`tf.train..exponential_decay()`,像下面这样应该可以:
: ```python
: ...................