Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >torch01:torch基础

torch01:torch基础

作者头像
MachineLP
发布于 2022-05-09 07:04:42
发布于 2022-05-09 07:04:42
36100
代码可运行
举报
文章被收录于专栏:小鹏的专栏小鹏的专栏
运行总次数:0
代码可运行

MachineLP的Github(欢迎follow):https://github.com/MachineLP

MachineLP的博客目录:小鹏的博客目录

本小节介绍torch的基础操作和流程:

(1)计算表达式的梯度值。

(2)数组与tensor。

(3)构建输入管道。

(4)加载预训练的模型。

(5)保存和加载权重。

代码部分:

(0)import

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding=utf-8
import torch
import torchvision
import torch.nn as nn
import numpy as np 
import torchvision.transforms as transforms

print (torch.__version__)

(1)计算梯度值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建tensor
x = torch.tensor(1, requires_grad=True)
w = torch.tensor(2, requires_grad=True)
b = torch.tensor(3, requires_grad=True)

# 构建模型, 建立计算图
y = w * x + b

# 计算梯度
y.backward()

# 输出计算后的梯度值
print ('x:grad', x.grad)
print ('w:grad', w.grad)
print ('b:grad', b.grad)

# 创建两个tensor
x = torch.randn(10, 3)
y = torch.randn(10, 2)

# 搭建全连接层
linear = nn.Linear(3,2)

# 打印模型权重值
print ('w', linear.weight)
print ('b', linear.bias)

# 构建你需要的损失函数和优化算法
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(linear.parameters(), lr=0.01)

# 前向计算
pred = linear(x)


# 计算loss
loss = criterion(pred, y)
print('loss: ', loss.item())

loss.backward()
# 打印输出梯度
print ('dL/dw: ', linear.weight.grad) 
print ('dL/db: ', linear.bias.grad)

# 梯度下降
optimizer.step()

# 梯度下降后,再打印权重值就会减小。
print ('w', linear.weight)
print ('b', linear.bias)


# 梯度下降后的预测值和loss
pred = linear(x)
loss = criterion(pred, y)
print('loss after 1 step optimization: ', loss.item())

(2)数组与tensor。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建数组, 转数组为tensor
x = np.array([[1, 2], [3, 4]])
y = torch.from_numpy(x)
# 转tensor为数组
z = y.numpy()

(3)构建输入管道。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 下载 CIFAR-10 数据
train_dataset = torchvision.datasets.CIFAR10(root='../../data/',
                                             train=True, 
                                             transform=transforms.ToTensor(),
                                             download=True)

# 样本和标签
image, label = train_dataset[0]
print (image.size())
print (label)

# 通过队列的形式加载数据
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                                           batch_size=64, 
                                           shuffle=True)

# 创建迭代器,为每次训练提供训练数据
data_iter = iter(train_loader)

# Mini-batch 样本和标签
images, labels = data_iter.next()

# 另外一种方式
for images, labels in train_loader:
    # 训练的代码
    pass
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 在你自己的数据上构建高效数据加载的方式
class CustomDataset(torch.utils.data.Dataset):
    def __init__(self):
        # TODO
        # 1. Initialize file paths or a list of file names. 
        pass
    def __getitem__(self, index):
        # TODO
        # 1. Read one data from file (e.g. using numpy.fromfile, PIL.Image.open).
        # 2. Preprocess the data (e.g. torchvision.Transform).
        # 3. Return a data pair (e.g. image and label).
        pass
    def __len__(self):
        # You should change 0 to the total size of your dataset.
        return 0 

# 
custom_dataset = CustomDataset()
train_loader = torch.utils.data.DataLoader(dataset=custom_dataset,
                                           batch_size=64, 
                                           shuffle=True)

(4)加载预训练的模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 下载和加载预训练的模型ResNet-18.
resnet = torchvision.models.resnet18(pretrained=True)

# 只进行fine-tune top层:
for param in resnet.parameters():
    param.requires_grad = False

# Replace the top layer for finetuning.
resnet.fc = nn.Linear(resnet.fc.in_features, 100)  # 100 is an example.

# Forward pass.
images = torch.randn(64, 3, 224, 224)
outputs = resnet(images)
print (outputs.size())     # (64, 100)

(5)保存和加载权重。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 保存和加载模型
torch.save(resnet, 'model.ckpt')
model = torch.load('model.ckpt')

# 只保存和加载模型参数
torch.save(resnet.state_dict(), 'params.ckpt')
resnet.load_state_dict(torch.load('params.ckpt'))

总结:

加餐:

在数据上进行加载数据:

