网站公司架构,在线生成网站地图,东莞网站建设招聘,网站建设国外拂去其import torch
import torchvision
import numpy as np
import syssys.path.append(路径)
import d2lzh_pytorch as d2l
1. 获取和读取数据
2. 初始化参数和模型
3. 定义softmax运算
4. 定义模型
5. 定义损失函数#xff1a;交叉熵损失函数
6. 定义分类准确率
7. 训…import torch
import torchvision
import numpy as np
import syssys.path.append(路径)
import d2lzh_pytorch as d2l
1. 获取和读取数据
2. 初始化参数和模型
3. 定义softmax运算
4. 定义模型
5. 定义损失函数交叉熵损失函数
6. 定义分类准确率
7. 训练模型
8. 预测----------------- 分类计算中每个样本都要进行标签中类别数个预测来判断该样本属于那种分类的概率大-----------------------------------------------------------获取和读取数据batch_size 256
train_iter, test_iter d2l.load_data_fashion_mnist(batch_size)
----------------------------------------------------------初始化模型参数num_inputs 784 # 一个图像是28x28大小输入特征个数就是784个 w分10类一类也需要784个值b只需要10个分类偏置
num_outputs 10 # 分类个数
w torch.tensor(np.random.normal(0, 0.01, size(num_inputs, num_outputs)), dtypetorch.float, ) # 归一化生成w784x10
b torch.zeros(num_outputs, dtypetorch.float)
w.requires_grad_(requires_gradTrue)
b.requires_grad_(requires_gradTrue)
----------------------------------------------------------定义softmax运算# 如何对多维Tensor按维度进行操作
# 在以下的操作中和对其中同一列dim0或同一行dim1的元素进行求和并在结果中保留行和列这两个维度keepdimTrue
X torch.tensor([[1, 2, 3], [4, 5, 6]])
print(X.sum(dim0, keepdimTrue))
print(X.sum(dim1, keepdimTrue))def softmax(X): # 这里X不是样本而是经过线性运算之后的结果行数代表样本数列数代表种类数/输出个数X_exp X.exp() # 先对X中的每个元素幂指数化partition X_exp.sum(dim1, keepdimTrue) # 每一行进行幂指数求和得到分母return X_exp / partition # 这里运用了广播机制X torch.rand(2, 5)
result softmax(X)
print(result) # 经过softmax处理后得到了预测输出在每个类别上的预测概率分布
-------------------------------------------------------------------------定义模型
def net(X):return softmax(torch.mm(X.view(-1, num_inputs), w) b) # 这里是进行线性矢量计算可以是单个样本也可以是批量样本计算
------------------------------------------------------------------------定义损失函数交叉熵损失函数# 为了得到标签的预测概率可以使用gather函数下面y_hat是2个样本在3个类别的预测概率y是这2个样本的标签类别
# 通过使用gather函数可以得到2个样本的标签的预测概率。 在代码中标签类别的离散值是从0开始逐一递增的
y_hat torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
y torch.LongTensor([0, 2]) # 这是标签的类别
y_hat.gather(1, y.view(-1, 1)) # 应该根据y中标签类别确定y_hat中标签类别的对应位置然后取出这个类别的概率这里应该取出# y_hat中的 0,01,2位置处的值因为这里是和y中类别0,2所对应的概率位置def cross_entroy(y_hat, y):return -torch.log(y_hat.gather(1, y.view(-1, 1))) # 交叉熵只关心对正确类别的预测概率通过使用gather函数可以得到2个样本的标签的预测概率。tensor_0 torch.arange(3, 12).view(3, 3)
index torch.tensor([[2, 1, 0]]).t()
output tensor_0.gather(1, index)
print(output)
-------------------------------------------------------------------计算分类准确率
# y_hat是一个预测概率分布把分布中预测概率最大的作为输出类别如果与真实类别y一直则表示预测准确
# 分类预测率正确预测个数与总预测数量之比def accuracy(y_hat, y):return (y_hat.argmax(dim1) y).float().mean().item(), (y_hat.argmax(dim1) y).float()# y_hat.argmax(dim1)返回矩阵y_hat每行中最大的元素索引且返回结果与变量y形状相同# 上述判断式是一个类型为ByteTensor的Tensor使用float()将其转换为值为0相等为假或1相等为真的浮点型Tensorprint(accuracy(y_hat, y)) # 50%准确率第一个预测错误第二个预测正确
print(d2l.evaluate_accuracy(test_iter, net)) # 预测了mnist的test数据集softmax运算精度
-------------------------------------------------------------------------------------训练模型num_epochs, lr 5, 0.1
result d2l.train_ch3(net, train_iter, test_iter, cross_entroy, num_epochs, batch_size, [w, b], lr)
-------------------------------------------------------------------------------------预测X, y next(iter(test_iter)) # test_iter返回的是一个迭代器对象需要使用next()函数进行调用
true_labels d2l.get_fashion_mnist_labels(y.numpy()) # 获取了test数据集中的真实标签并进行转义
pred_labels d2l.get_fashion_mnist_labels(net(X).argmax(dim1).numpy()) # 将预测函数net返回的y_hat取其每行最大值的下标索引
titles [true \n pred for true, pred in zip(true_labels, pred_labels)] # 列表中使用for循环# 一次next()只访问了一个批量元组,X就是一个列表
d2l.show_fashion_mnist(X[0:9], titles[0:9])