对于pytorch和对应pytorch网站的探索

news2024/11/29 0:51:39

一、关于网站上面的那个教程:

适合PyTorch小白的官网教程:Learning PyTorch With Examples - 知乎 (zhihu.com)

这个链接也是一样的,

总的来说,里面讲了这么一件事:

如果没有pytorch的分装好的nn.module用来继承的话,需要设计一个神经网络就真的有很多需要处理的地方,明明可以用模板nn.module来继承得到自己的neural network的对象

然后,我们自己这个network里面设计我们想要实现的东西

[ Pytorch教程 ] 训练分类器 - pytorch中文网 (ptorch.com)

这个网站底部的链接还是有一些东西的

二、训练分类器中的代码-查漏补缺,加油!!

1.CIFAR-10中的图像大小为3x32x32,即尺寸为32x32像素的3通道彩色图像

2.torchvision.utils.make_grid()函数的参数意义和用法:

3.利用plt输出图像,必须是(h,w,channels)的顺序,所以从tensor过来需要permute或者transpose
def imshow(img): #定义这里的局部imshow
    img = img / 2 + 0.5     # unnormalize,还是要回去的好吧,img=(img-0.5)/0.5这是均值normlize
    npimg = img.numpy() #plt只能绘制numpy_array类型
    plt.imshow(np.transpose(npimg, (1, 2, 0))) #好像必须进行permute或者transpose得到(h,w,channels)
4.和f.max_pool2d是一个可以调用的函数对象,nn.MaxPool2d是一个模板,需要自己设置:

http://t.csdn.cn/mzqv7

5.torch.max(tensor,1)函数的用法:

http://t.csdn.cn/JMBwW

这篇文章讲得很好,

将每一行的最大值组成一个数组

二、代码研读+注释版:

#引入基本的库
import torch
import torchvision
import torchvision.transforms as transforms
#利用DataLoader获取train_loader和test_loader
transform = transforms.Compose( #定义ToTensor 和 3个channel上面的(0.5,0.5)正太分布
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

#获取trainset,需要经过transform处理
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, #设置train_loader参数:batch_size=4,shuffle
                                          shuffle=True, num_workers=2) #这个num_woekers子进程不知道会不会报错

#同样的处理获取test_loader
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)

#定义一个classes数组,其实是用来作为一个map映射使用的
classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
#展示一些图像,来点直观的感受
import matplotlib.pyplot as plt
import numpy as np

# functions to show an image

def imshow(img): #定义这里的局部imshow
    img = img / 2 + 0.5     # unnormalize,还是要回去的好吧,img=(img-0.5)/0.5这是均值normlize
    npimg = img.numpy() #plt只能绘制numpy_array类型
    plt.imshow(np.transpose(npimg, (1, 2, 0))) #好像必须进行permute或者transpose得到(h,w,channels)

# get some random training images
dataiter = iter(trainloader)     #dataiter就是迭代器了
images, labels = next(dataiter) #获取第一个images图像数据 和 labels标签 ,注意iter.next()已经改为了next(iter)

# show images
imshow(torchvision.utils.make_grid(images)) #以网格的方式显示图像
# print labels
print(' '.join('%5s' % classes[labels[j]] for j in range(4))) #输出labels1-4这样的标题
#定义neural network的结构
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5) #定义输入channel=3,输出channel=5,卷积核5*5,stride(default)=1,padding(default)=0
        self.pool = nn.MaxPool2d(2, 2)  #定义pooling池化,kernel_size=2*2,stride 右2,且下2
        self.conv2 = nn.Conv2d(6, 16, 5) #同上输出channel=16
        self.fc1 = nn.Linear(16 * 5 * 5, 120)  #下面定义了3个Linear函数
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x))) #conv1->relu->pooling
        x = self.pool(F.relu(self.conv2(x))) #conv2->relu->pooling
        x = x.view(-1, 16 * 5 * 5)           #调整为第二维数16*5*5的大小的tensor
        x = F.relu(self.fc1(x))              #fc1->relu
        x = F.relu(self.fc2(x))              #fc2->relu
        x = self.fc3(x)                      #output_linear->得到一个10维度的向量
        return x

net = Net() #创建一个net对象
#定义loss_func和optimizer优化器
import torch.optim as optim