其中,train.txt中的数据格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gender/0male/0(2).jpg 1
 gender/0male/0(3).jpeg 1
 gender/0male/0(1).jpg 0
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding = utf-8
import torch
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utils
import matplotlib.pyplot as plt
from PIL import Image


def default_loader(path):
    # 注意要保证每个batch的tensor大小时候一样的。
    return Image.open(path).convert('RGB')


class MyDataset(Dataset):
    def __init__(self, txt, transform=None, target_transform=None, loader=default_loader):
        fh = open(txt, 'r')
        imgs = []
        for line in fh:
            line = line.strip('\n')
            # line = line.rstrip()
            words = line.split(' ')
            imgs.append((words[0],int(words[1])))
        self.imgs = imgs
        self.transform = transform
        self.target_transform = target_transform
        self.loader = loader
    
    def __getitem__(self, index):
        fn, label = self.imgs[index]
        img = self.loader(fn)
        if self.transform is not None:
            img = self.transform(img)
        return img,label
    
    def __len__(self):
        return len(self.imgs)

def get_loader(dataset='train.txt', crop_size=178, image_size=128, batch_size=2, mode='train', num_workers=1):
    """Build and return a data loader."""
    transform = []
    if mode == 'train':
        transform.append(transforms.RandomHorizontalFlip())
    transform.append(transforms.CenterCrop(crop_size))
    transform.append(transforms.Resize(image_size))
    transform.append(transforms.ToTensor())
    transform.append(transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5)))
    transform = transforms.Compose(transform)
    train_data=MyDataset(txt=dataset, transform=transform)
    data_loader = DataLoader(dataset=train_data,
                                  batch_size=batch_size,
                                  shuffle=(mode=='train'),
                                  num_workers=num_workers)
    return data_loader
# 注意要保证每个batch的tensor大小时候一样的。
# data_loader = DataLoader(train_data, batch_size=2,shuffle=True)
data_loader = get_loader('train.txt')
print(len(data_loader))

def show_batch(imgs):
    grid = utils.make_grid(imgs)
    plt.imshow(grid.numpy().transpose((1, 2, 0)))
    plt.title('Batch from dataloader')


for i, (batch_x, batch_y) in enumerate(data_loader):
    if(i<4):
        print(i, batch_x.size(),batch_y.size())
        show_batch(batch_x)
        plt.axis('off')
        plt.show()

总结:

以上是torch的基础部分,总体的流程已经有了,上手就很快了。

参考:

