文章目录

  • Pytorch是什么
  • Pytorch搭建神经网络
    • 数据准备
      • 预备知识
      • 构建data_iterator
      • 调用data_iterator
    • 模型准备
    • 模型训练
    • 模型评价
    • 模型存储和加载
    • 使用GPU训练神经网络
  • Pytorch和TensorFlow的区别

Pytorch是什么

PyTorch是一个开源的Python机器学习库,提供两个高级功能:

  1. 具有强大的GPU加速的张量计算(如NumPy)

Pytorch向numpy做了广泛兼容,很多numpy的函数接口在pytorch下同样适用,
因此在安装pytorch和numpy时要注意版本兼容。

  1. 包含自动求导系统的深度神经网络

Pytorch搭建神经网络

>>> import torch
>>> import numpy

数据准备

预备知识

tensor:张量,用于做矩阵的运算,十分适合在GPU上跑。
构建张量

>>> a = torch.tensor([[1,2,3],[4,5,6]],dtype=float)   # 创建一个指定元素的张量
>>> a.size()
torch.Size([2, 3])
>>> a
tensor([[1., 2., 3.],[4., 5., 6.]], dtype=torch.float64)

张量的size
实际中常用的数据主要包括以下几种类型:

  1. 标量数据
    1D张量,如数据集的标签y,形状为tensor([samples])
  2. 向量数据
    2D张量,形状为 [samples, features]
  3. 时间序列数据或序列数据
    3D张量,形状为 [samples, timesteps, features]
  4. 图像
    4D张量,形状为 [samples, height, width, channels] 或 [samples, channels, height, width]
  5. 视频
    5D张量,形状为 [samples, frames, height, width, channels)]或 [samples, frames, channels, height, width]

一些常用的张量构造函数

>>> b = torch.full((2,3),3.14) # 创建一个全为某一数值的张量,可以作为初始化矩阵
>>> b
tensor([[3.1400, 3.1400, 3.1400],[3.1400, 3.1400, 3.1400]])
>>> c = torch.empty(2,3) # 返回一个未初始化的指定形状的张量,每次的运行结果都不同
>>> c
tensor([[3.6893e+19, 2.1425e+00, 5.9824e-38],[1.7449e-39, 6.1124e-38, 1.4013e-45]])

张量运算

>>> #加法运算
>>> a+b
tensor([[4.1400, 5.1400, 6.1400],[7.1400, 8.1400, 9.1400]])>>> torch.add(a,b,out=c) # 将指定张量作为输出,若不指定直接返回该值
>>> c
tensor([[4.1400, 5.1400, 6.1400],[7.1400, 8.1400, 9.1400]])>>> a.add(b) #返回一个新的张量,原张量不变
>>> a
tensor([[1., 2., 3.],[4., 5., 6.]], dtype=torch.float64)>>> a.add_(b) # 张量操作加'_'后,原张量值改变
>>> a
tensor([[4.1400, 5.1400, 6.1400],[7.1400, 8.1400, 9.1400]], dtype=torch.float64)
# 乘法运算
>>> x = torch.rand(3,5)
>>> y = torch.rand(3,5)
>>> z = torch.rand(5,3)
>>> torch.mul(x,y) # 矩阵点乘
tensor([[0.5100, 0.2523, 0.3176, 0.7665, 0.7989],[0.3799, 0.0779, 0.1352, 0.5991, 0.0338],[0.0375, 0.1444, 0.6965, 0.0810, 0.1836]])
>>> torch.matmul(x,z) #矩阵叉乘
tensor([[0.9843, 2.0296, 1.3304],[0.7903, 1.4374, 1.1705],[1.0530, 1.9607, 0.9520]])
# 常用运算
>>> a = torch.tensor([[1,2,3],[4,5,6]])
>>> torch.max(a) # 所有张量元素最大值
tensor(6)
>>> torch.max(a,0) # 沿着第0维求最大值
torch.return_types.max(values=tensor([4, 5, 6]),indices=tensor([1, 1, 1]))
>>> torch.max(a,1) # 沿着第1维求最大值
torch.return_types.max(values=tensor([3, 6]),indices=tensor([2, 2]))
>>> # min,mean,sum,prod同理

numpy桥
numpy.array和torch.tensor可以互相转化

>>> a = np.ones(3)
>>> a
array([1., 1., 1.])
>>> aa = torch.from_numpy(a) # array转为tensor
>>> aa
tensor([1., 1., 1.], dtype=torch.float64)
>>> b = torch.ones(3)
>>> b
tensor([1., 1., 1.])
>>> bb = b.numpy() # tensor转为array
>>> bb
array([1., 1., 1.], dtype=float32)

构建data_iterator

x = torch.linspace(1, 10, 10)
y = torch.linspace(10, 1, 10)
# 把数据放在数据库中
torch_dataset = torch.utils.data.TensorDataset(x, y)
loader = torch.utils.data.DataLoader(# 从数据库中每次抽出batch size个样本dataset=torch_dataset,batch_size=5,shuffle=True,num_workers=2,
)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True)
# test_loader同理
test_loader = torch.utils.data.DataLoader(dataset=test_dataset,batch_size=batch_size,shuffle=False)

