慢慢学AI--tensor

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

  当然,在这个例子中,参数都是随机函数生成的并没有什么意义,但基本的神经网络流程则是这样。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章