torch 用法:
1.1定义张量:torch.tensor
1.2定义参数,并初始化。随机初始化或者0初始化:
torch.randn([rows, cols], dtype = torch.float32, requires_grad = True)
#requires_grad = True 表示需要计算梯度以使用优化算法
1.3搭建模型,定义损失函数
1.4 读取数据,设置学习率和迭代次数
1.5 每步循环里,依次进行损失函数计算,梯度计算,变量更新,梯度置零操作
lr = 0.03
num_epochs = 5
for epoch in range(num_epochs):
for X,y in data_iter(batch_size, features, labels):
l = loss(net(X, w, b), y).sum()
l.backward()
sgd([w, b], lr, batch_size)
w.grad.data.zero_()
b.grad.data.zero_()
# 梯度置零是为了防止梯度累加
学到的一个点,是课后习题的。分享一下,也是需要注意的地方
tensor有1维和2维,在做运算时需要保持维度一致。在定义变量或者数据处理的时候,个人觉得还是要偏向于使用二维张量来运算。否则1维和2维之间可能会广播运算导致错误的结果。
详细代码就不贴了,这里贴一个我自己一开始不太会的地方,就是multi-class的acc实现
def evaluate_accuracy(data_iter, net):
acc_sum, n = 0.0, 0
for X, y in data_iter:
acc_sum += (net(X).argmax(dim=1) == y).float().sum().item()
n += y.shape[0]
return acc_sum/n
我看不明白是因为没有懂argmax方法是什么意思。它其实是返回一个维度上最大值的索引。
在此附上链接torch.tensor.argmax, 这篇文章解释的还蛮详细的。
哦还有一个是交叉熵的实现
def cross_entropy(y_hat, y):
return -torch.log(y_hat.gather(1, y.view(-1, 1)))
这里不太懂的是这个gather,为什么要这样。同样附上链接https://www.cnblogs.com/sdu20112013/p/12101172.html