调用data_iterator

for epoch in range(3):for step, (batch_x, batch_y) in enumerate(loader):print("steop:{}, batch_x:{}, batch_y:{}".format(step, batch_x, batch_y))

模型准备

Module:一个神经网络的层次,可以直接调用全连接层,卷积层,等等神经网络。被自定义的神经网络类所继承。
自定义一个神经网络class通常包括两部分:__init__定义网络层,forward函数定义网络计算函数。

# Example 1
import torch
import torch.nn as nn
import torch.nn.functional as Fclass Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.pool  = nn.MaxPool2d(2,2)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1   = nn.Linear(16*5*5, 120)self.fc2   = nn.Linear(120, 84)self.fc3   = nn.Linear(84, 10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 16*5*5)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xNetModel = Net()
# Example 2
class DynamicNet(torch.nn.Module):def __init__(self, D_in, H, D_out):super(DynamicNet, self).__init__()self.input_linear = torch.nn.Linear(D_in, H)self.middle_linear = torch.nn.Linear(H, H)self.output_linear = torch.nn.Linear(H, D_out)def forward(self, x):h_relu = self.input_linear(x).clamp(min=0)for _ in range(random.randint(0, 3)):h_relu = self.middle_linear(h_relu).clamp(min=0)y_pred = self.output_linear(h_relu)return y_predDynamicModel = DynamicNet(D_in, H, D_out)

模型训练

模型训练的主题代码由2层循环、2个定义和5句函数组成:

# 两个定义:
optimizer =
criterion =
# 两层循环:
for epoch in num_epochs:for input in batch_iters:# 5句函数outputs = model(input)model.zero_grad()loss = criterion(outputs, labels)loss.backward()optimizer.step()
# Example 1
# 定义代价函数和优化器
import torch.optim as optim
criterion = nn.CrossEntropyLoss() # use a Classification Cross-Entropy loss
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# 训练 epoch × batches_per_epoch 轮
for epoch in range(2): running_loss = 0.0# 遍历trainloader时每次返回一个batchfor i, data in enumerate(trainloader, 0):inputs, labels = data# wrap them in Variableinputs, labels = Variable(inputs), Variable(labels)# zero the parameter gradientsoptimizer.zero_grad()# forward + backward + optimizeoutputs = net(inputs)loss = criterion(outputs, labels)loss.backward()        optimizer.step()running_loss += loss.data[0]# print statisticsif i % 2000 == 1999: print('[%d, %5d] loss: %.3f' % (epoch+1, i+1, running_loss / 2000))running_loss = 0.0
# Example 2 简化版
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4, momentum=0.9)for t in range(500):y_pred = model(x)loss = criterion(y_pred, y)print(t, loss.item())# 清零梯度,反向传播,更新权重 optimizer.zero_grad()loss.backward()optimizer.step()
# Example3optimizer = torch.optim.Adam(model.parameters(), lr=config.learning_rate)model.train()for epoch in range(config.num_epochs):print('Epoch [{}/{}]'.format(epoch + 1, config.num_epochs))for i, (trains, labels) in enumerate(train_iter):outputs = model(trains)model.zero_grad()loss = F.cross_entropy(outputs, labels.squeeze(1))loss.backward()optimizer.step()

模型评价

一个循环+2句计算+n个评价函数:

