PyTorch框架起步
PyTorch框架基本处理操作
part1:pytorch简介与安装
CPU版本安装:pip install torch1.3.0+cpu torchvision0.4.1+cpu -f https://download.pytorch.org/whl/torch_stable.html
GPU版本安装:pip install torch1.3.0 torchvision0.4.1 -f https://download.pytorch.org/whl/torch_stable (默认是CUDA10版本)
详情见Pytorch和英伟达官网搜索cuda
基本使用方法:
import torch
torch.__version__    # 查看版本相关
x = torch.rand(5, 3)
print(x)
# 初始化一个全零的矩阵
x = torch.zeros(5, 3, dtype=torch.long)
print(x)
# 直接传入数据
x = torch.tensor([5.5, 3])
# 展示矩阵大小
基本计算方法
y = torch.rand(5, 3)
print(x + y)    # x在前面
print(torch.add(x, y))    #一样的也是加法
# 索引
print(x[:, 1])
# view操作可以改变矩阵维度
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)    # -1的意思是,有8列,行补齐
print(x.size(), y.size(), z.size())
# 与Numpy的协同操作
a = torch.ones(5, dtype=torch.long)
print(a)
b = a.numpy()
print(b)
a = np.ones(5)
b = torch.from_numpy(a)
print(b)
part2:autograd机制
- 框架帮我们把返向传播全部计算好了
 
import torch
# 需要求导的,可以手动定义:
#方法1
x = torch.randn(3,4,requires_grad=True)
print(x)
#方法2
x = torch.randn(3,4)
x.requires_grad=True
print(x)
b = torch.randn(3,4,requires_grad=True)
t = x + b
y = t.sum()
print(y)
y.backward()
print(b.grad)
# 虽然没有指定t的requires_grad但是需要用到它,也会默认的
print(x.requires_grad, b.requires_grad, t.requires_grad)
举例说明:
#计算流程
x = torch.rand(1)
b = torch.rand(1, requires_grad = True)
w = torch.rand(1, requires_grad = True)
y = w * x
z = y + b
print(x.requires_grad, b.requires_grad, w.requires_grad, y.requires_grad)  #注意y也是需要的
print(x.is_leaf, w.is_leaf, b.is_leaf, y.is_leaf, z.is_leaf)    # 判断是不是叶子节点
# 反向传播计算
z.backward(retain_graph=True)    #如果不清空会累加起来
z.backward(retain_graph=True)    #如果不清空会累加起来
z.backward(retain_graph=True)    #如果不清空会累加起来
z.backward(retain_graph=True)    #如果不清空会累加起来
print(w.grad)
print(b.grad)
简单的线性回归模型
# 做一个线性回归
# 构造一组输入数据X和其对应的标签y
x_values = [i for i in range(11)]
x_train = np.array(x_values, dtype=np.float32)
x_train = x_train.reshape(-1, 1)
print(x_train)
print(x_train.shape)
y_values = [2*i + 1 for i in x_values]
y_train = np.array(y_values, dtype=np.float32)
y_train = y_train.reshape(-1, 1)
print(y_train)
print(y_train.shape)
# 线性回归模型
# 其实线性回归就是一个不加激活函数的全连接层
class LinearRegressionModel(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(input_dim, output_dim)    # 这个怎么定义改成自己的  输入和输出数据的维度
    def forward(self, x):
        out = self.linear(x)    # 前向传播怎么走,改成自己的  全连接层  {前向传播自己写,反向传播pytouch会自动计算}
        return out
input_dim = 1
output_dim = 1
model = LinearRegressionModel(input_dim, output_dim)
print(model)
# 指定好参数和损失函数
epochs = 1000    # 训练次数
learning_rate = 0.01    # 学习率
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)    # 优化器 这里选择SGD,优化参数和学习率
criterion = nn.MSELoss()    # 损失函数    预测值与真实值之间的均方误差
# 训练模型
for epoch in range(epochs):
    epoch += 1    # 每次epoch自加1,直到1000次结束
    # 注意转行成tensor    将np.array转换成tensor模式
    inputs = torch.from_numpy(x_train)
    labels = torch.from_numpy(y_train)
    # 梯度要清零每一次迭代    因为不清零梯度会累加的
    optimizer.zero_grad()
    # 前向传播
    outputs = model(inputs)
    # 计算损失
    loss = criterion(outputs, labels)
    # 返向传播
    loss.backward()
    # 更新权重参数    基于学习率和梯度值完成更新
    optimizer.step()
    if epoch % 50 == 0:    # 每隔50次打印一下loss值
        print('epoch {}, loss {}'.format(epoch, loss.item()))
# 测试模型预测结果:得出得结果转化成numpy, np.array的格式
predicted = model(torch.from_numpy(x_train).requires_grad_()).data.numpy()
print(predicted)
# 模型的保存与读取
# 保存
torch.save(model.state_dict(), 'model.pkl')    # 保存为字典格式,这里仅仅保存模型(即线性模型的权重和参数)
# 读取
print(model.load_state_dict(torch.load('model.pkl')))
若有GPU则用GPU加速
# 使用GPU进行训练
import torch
import torch.nn as nn
import numpy as np
class LinearRegressionModel(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(input_dim, output_dim)
    def forward(self, x):
        out = self.linear(x)
        return out
input_dim = 1
output_dim = 1
model = LinearRegressionModel(input_dim, output_dim)
# 如果GPU配置好了,将模型放入GPU中
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)
criterion = nn.MSELoss()
learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
epochs = 1000
for epoch in range(epochs):
    epoch += 1
    # 将输入和输出放进GPU中进行计算
    inputs = torch.from_numpy(x_train).to(device)
    labels = torch.from_numpy(y_train).to(device)
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()
    if epoch % 50 == 0:
        print('epoch {}, loss {}'.format(epoch, loss.item()))
