PyTorch框架基本处理操作

part1:pytorch简介与安装

基本使用方法:

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常见的形式

  1. scalar
  2. vector
  3. matrix
  4. 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框架起步的更多相关文章

  1. PyTorch框架+Python 3面向对象编程学习笔记

    一.CNN情感分类中的面向对象部分 sparse.py super(Embedding, self).__init__() 表示需要父类初始化,即要运行父类的_init_(),如果没有这个,则要自定义 ...

  2. 手写数字识别 卷积神经网络 Pytorch框架实现

    MNIST 手写数字识别 卷积神经网络 Pytorch框架 谨此纪念刚入门的我在卷积神经网络上面的摸爬滚打 说明 下面代码是使用pytorch来实现的LeNet,可以正常运行测试,自己添加了一些注释, ...

  3. 小白学习之pytorch框架(1)-torch.nn.Module+squeeze(unsqueeze)

    我学习pytorch框架不是从框架开始,从代码中看不懂的pytorch代码开始的 可能由于是小白的原因,个人不喜欢一些一下子粘贴老多行代码的博主或者一些弄了一堆概念,导致我更迷惑还增加了畏惧的情绪(个 ...

  4. 全面解析Pytorch框架下模型存储,加载以及冻结

    最近在做试验中遇到了一些深度网络模型加载以及存储的问题,因此整理了一份比较全面的在 PyTorch 框架下有关模型的问题.首先咱们先定义一个网络来进行后续的分析: 1.本文通用的网络模型 import ...

  5. Pyinstaller打包Pytorch框架所遇到的问题

    目录 前言 基本流程 一.安装Pyinstaller 和 测试Hello World 二.打包整个项目,在本机上调试生成exe 三.在新电脑上测试 参考资料 前言   第一次尝试用Pyinstalle ...

  6. 小白学习之pytorch框架(4)-softmax回归(torch.gather()、torch.argmax()、torch.nn.CrossEntropyLoss())

    学习pytorch路程之动手学深度学习-3.4-3.7 置信度.置信区间参考:https://cloud.tencent.com/developer/news/452418 本人感觉还是挺好理解的 交 ...

  7. 小白学习之pytorch框架(2)-动手学深度学习(begin-random.shuffle()、torch.index_select()、nn.Module、nn.Sequential())

    在这向大家推荐一本书-花书-动手学深度学习pytorch版,原书用的深度学习框架是MXNet,这个框架经过Gluon重新再封装,使用风格非常接近pytorch,但是由于pytorch越来越火,个人又比 ...

  8. 从零打造在线网盘系统之Struts2框架起步

    欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...

  9. 从零打造在线网盘系统之Hibernate框架起步

    欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...

随机推荐

  1. mapreduce分区

    本次分区是采用项目垃圾分类的csv文件,按照小于4的分为一个文件,大于等于4的分为一个文件 源代码: PartitionMapper.java: package cn.idcast.partition ...

  2. java中抛出throw关键字是怎么用的? 举例?

    5.抛出throw关键字 马克-to-win:我们先说5/0的原理,当程序运行到5/0的时候,java系统JVM会在后台new出一个除0异常实例,之后把这个实例传入catch块儿供开发者使用.马克-t ...

  3. CSS样式写在JSP代码中的几种方法

    1.行内样式. 可以直接把css代码写在现有的HTML标签元素的开始标签里面,并且css样式代码要写在style=" "双引号中才可以, 如: <p style=" ...

  4. 进入React的世界

    一. React 是什么 1. 声明式写法 2. 组件化 3. 一次学习, 随处编写 二. 为什么要学习React 1. 大厂加持 - Facebook 2. 最流行, 使用人数最多, 最被开发者喜爱 ...

  5. 写入MySQL中文乱码问题

    相信使用数据库进行存储的大家都遇到过中文乱码问题,如何彻底解决?我百度了很多资料与博客,想把自己的经历总结起来给大家参考一下,接下来我先罗列一下大部分修改乱码问题的方法: 1.   修改MySQL数据 ...

  6. 接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理)

    接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理) 1.抽象类 以下说辞可能不太准确,但是会让你醍醐灌顶 抽象类是把一些具有共同属性(包括行为)的东西抽象出来,比如: 小狗有身高,体重,颜 ...

  7. 解决pycharm的爬虫乱码问题(初步了解各种编码格式)

    Ascii码(American Standard Code for Information Interchange,美国信息互换标准代码):最初计算机只在美国使用时,只用8位的字节来组合出256(2的 ...

  8. js 递归求1/2+1/4+1/6+....1/n的和,和1/1+1/3+1/5+.....+1/n的和

        function fun1(n) {         if (n == 2) {             return 1 / 2;         } if (n == 1) {       ...

  9. 把图片存储 canvas原生API转成base64

    1.LocalStorage有什么用? 2.LocalStorage的普通用法以及如何存储图片. 首先介绍下什么是LocalStorage 它是HTML5的一种最新储存技术.但它只能储存字符串.以前的 ...

  10. 2021.11.14 CF1583E Moment of Bloom(LCA+图上构造)

    2021.11.14 CF1583E Moment of Bloom(LCA+图上构造) https://www.luogu.com.cn/problem/CF1583E 题意: She does h ...