Tensor
1. 数据类型
类型 | 解释 |
---|---|
torch.IntTensor | |
torch.FloatTensor | |
torch.rand | 浮点型随机(0,1)区间均匀分布 |
torch.randn | 浮点,指定维度 N(0,1)分布) |
torch.range | 浮点,自定义起止范围(起,止,步长) |
torch.zeros | 浮点,维度指定,元素值为0 |
2.Tensor运算
符号 | 解释 |
---|---|
torch.abs | 取绝对值 |
torch.clamp | 截取上下范围(a, 上范围,下范围) |
torch.mul | 相乘(tensor,tensor)or (tensor, 标量) |
torch.mm | 矩阵乘法 |
torch.add | 求和(tensor+tensor, or tensor+标量) |
torch.div | 除法,(tensor,tensor)or (tensor, 标量) |
torch.pow | 指数,同前 |
torch.mv | 矩阵×向量 |
自动梯度:Tensor变量在前向传播中生成一张计算图,根据计算图和输出结果计算每个参数需要重新更新的梯度。并通过完成后向传播完成对参数的梯度更新。
3. A sample example
输入100个具有1000个特征的数据,经过隐藏层变成100个具有100个特征的数据,在经过输出层输出100×10的分类结果数据,并计算损失进行后向传播。
import torch
batch_n = 100 # 输入数据100
hidden_layer = 100 # 经过隐藏层后保留的特征数
input_data = 1000 # 输入数据的特征数
output_data = 10 # 输出数据
# 利用随机生成输入输出数据,以及权重数据
x = torch.randn(batch_n, input_data)
y = torch.randn(batch_n, output_data)
w1 = torch.randn(input_data, hidden_layer)
w2 = torch.randn(hidden_layer, output_data)
epoch_n = 10000 # 训练次数,完成对初始权重参数的优化调整
leaning_rate = 1e-6 # 优化中的学习速率
# 正式训练
for epoch in range(epoch_n):
h1 = x.mm(w1)
h1 = h1.clamp(min=0)
y_pred = h1.mm(w2) # 前向传播 X*W1*W2
loss = (y_pred - y).pow(2).sum()
print("Epoch:{}, Loss:{:.4f}".format(epoch, loss)) # 计算损失
# 对每个节点链式求导计算出参数的梯度
gray_y_pred = 2 * (y_pred - y)
gray_w2 = h1.t().mm(gray_y_pred) # W2的梯度 h1的转置*grad_y_pred
grad_h = gray_y_pred.clone()
grad_h = grad_h.mm(w2.t())
grad_h.clamp(min=0)
grad_w1 = x.t().mm(grad_h) # 计算W1的梯度 X转置*(grad_y_pred * W2的转置)
# 更新梯度
w1 -= leaning_rate * grad_w1
w2 -= leaning_rate * gray_w2
当然,在这个例子中,参数都是随机函数生成的并没有什么意义,但基本的神经网络流程则是这样。