自动求梯度 讨论区


#62

还是不work,会爆显存,从显卡占用来看似乎是前面计算的一些结果和load进显卡占用的显存没有释放.对于一些用不到的数据请问有办法手动释放吗?


#63

我的这个思路可能是太简单了,感觉应该是不行.有大佬能给我个思路吗,很急.


#64

def train_coder(net, train_iter, loss, num_epochs, batch_size,
params, lr, trainer):
for epoch in range(num_epochs):
train_l_sum, n = 0.0, 0
for X, y in train_iter:
with autograd.record():
y_hat,hidden = net(X,params)
l = loss(y_hat, y).sum()
l.backward()
if trainer is None:
d2l.sgd(params, lr, batch_size)
else:
trainer.step(batch_size)
train_l_sum += l.asscalar()
n += y.shape[0]
test_y_hat,test_hidden = net(X,params)
l_test= loss(test_y_hat, X).sum().asscalar()

    if epoch%10000 ==0:
        print('epoch %d,  train_loss %.4f, test_loss %.4f'
              % (epoch + 1, train_l_sum / n, l_test))
    with open('resultData/encoder_decoder_parmas.pkl','wb') as toNumpy:
        pickle.dump(params,toNumpy)
    with open('resultData/encoder_decoder_hidden.pkl','wb') as toEncoder:
        pickle.dump(hidden,toEncoder)

如果paramas load上一次的结果的话 就会报错
with open (‘resultData/encoder_decoder_parmas.pkl’,‘rb’) as readP:
params = pickle.load(readP)

MXNetError: [09:51:13] src/imperative/imperative.cc:293: Check failed: !AGInfo::IsNone(*i) Cannot differentiate node because it is not in a computational graph. You need to set is_recording to true or use autograd.record() to save computational graphs for backward. If you want to differentiate the same graph twice, you need to pass retain_graph=True to backward.

求大神解答


#65

y=nd.dot(w,x), w是一个矩阵,x是一个向量,根据公式 dy/dx 应该是 w 才对,可是为什么用autograd算出来的不是w呢?

Screenshot%20from%202019-03-26%2021-04-37

Screenshot%20from%202019-03-26%2021-05-12

代码和结果如下:
Screenshot%20from%202019-03-26%2021-03-48

Screenshot%20from%202019-03-26%2021-04-05

@astonzhang @szha ,谢谢!


#66

因为y是向量,所以是y.sum()对x求导,导数形状与x形状相同

详见
http://zh.d2l.ai/chapter_prerequisite/autograd.html


#68

image
为什么第二个输出的结果是
[[12. 12.] [28 28]]


#69

a = nd.random.normal(shape=(1))
a.attach_grad()
with autograd.record():
c = f(a)
c.backward()

多次运行这段代码,a.grad会越来越大,怎样重置呢


#70

我也是看不明白为啥 y = 2 * nd.dot(x.T, x)的梯度就是4x.


#71

那么文档中的z其实是u,y其实是z。dz/dy就是du/dz。


#72

您好,请问您现在知道了为什么梯度为4x了吗?我对这个问题也很迷惑


#73

举个简单例子:假设二维向量x = (x1,x2)T, 则y=2xTx的梯度根据梯度定义为:4[x1,x2]T, 即4x…另外附录中有关于梯度的演算,Del(xTx)=2x,


#74
from mxnet import nd, autograd
x = nd.arange(4)
x = x.reshape(4, 1)
x.attach_grad()
with autograd.record():
    x = 2*nd.dot(x.T, x)
x.backward()
assert (x.grad - 4 * x).norm().asscalar() == 0
x.grad


请问我照搬文档中的代码为啥报错了


#75

y=2x平方,导数当然为4x啊


#76

想请问一下为什么英文版的内容比中文版更详细?而且好像中文版有时候还省略了一些内容。
我是小白,但感觉英文版说的更简单易懂。。。
在翻译中文版的时候是有省略一部分内容这方面的考量吗?