(1)https://github.com/yunjey/pytorch-tutorial

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PyTorch 基础篇(1):Pytorch 基础
第一个是官网教程:WELCOME TO PYTORCH TUTORIALS,特别是官网的六十分钟入门教程 DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ。
Twcat_tree
2023/12/07
2540
torch04:全连接神经网络--MNIST识别和自己数据集
(2)定义训练数据,加餐部分是使用自己的数据集:(可参考:https://blog.csdn.net/u014365862/article/details/80506147)
MachineLP
2019/05/26
6070
50个超强的Pytorch操作 ! ! !
介绍: torch.floor() 用于将张量元素向下取整,得到不超过每个元素的最大整数。
JOYCE_Leo16
2024/03/22
3970
torch07:RNN--MNIST识别和自己数据集
版权声明:本文为博主原创文章,未经博主允许不得转载。有问题可以加微信:lp9628(注明CSDN)。 https://blog.csdn.net/u014365862/article/details/80547020
MachineLP
2019/05/26
1.2K0
torch02:logistic regression--MNIST识别
MachineLP的Github(欢迎follow):https://github.com/MachineLP
MachineLP
2022/05/09
2170
torch09:variational_autoencoder(VAE)--MNIST和自己数据集
版权声明:本文为博主原创文章,未经博主允许不得转载。有问题可以加微信:lp9628(注明CSDN)。 https://blog.csdn.net/u014365862/article/details/80615889
MachineLP
2019/05/26
1.5K0
torch05:CNN--MNIST识别和自己数据集
(2)定义训练数据,加餐部分是使用自己的数据集:(可参考:https://blog.csdn.net/u014365862/article/details/80506147)
MachineLP
2019/05/26
8990
「深度学习一遍过」必修17:基于Pytorch细粒度分类实战
本专栏用于记录关于深度学习的笔记,不光方便自己复习与查阅,同时也希望能给您解决一些关于深度学习的相关问题,并提供一些微不足道的人工神经网络模型设计思路。 专栏地址:「深度学习一遍过」必修篇 目录 1 实战内容简介 2 数据集读取 2.1 dataset 2.2 dataloader 3 模型搭建 3.1 基准模型 3.2 与基准模型相对应的双线性模型 4 性能差异比较 4.1 tensorboard查看测试集准确率差异 4.2 耗时比较(单位:秒) ---- 1 实战内容简介 数据集:CUB-200,共
荣仔_最靓的仔
2022/01/10
7240
「深度学习一遍过」必修17:基于Pytorch细粒度分类实战
小白学PyTorch | 8 实战之MNIST小试牛刀
在这个文章中,主要是来做一下MNIST手写数字集的分类任务。这是一个基础的、经典的分类任务。建议大家一定要跟着代码做一做,源码和数据已经上传到公众号。回复【pytorch】获取数据和源码哦~
机器学习炼丹术
2020/09/14
8020
小白学PyTorch | 8 实战之MNIST小试牛刀
Pytorch实现简单的数字识别(下)
但要注意loss的降低程度不能代表神经网络结构模型的好坏,应该将最终的正确率结果作为验证模型优劣的工具。
用户6719124
2019/11/18
7050
[完整案例]编程实现动物头像定位-02
然后我们重新计算几个坐标的位置,其实就是在对应的轴上的长度,然后再乘以我们的固定长度,也就是以下四行代码的含义,因为需要换成固定大小之后的相对位置
Tom2Code
2022/11/21
3590
[完整案例]编程实现动物头像定位-02
利用pytorch实现图像识别demo
2.准备数据集,并将其转换为适合PyTorch使用的格式(例如,利用 torchvision 库中的 transform 处理图像数据,并将其转换为 tensor)。
疯狂的KK
2023/03/26
1.1K0
【机器学习实战】从零开始深度学习(通过GPU服务器进行深度学习)
0.1. 利用GPU加速深度学习   疫情期间没有办法用实验室的电脑来跑模型,用领取的腾讯云实例来弄刚刚好。发现如果没有GPU来跑的话真的是太慢了,非常推荐利用GPU加速深度学习的训练速度。     如果采用GPU的话,训练函数train_model(*)中数据的输入要改变一下,也就是需要将数据放在GPU上
汉堡888
2022/05/03
8.7K0
【机器学习实战】从零开始深度学习(通过GPU服务器进行深度学习)
【猫狗数据集】划分验证集并边训练边验证
链接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw 提取码:2xq4
西西嘛呦
2020/08/26
1.2K0
【猫狗数据集】划分验证集并边训练边验证
PyTorch的简单实现
PyTorch 的关键数据结构是张量,即多维数组。其功能与 NumPy 的 ndarray 对象类似,如下我们可以使用 torch.Tensor() 创建张量。如果你需要一个兼容 NumPy 的表征,或者你想从现有的 NumPy 对象中创建一个 PyTorch 张量,那么就很简单了。
代码的路
2022/06/18
2K0
PyTorch的简单实现
【猫狗数据集】读取数据集的第二种方式
链接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw 提取码:2xq4
西西嘛呦
2020/08/26
6260
【猫狗数据集】读取数据集的第二种方式
PyTorch技术点整理
这里我们可以看到PyTorch更简洁,不需要那么多的接口API,更接近于Python编程本身。
算法之名
2022/03/24
7470
PyTorch技术点整理
pytorch demo 实践
相关环境 python opencv pytorch ubuntu 14.04 pytorch 基本内容 60分钟快速入门,参考:https://blog.csdn.net/u014630987/article/details/78669051 需要学习的内容包括 1、基本概念Tensors、Variable、Numpy等 2、如何搭建神经网络模型(包括卷积神经网络) 3、如何定义损失函数和优化器(包括不同分类器和优化器的含义) 4、如何训练(包括如何读取数据、如何在GPU上
张俊怡
2018/04/24
2.1K0
pytorch demo 实践
利用深度学习实现验证码识别-3-ResNet18
在当今数字化时代,验证码作为一种重要的安全验证手段,广泛应用于各种网络场景。然而,传统的验证码识别方法往往效率低下,准确率不高。今天,我们将介绍一种基于 ResNet18 的验证码识别方法,它能够高效、准确地识别验证码,为网络安全提供有力保障。
井九
2024/10/12
1880
利用深度学习实现验证码识别-3-ResNet18
生成对抗网络(GANs)在AIGC中的应用
生成对抗网络(Generative Adversarial Networks, GANs)是近年来在人工智能生成内容(Artificial Intelligence Generated Content, AIGC)领域取得显著进展的重要技术。GANs通过两个神经网络——生成器(Generator)和判别器(Discriminator)——之间的对抗训练,实现了从噪声中生成高质量、逼真的图像和其他类型的内容。本文将深入探讨GANs在AIGC中的应用,并通过一个代码实例来展示其工作原理。
一键难忘
2024/06/19
4770
相关推荐
PyTorch 基础篇(1):Pytorch 基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验