赞
踩
大家好,我们知道 Pytorch 是 torch 的 python 版本,是由 Facebook 开源的神经网络框架,专门针对 GPU 加速的深度神经网络(DNN)编程,相比于 Tensorflow,Pytorch 简介易用。Pytorch 有那些优点呢?
简洁:PyTorch 的设计追求最少的封装,尽量避免重复造轮子。PyTorch的源码只有TensorFlow的十分之一左右,更少的抽象、更直观的设计使得PyTorch的源码十分易于阅读。
速度:PyTorch 的灵活性不以速度为代价,在许多评测中,PyTorch 的速度表现胜过 TensorFlow和Keras 等框架。
易用:PyTorch 是所有的框架中面向对象设计的最优雅的一个。PyTorch的面向对象的接口设计来源于Torch,而Torch的接口设计以灵活易用而著称。
生态丰富:PyTorch 提供了完整的文档,循序渐进的指南,此外,相关社区还在逐渐壮大。
Tensors张量是一种特殊的数据结构,它和数组还有矩阵十分相似。在Pytorch中,Tensors可以在gpu或其他专用硬件上运行来加速计算之外,其他用法类似Numpy。
import torch
import numpy as np
#直接从数据创建
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
x_data.shape
#全为1
x_ones = torch.ones_like(x_data) # retains the properties of x_data
print(f"Ones Tensor: \n {x_ones} \n")
#全为0
x_rand = torch.rand_like(x_data, dtype=torch.float) # overrides the datatype of x_data
print(f"Random Tensor: \n {x_rand} \n")
#查看tensor类型
tensor = torch.rand(3, 4)
print(f"Shape of tensor: {tensor.shape}“)
print(f"Datatype of tensor: {tensor.dtype}”)
print(f"Device tensor is stored on: {tensor.device}")
在Pytorch中可以使用tensor进行计算,并最终可以从计算得到的tensor计算损失,并进行梯度信息。在Pytorch中主要关注正向传播的计算即可。
#x = torch.ones(2, 2, requires_grad=True)
x = torch.tensor([[1, 2], [3, 4]], dtype=float, requires_grad=True)
print(x)
y = x + 2
print(y)
print(y.grad_fn) # y就多了一个AddBackward
z = y * y * 3
out = z.mean()
print(z) # z多了MulBackward
print(out) # out多了MeanBackward
#计算公式:out = 0.25 ((x+2) * (x+2) * 3)
out.backward()
print(x.grad)
接下来我们将尝试使用Pytorch拟合一条曲线,我们首先的创建待你和的参数,并加载待训练的数据。
#需要计算得到的参数
w = torch.ones(1, requires_grad=True)
b = torch.ones(1, requires_grad=True)
#数据
x_tensor = torch.from_numpy(x)
y_tensor = torch.from_numpy(y)
#目标模型
#y = wx + b
定义损失
def mse(label, pred):
diff = label - pred
return torch.sqrt((diff ** 2).mean())
pred = x_tensor * w + b
loss = mse(y_tensor, pred)
#执行20次参数更新
for _ in range(20):
# 重新定义一下,梯度清空
w = w.clone().detach().requires_grad_(True)
b = b.clone().detach().requires_grad_(True)
# 正向传播
pred = x_tensor * w + b
# 计算损失
loss = mse(y_tensor, pred)
print(loss)
# 计算梯度
loss.backward()
torchvision是pytorch官方的用于视觉任务的库,这里我们加载最常见的MNST数据集。当然也可以自定义数据读取。
#torchvision 是pytorch官方的用于视觉任务的库
import torchvision.datasets as datasets # 内置的数据集读取
import torchvision.transforms as transforms # 内置的对图像的操作
from torch import nn
#组合多个数据变换
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
#图片的读取,(图片、类别)
#28 * 28,数字0、1、2、3、4、5、6、7、8、9
dataset1 = datasets.MNIST(‘./’, train=True, download=True)
dataset2 = datasets.MNIST(‘./’, train=False, download=True)
train_loader = torch.utils.data.DataLoader(dataset1, batch_size=40)
test_loader = torch.utils.data.DataLoader(dataset2, batch_size=40)
接下来我们定义网络结构,由于是图像分类任务,因此我们的节点维度使用逐步降低的定义。
net = nn.Sequential(
nn.Flatten(), # 将维度转换为二维
nn.Linear(784, 256), # 全连接层
nn.ReLU(), # 激活函数
nn.Linear(256, 10) # 全连接层
)
如果需要定义CNN网络,则可以参考如下的方式。先定义卷积层,然后定义全连接层。
import torch
from torch import nn
class Reshape(torch.nn.Module):
def forward(self, x):
return x.view(-1, 1, 28, 28)
net = torch.nn.Sequential(
Reshape(),
nn.Conv2d(1, 6, kernel_size=5, padding=2),
nn.ReLU(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5),
nn.ReLU(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Flatten(),
nn.Linear(16 * 5 * 5, 120),
nn.ReLU(),
nn.Linear(120, 84),
nn.ReLU(),
nn.Linear(84, 10)
)
定义训练时的超参数,如batch size、学习率和优化器。这里可以自定定义。
batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss()
updater = torch.optim.SGD(net.parameters(), lr=lr)
train_acc, test_acc = [], []
#epoch维度训练
for _ in range(num_epochs):
acc = 0
# 读取训练数据
# batch维度训练
for data in train_loader:
pred = net(data[0]) # 正向传播
pred_loss = loss(pred, data[1]) # 计算损失
updater.zero_grad() # 清空梯度
pred_loss.backward() # 梯度计算
updater.step() # 参数更新
# 累计准确样本个数
acc += (pred.argmax(1) == data[1]).sum()
# 计算准确率
acc = acc.float() / len(train_loader.dataset)
train_acc.append(acc)
# 读取验证数据
# batch维度预测
with torch.no_grad(): # 不记录梯度信息
acc = 0
for data in test_loader:
pred = net(data[0]) # 正向传播
pred_loss = loss(pred, data[1]) # 累计梯度
acc += (pred.argmax(1) == data[1]).sum() # 累计准确样本个数
# 计算准确率
acc = acc.float() / len(test_loader.dataset)
test_acc.append(acc)
print(train_acc[-1], test_acc[-1])
-END-
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习、自动化测试带你从零基础系统性的学好Python!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/360148?site
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。