# 一个循环:test_iters
for texts, labels in test_iter:# 2句计算:outputs = model(inputs)outputs = net(Variable(images))_, predicts = torch.max(outputs.data, 1)
# n个评价函数:用labels和predicts计算metrcs库的各种评价指标
# Example1
correct = 0
total = 0
# 一个循环:test_iters
for data in testloader:images, labels = data# 2句计算:outputs = model(inputs)outputs = net(Variable(images))_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum()
print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))
# Example 2
from sklearn import metrics
model.load_state_dict(torch.load(config.save_path))
model.eval()
loss_total = 0
predict_all = np.array([], dtype=int)
labels_all = np.array([], dtype=int)
with torch.no_grad():# 不自动求导,节约内存for texts, labels in data_iter:outputs = model(texts)predic = torch.max(outputs.data, 1)[1].cpu().numpy()loss = F.cross_entropy(outputs, labels.squeeze(1))loss_total += losslabels = labels.data.cpu().numpy()labels_all = np.append(labels_all, labels)predict_all = np.append(predict_all, predic)acc = metrics.accuracy_score(labels_all, predict_all)
report = metrics.classification_report(labels_all, predict_all,
confusion = metrics.confusion_matrix(labels_all, predict_all)
print (acc, loss_total / len(data_iter), report, confusion)

模型存储和加载

torch.save(model,'model.pt')
model1 = torch.load('model.pt)

使用GPU训练神经网络

# 使用GPU训练时,需要将model和tensor转至指定device
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = BertClassifier(config.bert_path)
model = model.to(device)
tensor = torch.tensor(x_train).to(torch.float32)
tensor = tensor.to(device)

Pytorch和TensorFlow的区别

  1. Pytorch构建动态计算图,TensorFlow构建静态计算图,因此pytorch更为灵活一些;

计算图示例

  1. TensorFlow在GPU上的计算性能更高一些,在CPU上二者类似。

从零开始的pytorch小白使用指北相关推荐

  1. Pytorch ——基础指北_肆 [构建数据集与操作数据集]

    Pytorch --基础指北_肆 系列文章目录 Pytorch --基础指北_零 Pytorch --基础指北_壹 Pytorch --基础指北_贰 Pytorch --基础指北_叁 文章目录 Pyt ...

  2. Pytorch ——基础指北_叁 [Pytorch API 构建基础模型]

    Pytorch --基础指北_叁 系列文章目录 Pytorch --基础指北_零 Pytorch --基础指北_壹 Pytorch --基础指北_贰 Pytorch --基础指北_叁 文章目录 Pyt ...

  3. Laravel 集成 JPush 极光推送指北

    2019独角兽企业重金招聘Python工程师标准>>> 我是一个 Laravel 小白,我是一个 Laravel 小白,我是一个 Laravel 小白(默念三遍再往下读,如果非小白就 ...

  4. php集成jpush教程,Laravel 集成 JPush 极光推送指北

    我是一个 Laravel 小白,我是一个 Laravel 小白,我是一个 Laravel 小白(默念三遍再往下读,如果非小白就不用看了). Laravel 使用 Composer 来管理代码依赖.所以 ...

  5. Caffe环境搭建指北

    <Caffe环境搭建指北>   caffe的全称是Convolutional Architecture for Fast Feature Embedding,是一个清晰高效的深度学习开源框 ...

  6. 新司机的黑裙战斗机 篇四:新司机的黑群晖指北—软件篇(下)

    原文网址:https://post.smzdm.com/p/awxl3d44/ 各位剁友好,我是身在长沙的一只小剁,因为ID的缘故长沙剁友赐雅号--姐夫 本文是我的首个系列<新司机的黑裙战斗机& ...

  7. 新司机的黑裙战斗机 篇二:入门—新司机的黑群晖指北——软件篇(上)

    原文网址:https://post.smzdm.com/p/alpkmoge/ 各位剁友好,我是身在长沙的一只小剁,因为ID的缘故长沙剁友赐雅号--姐夫 上一篇关于硬件配置和装机的晒单,引发了大量评论 ...

  8. 计算机系应届生求职指北

    最近帮了一个朋友的朋友做了下职业规划,结合之前在微博上的一些问答,觉得不少应届生同学对求职有蛮多误解的,所以这里分享下我的一点经验吧.虽然本文题为指北,但只是一个面向对行业.对业界技术不熟悉的同学的操 ...

  9. Python 简单入门指北(试读版)

    本文是我小专栏中 Python 简单入门指北 一文的前半部分,如果你能坚持读完并且觉得有一定收获,建议阅读原文,只需一杯咖啡钱就可以阅读更精彩的部分,也可以订阅小专栏或者加入我的知识星球,价格都是 6 ...

最新文章

  1. ASP.NET页面刷新的几种实现方法
  2. dll可以在linux下使用吗_无需虚拟技术,6步直接在Windows下使用Linux
  3. 软件开发报价的计算方法[转载]
  4. C++编译之提示ld: can‘t open output file for writing: test1, errno=21 for architecture x86_64
  5. 每日一题(35)—— heap与stack的差别
  6. discuz x2.5用户注册后邮箱认证后无法收到邮件或者直接进垃圾箱
  7. #openssl #爆重大漏洞heartbleed,危及两亿网民!!!
  8. MySQL中的mysqldump命令使用详解
  9. paip.环境配置整合 ibatis mybatis proxool
  10. java连接微信服务器调用微信接口
  11. Windows 7 安装Docker实践(2021.6.21)
  12. 春节假期 最强抢票攻略
  13. 最常用到的35种心理效应集锦
  14. 基于python的批量网页爬虫
  15. 什么是过拟合、欠拟合现象以及如何缓解?
  16. 因子分析法(Factor Analysis Method) 【转】
  17. WIM文件怎么安装系统Win10
  18. 穷游女生说:在川藏线上搭车,可以看清男人的本质
  19. Android开发人员的代码速查字典
  20. 本杰明•富兰克林效应

热门文章

  1. 诗情画意的dom创建类
  2. 中级数据库和系统集成哪个好考?
  3. 用机智云和ShineBlink打造智能语音控制版宠物屋
  4. 用Python入门知识点,打印自己的宠物小精灵,圆你的驯兽师梦
  5. 游戏设计小议 番外篇一 电脑游戏的通用层次结构
  6. 奔三的尴尬年纪,你要知道的44件事
  7. vue脚手架安装以及vue脚手架创建项目(详细步骤)
  8. 中国移动联招商局进军大数据征信
  9. Android高仿iOS Messages录音操作按钮
  10. 【javaScript面试题】2023前端最新版javaScript模块,高频24问