part3:tensor常见的形式
- scalar
 - vector
 - matrix
 - n-dimensional tensor
 
import torch
from torch import tensor
# scalar:通常就是一个数值
# x = tensor(42.)
# print(x)
# print(x.dim())
# print(x * 2)
# print(x.item())
# vector:向量
# v = tensor([1.5, -0.5, 3.0])
# print(v)
# print(v.dim())    # 维度
# print(v.size())
# matrix:矩阵
M = tensor([[1., 2.], [3., 4.]])
print(M)
print(M.matmul(M))
print(tensor([1., 0.]).matmul(M))
print(M*M)
print(tensor([1., 2.]).matmul(M))
												
											PyTorch框架起步的更多相关文章
- PyTorch框架+Python 3面向对象编程学习笔记
		
一.CNN情感分类中的面向对象部分 sparse.py super(Embedding, self).__init__() 表示需要父类初始化,即要运行父类的_init_(),如果没有这个,则要自定义 ...
 - 手写数字识别 卷积神经网络 Pytorch框架实现
		
MNIST 手写数字识别 卷积神经网络 Pytorch框架 谨此纪念刚入门的我在卷积神经网络上面的摸爬滚打 说明 下面代码是使用pytorch来实现的LeNet,可以正常运行测试,自己添加了一些注释, ...
 - 小白学习之pytorch框架(1)-torch.nn.Module+squeeze(unsqueeze)
		
我学习pytorch框架不是从框架开始,从代码中看不懂的pytorch代码开始的 可能由于是小白的原因,个人不喜欢一些一下子粘贴老多行代码的博主或者一些弄了一堆概念,导致我更迷惑还增加了畏惧的情绪(个 ...
 - 全面解析Pytorch框架下模型存储,加载以及冻结
		
最近在做试验中遇到了一些深度网络模型加载以及存储的问题,因此整理了一份比较全面的在 PyTorch 框架下有关模型的问题.首先咱们先定义一个网络来进行后续的分析: 1.本文通用的网络模型 import ...
 - Pyinstaller打包Pytorch框架所遇到的问题
		
目录 前言 基本流程 一.安装Pyinstaller 和 测试Hello World 二.打包整个项目,在本机上调试生成exe 三.在新电脑上测试 参考资料 前言 第一次尝试用Pyinstalle ...
 - 小白学习之pytorch框架(4)-softmax回归(torch.gather()、torch.argmax()、torch.nn.CrossEntropyLoss())
		
学习pytorch路程之动手学深度学习-3.4-3.7 置信度.置信区间参考:https://cloud.tencent.com/developer/news/452418 本人感觉还是挺好理解的 交 ...
 - 小白学习之pytorch框架(2)-动手学深度学习(begin-random.shuffle()、torch.index_select()、nn.Module、nn.Sequential())
		
在这向大家推荐一本书-花书-动手学深度学习pytorch版,原书用的深度学习框架是MXNet,这个框架经过Gluon重新再封装,使用风格非常接近pytorch,但是由于pytorch越来越火,个人又比 ...
 - 从零打造在线网盘系统之Struts2框架起步
		
欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...
 - 从零打造在线网盘系统之Hibernate框架起步
		
欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...
 
随机推荐
- MEVN 架构(MongoDB + Express + Vue + NODEJS)搭建
			
一个完整的网站服务架构包括:1.web frame ---这里应用express框架2.web server ---这里应用nodejs3.Database ---这里应用monggoDB4.前端展示 ...
 - 【Android开发】简单好用的阴影库 ShadowLayout
			
先来看一张使用 ShadowLayout 库实现的各种阴影的效果图,如下图所示: 如上图所示,通过使用 ShadowLayout 可以控制阴影的颜色.范围.显示边界(上下左右四个边界).x 轴和 y ...
 - 帝国cms随机调用信息
			
我们知道,帝国cms随机调用标签是 [ecmsinfo]1,5,32,0,0,2,0,",'rand()'[/ecmsinfo] 但是这种调用方式在数据量特别大的时候严重影响生成速度,对于中 ...
 - 【LeetCode】76. 最小覆盖子串
			
76. 最小覆盖子串 知识点:字符串:滑动窗口 题目描述 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ...
 - 聊聊UI自动化的PageObject设计模式
			
当我们开发UI自动化测试用例时,需要引用页面中的元素(数据)才能够进行点击(动作)并显示出页面内容.如果我们开发的用例是直接对HTML元素进行操作,则这样的用例无法"应对"页面中U ...
 - Promise了解
			
Promise是一个构造函数,excutor是他的执行函数,同时也是构造函数的参数. new Promise(excutor) excutor有两个参数(resolve,reject) Promise ...
 - 国产化之 .NET Core 操作达梦数据库DM8的两种方式
			
背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等.考虑到这些基础产品对.NET的支持,最终选择了.NET Core ...
 - error: 'xxxxxx' does not have a commit checked out
			
今天完成了毕业设计的主要功能,想上传到Git上给朋友看一下.以前也没用过git,看了一下视频,现学现卖了就是. 在使用git add命令时提示error: 'xxxxxx' does not have ...
 - 人机验证reCAPTCHA v3使用完备说明
			
v2简介 相信大家都碰到过下面的展示的 人机验证界面: reCaptcha 是 Google 公司的验证码服务,方便快捷,改变了传统验证码需要输入n位失真字符的特点. reCaptcha 在使用的时候 ...
 - 观察者模式与Google Guava EventBus实现
			
概述 观察者模式又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种. 它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态变化时,会 ...