criterion = nn.CrossEntropyLoss()  #分类的话,使用nn.CrossEntropyLoss()更好
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) #这里使用初级的SGD
#开始train多少个epoch了:
for epoch in range(2):  # 0-1总共2个epoch

    running_loss = 0.0  #记录loss数值
    for i, data in enumerate(trainloader, 0): #利用迭代器获取索引和此次batch数据,0代表从第0个索引的batch开始
        # get the inputs
        inputs, labels = data #获取inputs图像数据batch 和 labels标签batch

        # wrap them in Variable
        #inputs, labels = Variable(inputs), Variable(labels) ,在新版的pytorch中这一行代码已经不需要了

        # zero the parameter gradients
        optimizer.zero_grad() #每次进行backward方向传播计算gradient之前先调用optimizer.zero_grad()清空,防止积累

        # forward + backward + optimize ,标准操作:model + criterion + backward + step
        outputs = net(inputs) 
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics ,每2000个batch进行对应的输出
        #running_loss += loss.data[0]  #将这次batch计算的loss加到running_loss厚葬 ,新版的pytorch中tensor.data弃用
        #改用tensor.item()了
        running_loss = loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000)) #输出:第几个epoch,第几个batch,平均每个batch的loss
            running_loss = 0.0 #归零

print('Finished Training')
#展示第一批
dataiter = iter(testloader)
images, labels = next(dataiter) #获取一个batch(上面设置了batch_size=4)的images图像数据 和 labels标签

# print images
imshow(torchvision.utils.make_grid(images)) #通过网格形式
print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))
#使用上述的model对第一批进行预测
outputs = net(Variable(images))
#predicted = outputs.data.max(2,keepdim= True)[1] #这样就获得了一个数组
_, predicted = torch.max(outputs.data, 1)
#注意,classes是一个数组,不过是当作map映射使用的
for j in range(4):
    print(classes[predicted[j]])

 

#正式开始test了
correct = 0 #正确的数目
total = 0   #总共测试数目
for data in testloader:   #每次获取testloader中的1个batch
    images, labels = data
    outputs = net(Variable(images)) 
    _, predicted = torch.max(outputs.data, 1) #得到预测的结果数组
    total += labels.size(0)
    correct += (predicted == labels).sum()    #predicted数组和labels数组逐项比较

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total)) #输出正确率

 

#对这10种不同的物体对象的检测正确率进行分析:
class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
for data in testloader:
    images, labels = data
    outputs = net(Variable(images))
    _, predicted = torch.max(outputs.data, 1)
    c = (predicted == labels).squeeze() #c就是1个1维向量
    for i in range(4):               #一个batch有4张图
        label = labels[i]            #label就是0-9中那个类的index
        class_correct[label] += c[i] #如果c[i]==True就让class_correct+1
        class_total[label] += 1      #改类图的数目+1

for i in range(10): #输出每个类的正确率
    print('Accuracy of %5s : %2d %%' % (
        classes[i], 100 * class_correct[i] / class_total[i]))

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/992161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

营销邮件主题怎么写?编写邮件主题的技巧?

如何创建营销邮件主题?制作EDM邮件主题的方法策略? 营销邮件主题在整个营销邮件中起着至关重要的作用,它是吸引读者打开邮件的第一步。蜂邮EDM将分享一些关于如何撰写令人惊艳的营销邮件主题的技巧,帮助您吸引更多的目标受众。 …

OpenCV 08(图像滤波器 算子)

一、 索贝尔(sobel)算子 边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取,对象检测,模式识别等方面都有重要的作用。 人眼如何识别图像边缘? 比如有一幅图,图里面有一条线,左边很亮,右边很暗,那人眼就很容易…

【Spring面试】Spring事务(图文详解)

概念 一个事务包含两个及两个以上的步骤 Spring是没法提供事务的,Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。 事务…

Vuex仓库的创建

vuex 的使用 - 创建仓库 文章目录 vuex 的使用 - 创建仓库1.安装 vuex2.新建 store/index.js 专门存放 vuex3.创建仓库 store/index.js4 在 main.js 中导入挂载到 Vue 实例上5.测试打印Vuex 1.安装 vuex 安装vuex与vue-router类似,vuex是一个独立存在的插件&#x…

容器编排学习(三)端口映射与Harber镜像仓库介绍

一 对外发布服务(端口映射) 1 概述 新创建容器的IP 地址是随机的 容器在重启后每次 IP 都会发生变化 容器服务只有宿主机才能访问 如何才能使用容器对外提供稳定的服务? 容器端口可以与宿主机的端口进行映射绑定 从而把宿主机变成对应的服务&a…

Revit 几何体的三种上层应用:特征造型、体量和纯粹几何

排除掉墙梁板柱这些和建筑各专业相关的构件,Revit 的上层应用中,有三类和几何相关的应用,特征造型、体量和纯粹几何。这也是通常三维建模软件的几种基础建模组织形式。 特征造型 几何特征造型是一种设计方法,它强调使用几何学原理…

电子产品CE认证申请,CE-RED认证

CE认证,即只限于产品不危及人类、动物和货品的安全方面的基本安全要求,而不是一般质量要求,协调指令只规定主要要求,一般指令要求是标准的任务。 构成欧洲指令核心的"主要要求",在欧共体1985年5月7日的&…

亚马逊,速卖通,国际站卖家自己做测评补单有什么价值,怎么做?

