python - Tensor 类中的梯度在哪里以及如何计算?
问题描述
我从书中复制了一个张量类,唯一我不知道的是如何在反向传播中计算权重梯度,我知道梯度是自动计算的(autograd),但我不能弄清楚如何。对我来说,梯度(假设最简单的网络的权重为 1_2,其中输入为 2 位数字,隐藏层是 1 个神经元,它采用由两个权重调节的 2 个值,输出层的答案是 1 或 0 (这是一个简单的例子))被认为如下:
grads_1_2 = layer1.T.dot(pred – target)
(layer1 - 隐藏层的输出)
weights _1_2 -= grads_1_2 * 0.1
,或权重 0_1 的梯度:
grads_0_1 = data.T.dot((pred – target).weights _1_2.T)
,但在 Tensor 类中,我没有看到如此明确的梯度计算。你能用下面的例子告诉我它们是如何计算的吗?
示例:
import numpy as np
np.random.seed(0)
data = Tensor(np.array([[1, 0]]), autograd=True)
target = Tensor(np.array(np.array([[0]])), autograd=True)
w = list()
print(np.random.rand(2,3))
w.append(Tensor(np.array([[0.54881351], [0.71518937]]), autograd=True))
w.append(Tensor(np.array([[0.43758721]]), autograd=True))
for i in range(10):
# Predict
layer1 = data.mm(w[0])
print('layer1', layer1)
pred = layer1.mm(w[1])
print('pred', pred)
# Compare
loss = (pred - target)
loss = loss.sum(0)
print('Loss', loss, '\n')
# Learn
loss.backward(Tensor(np.ones_like(loss.data)))
for w_ in w:
print('Grad_w', w_.grad.data[0])
w_.data -= w_.grad.data * 0.1
w_.grad.data *= 0
print('New weights', w)
break
解决方案
推荐阅读
- java - 读取 csv 文件 预订最多的房间
- python - Discord Python 重写 - 自定义服务器前缀错误
- javascript - 如何使用reactjs通过窗口对象将应用程序变量传递到控制台?
- python - jupyter notebook中python中的Spark连接器mongodb
- php - 加密:使用 vb.net 我得到与 php 不同的结果
- apache-flink - flink的CloseWith是什么意思
- amazon-web-services - 如何在 Centos 7 上为根用户安装 AWS CLI - /usr/local/bin 不在根用户的 PATH 中
- firebase - 我的应用需要记住点赞按钮的状态
- arm - 交叉编译字体配置以解决 imx25 故障
- android - 颤动的audio_service不播放音频