对于卖家而言,测评资源确实是一项宝贵的财富。通过自养号和广告相结合的策略,可以快速有效地提升产品销量、增加转化率以及提高Listing的权重。这是一个很好的方法来优化产品在平台上的表现 现在很多卖家都选择自己养号下单,自己做测评 1.可…

【AI】机器学习——线性模型(逻辑斯蒂回归)

文章目录 3.3 逻辑斯蒂回归3.3.1 逻辑回归介绍对数几率函数sigmod函数几率 3.3.2 逻辑回归模型3.3.3 参数求解逻辑斯蒂回归策略 3.3.4 损失函数3.3.5 应用:语句情感判断3.3.6 多角度分析逻辑回归信息论角度数学角度与朴素贝叶斯对比 3.3.7 从二分类到多分类问题多次…

深度学习实战51-基于Stable Diffusion模型的图像生成原理详解与项目实战

大家好,我是微学AI,今天给大家介绍一下深度学习实战51-基于Stable Diffusion模型的图像生成原理详解与项目实战。大家知道现在各个平台发的漂亮小姐姐,漂亮的图片是怎么生成的吗?这些生成的底层原理就是用到了Stable Diffusion模型。Stable Diffusion是一种基于深度学习的图…

《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》全文翻译

《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 论文信息摘要1. 介绍2. 思维链提示3. 算术推理3.1 实验设置3.2 结果3.3 消融研究3.4 思想链的稳健性 4. 常识推理5. 符号…

花见Live Wallpaper Themes 4K Pro for mac(4k视频壁纸)

如果你希望让自己的Mac桌面焕发活力,那么Live Wallpaper & Themes 4K Pro正是一款值得尝试的软件。它提供了丰富的超高清4K动态壁纸和主题,可以让你轻松打造出个性化的桌面环境。 这款软件拥有众多令人惊叹的功能。其中最值得一提的是,它…

项目经验分享|openGauss 刘昱娴:对未知葆有好奇与坚持

开源之夏 项目经验分享 2023 #02 # 项目基本信息 项目名称:分页器组件封装 项目导师:王杏 项目简述与产出要求:分页器组件封装 1. 完成分页器组件封装;支持移动端和pc端 2. 适配Chrome、Safari、Firefox、Edge 等主流浏览器…

分类预测 | MATLAB实现PCA-BiLSTM(主成分双向长短期记忆神经网络)分类预测

分类预测 | MATLAB实现PCA-BiLSTM(主成分双向长短期记忆神经网络)分类预测 目录 分类预测 | MATLAB实现PCA-BiLSTM(主成分双向长短期记忆神经网络)分类预测预测效果基本介绍程序设计参考资料致谢 预测效果 基本介绍 分类预测 | MATLAB实现PCA-BiLSTM(主成分双向长短期记忆神经网…

系列三、Linux中安装Nginx

一、准备工作 1.1、确保gcc安装成功 如果没有安装gcc执行./configure将会报错。 # 使用如下指令安装gcc:两个都要安装 yum -y install gcc yum -y install gcc-c 1.2、下载nginx1.12.2 http://nginx.org/en/download.html 1.3、下载pcre-8.3.7.tar.gz 1.3.…

Qt应用程序连接达梦数据库-飞腾PC麒麟V10

目录 前言1 安装ODBC1.1 下载unixODBC源码1.2 编译安装1.4 测试 2 编译QODBC2.1 修改 qsqldriverbase.pri 文件2.2 修改 odbc.pro 文件2.3 编译并安装QODBC 3 Qt应用程序连接达梦数据库测试4 优化ODBC配置,方便程序部署4.1 修改pro文件,增加DESTDIR 变量…

C++ std::pair and std::list \ std::array

std::pair<第一个数据类型, 第二个数据类型> 变量名 例如&#xff1a; std::pair<int, string> myPair; myPair.first;拿到第一个int变量 myPair.second拿到第二个string变量 std::pair需要引入库#include "utility" std::make_pair() 功能制作一个…

STM32——串口通信(总结)

文章目录 串行通信概述&#xff1a;串行通信的基本原理和特点常见的串行通信标准和协议&#xff1a; 串口硬件接口&#xff1a;串口接口的特点包括&#xff1a;串口的物理接口和连接方式。串口引脚功能和作用。 串口通信参数&#xff1a;波特率&#xff08;Baud Rate&#xff0…

OJ练习第166题——课程表(拓扑排序问题)

课程表 力扣链接&#xff1a;207. 课程表 题目描述 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表…

source insight keil 中文乱码

1. 乱码的根本原因就是编码的方式太多了&#xff0c;你用这种编码&#xff0c;他用那种编码&#xff0c;就变成鸡同鸭讲了&#xff0c;对牛弹琴就要用牛语&#xff0c;如果全世界只有一种编码方式&#xff0c;就肯定不会有乱码问题&#xff0c;但这是不可能的。keil 设置编码格…