python-pytorch基础之神经网络分类

这篇具有很好参考价值的文章主要介绍了python-pytorch基础之神经网络分类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

生成数据函数

import random
def get_rectangle():
    width=random.random()
    height=random.random()
    
    # 如果width大于height就是1,否则就是0
    fat=int(width>=height)
    
    return width,height,fat

get_rectangle()
    
(0.19267437580138802, 0.645061020860627, 0)
fat=int(0.8>=0.9)
fat
0

定义数据集

import torch
class Dataset(torch.utils.data.Dataset):
    def __init__(self):
        pass
    
    def __len__(self):
        return 1000
    
    def __getitem__(self,i):
        width,height,fat=get_rectangle()
        
        # 这里注意width和height列表形式再转为tensor,另外是floattensor
        x=torch.FloatTensor([width,height])
        y=fat
        
        return x,y
dataset=Dataset()
# 这里没执行一次都要变,有什么意义?
len(dataset),dataset[999]
(1000, (tensor([0.4756, 0.1713]), 1))

定义loader加载数据

# 定义了数据集,然后使用loader去加载,需要记住batch_size,shuffle,drop_last这个三个常用的
loader=torch.utils.data.DataLoader(dataset=dataset,batch_size=9,shuffle=True,drop_last=True)

# 加载完了以后,就可以使用next去遍历了
len(loader),next(iter(loader))
(111,
 [tensor([[0.1897, 0.6766],
          [0.2460, 0.2725],
          [0.5871, 0.7739],
          [0.3035, 0.9607],
          [0.7006, 0.7421],
          [0.4279, 0.9501],
          [0.6750, 0.1704],
          [0.5777, 0.1154],
          [0.5512, 0.3933]]),
  tensor([0, 0, 0, 0, 0, 0, 1, 1, 1])])
# 输出结果:
# (111,
#  [tensor([[0.3577, 0.3401],
#           [0.0156, 0.7550],
#           [0.0435, 0.4984],
#           [0.1329, 0.5488],
#           [0.4330, 0.5362],
#           [0.1070, 0.8500],
#           [0.1073, 0.2496],
#           [0.1733, 0.0226],
#           [0.6790, 0.2119]]),
#   tensor([1, 0, 0, 0, 0, 0, 0, 1, 1])])  这里是torch自动将y组合成了一个tensor

定义神经网络模型

class Model(torch.nn.Module):
    def __init__(self):
        super().__init__()
        
        # 定义神经网络结构
        self.fb=torch.nn.Sequential(
            # 第一层输入两个,输出32个
            torch.nn.Linear(in_features=2,out_features=32),
            
            # 激活层的意思是小于0的数字变为0,即负数归零操作
            torch.nn.ReLU(),
            
            # 第二层,输入是32个,输出也是32个
            torch.nn.Linear(in_features=32,out_features=32),
            
            # 激活
            torch.nn.ReLU(),
            
            # 第三次,输入32个,输出2个
            torch.nn.Linear(in_features=32,out_features=2),
            
            # 激活,生成的两个数字相加等于1
            torch.nn.Softmax(dim=1)
        )
    
    
    # 定义网络计算过程
    def forward(self,x):
        return self.fb(x)
    
model=Model()

测试输出是否为2个

# 测试 8行2列的数据,让模型测试,看是否最后输出是否也是8行一列?

model(torch.rand(8,2)).shape
torch.Size([8, 2])

输入数据,输出结果

model(torch.tensor([[0.3577, 0.3401]]))
tensor([[0.5228, 0.4772]], grad_fn=<SoftmaxBackward>)

训练模型函数

def train():
    #定义优化器,le-4表示0.0004,10的负四次方
    opitimizer=torch.optim.Adam(model.parameters(),lr=1e-4)
    #定义损失函数 ,一般回归使用mseloss,分类使用celoss
    loss_fn=torch.nn.CrossEntropyLoss()
    #然后train
    model.train()
    
    # 全量数据遍历100轮
    for epoch in range(100):
        # 遍历loader的数据,循环一次取9条数据,这里注意unpack时,x就是【width,height】
        for i,(x,y) in enumerate(loader):
            out=model(x)
            
            # 计算损失
            loss=loss_fn(out,y)
            # 计算损失的梯度
            loss.backward()
            
            # 优化参数
            opitimizer.step()
            # 梯度清零
            opitimizer.zero_grad()
                    
            # 第二十轮的时候打印一下数据
            if epoch % 20 ==0:
                # 正确率
                # out.argmax(dim=1) 表示哪个值大就说明偏移哪一类,dim=1暂时可以看做是固定的
                # (out.argmax(dim=1)==y).sum() 表示的true的个数
                acc=(out.argmax(dim=1)==y).sum().item()/len(y)
                print(epoch,loss.item(),acc)


    torch.save(model,"4.model")
    

计算正确率

执行的命令:

print(out,“======”,y,“+++++”,(out.argmax(dim=1)==y).sum().item())

print(out.argmax(dim=1),“------------”,(out.argmax(dim=1)==y),“~~~~~~~~~~~”,(out.argmax(dim=1)==y).sum())

输出的结果:

tensor([[9.9999e-01, 1.4671e-05],

    [4.6179e-14, 1.0000e+00],        
    
    [3.2289e-02, 9.6771e-01],        
    
    [1.1237e-22, 1.0000e+00],
    
    [9.9993e-01, 7.0015e-05],
    
    [8.6740e-02, 9.1326e-01],
    
    [1.1458e-18, 1.0000e+00],
    
    [5.2558e-01, 4.7442e-01],
    
    [9.7923e-01, 2.0772e-02]],         
        
    grad_fn=<SoftmaxBackward>) ====== tensor([0, 1, 1, 1, 0, 1, 1, 1, 0]) +++++ 8

tensor([0, 1, 1, 1, 0, 1, 1, 0, 0]) ------------ tensor([ True, True, True, True, True, True, True, False, True]) ~~~~~~~~~~~ tensor(8)

解释:

out.argmax(dim=1) 表示哪个值大就说明偏移哪一类,dim=1暂时可以看做是固定的

(out.argmax(dim=1)==y).sum() 表示的true的个数文章来源地址https://www.toymoban.com/news/detail-622652.html

 a = torch.tensor([[1,2,3],[4,7,6]])


d = a.argmax(dim=1)
print(d)
tensor([2, 1])

训练数据并保存模型

train()
80 0.3329530954360962 1.0
80 0.31511250138282776 1.0
80 0.33394935727119446 1.0
80 0.3242819309234619 1.0
80 0.3188716471195221 1.0
80 0.3405844569206238 1.0
80 0.32696405053138733 1.0
80 0.3540787696838379 1.0
80 0.3390745222568512 1.0
80 0.3645476996898651 0.8888888888888888
80 0.3371085822582245 1.0
80 0.31789034605026245 1.0
80 0.31553390622138977 1.0
80 0.3162603974342346 1.0
80 0.35249051451683044 1.0
80 0.3582523465156555 1.0
80 0.3162645995616913 1.0
80 0.37988030910491943 1.0
80 0.34384390711784363 1.0
80 0.31773826479911804 1.0
80 0.3145104646682739 1.0
80 0.31753242015838623 1.0
80 0.3222736120223999 1.0
80 0.38612237572669983 1.0
80 0.35490038990974426 1.0
80 0.34469687938690186 1.0
80 0.34534531831741333 1.0
80 0.31800928711891174 1.0
80 0.34892910718917847 1.0
80 0.33424195647239685 1.0
80 0.37350085377693176 1.0
80 0.3298128843307495 1.0
80 0.3715909719467163 1.0
80 0.3507140874862671 1.0
80 0.33337005972862244 1.0
80 0.3134789764881134 1.0
80 0.35244104266166687 1.0
80 0.3148314654827118 1.0
80 0.3376845419406891 1.0
80 0.3315282464027405 1.0
80 0.3450225591659546 1.0
80 0.3139556646347046 1.0
80 0.34932857751846313 1.0
80 0.3512738049030304 1.0
80 0.3258627951145172 1.0
80 0.3197799324989319 1.0
80 0.358166366815567 0.8888888888888888
80 0.3716268837451935 1.0
80 0.31426626443862915 1.0
80 0.32130196690559387 1.0
80 0.3207002282142639 1.0
80 0.3891155421733856 1.0
80 0.35045987367630005 1.0
80 0.32332736253738403 1.0
80 0.31951677799224854 1.0
80 0.3184094727039337 1.0
80 0.3341224491596222 1.0
80 0.3408585786819458 1.0
80 0.3139263093471527 1.0
80 0.33058592677116394 1.0
80 0.3134475648403168 1.0
80 0.3281571567058563 1.0
80 0.33370518684387207 1.0
80 0.33172252774238586 1.0
80 0.32849007844924927 1.0
80 0.3604048788547516 1.0
80 0.3651810884475708 1.0

测试模型

准备数据

# 准备数据
x,fat=next(iter(loader))
x,fat
(tensor([[0.6733, 0.4044],
         [0.6503, 0.0303],
         [0.9353, 0.9518],
         [0.4145, 0.6948],
         [0.9560, 0.8009],
         [0.6331, 0.0852],
         [0.5510, 0.8283],
         [0.1402, 0.2726],
         [0.3257, 0.8351]]),
 tensor([1, 1, 0, 0, 1, 1, 0, 0, 0]))

加载模型预测

# 加载模型
modell=torch.load("4.model")
# 使用模型
out=modell(x)
out
tensor([[1.5850e-04, 9.9984e-01],
        [1.4121e-06, 1.0000e+00],
        [7.1068e-01, 2.8932e-01],
        [9.9994e-01, 5.5789e-05],
        [4.1401e-03, 9.9586e-01],
        [3.3441e-06, 1.0000e+00],
        [9.9995e-01, 4.7039e-05],
        [9.9111e-01, 8.8864e-03],
        [1.0000e+00, 1.5224e-06]], grad_fn=<SoftmaxBackward>)
out.argmax(dim=1)
tensor([1, 1, 0, 0, 1, 1, 0, 0, 0])

对比结果

fat
tensor([1, 1, 0, 0, 1, 1, 0, 0, 0])
查看上面out的结果和fat的结论一致,不错

到了这里,关于python-pytorch基础之神经网络分类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 循环神经网络RNN完全解析:从基础理论到PyTorch实战

    在本文中,我们深入探讨了循环神经网络(RNN)及其高级变体,包括长短时记忆网络(LSTM)、门控循环单元(GRU)和双向循环神经网络(Bi-RNN)。文章详细介绍了RNN的基本概念、工作原理和应用场景,同时提供了使用PyTorch构建、训练和评估RNN模型的完整代码指南。 作者 Te

    2024年02月12日
    浏览(34)
  • 神经网络中遇到的 python 函数(Pytorch)

    函数用于返回一个对象属性值。 用于判断一个表达式,在表达式条件为 false 的时候触发异常。 语法格式: assert 后面也可以紧跟参数: 等价于: 创建目录。 寻找当前时间。 格式化时间,返回当地时间(显示的格式以字符串显示,主要通过format决定)。 创建日志。 通过

    2024年02月15日
    浏览(43)
  • PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

    目录 前言 一、卷积神经网络概述 二、卷积神经网络特点 卷积运算 单通道,二维卷积运算示例 单通道,二维,带偏置的卷积示例 带填充的单通道,二维卷积运算示例 Valid卷积 Same卷积 多通道卷积计算 1.局部感知域 2.参数共享 3.池化层 4.层次化提取  三、卷积网络组成结构

    2024年02月07日
    浏览(57)
  • 16 PyTorch 神经网络基础【李沐动手学深度学习v2】

    在构造自定义块之前,我们先回顾一下多层感知机的代码。 下面的代码生成一个网络,其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层, 然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。 层和块 构造单层神经网咯:线性层+RELU+线性层 生成2x20(2是批量

    2024年03月10日
    浏览(89)
  • 深度学习基础——通过PyTorch构建神经网络实现1维/2维序列分类

    通过PyTorch构建前馈神经网络,并对二维数据点进行分类。在该例子当中,所有的训练数据和测试数据都是通过高斯混合模型GMM生成的: 更换使用循环神经网络RNN模型,进行1维序列分类任务。 为了简化问题,我们假定: 序列的长度是固定的。我们将其长度设为T=4。 我们只有

    2024年02月11日
    浏览(44)
  • BP神经网络(Python代码实现)基于pytorch

     BP(Back Propagation)神经网络是一种按误差逆传播算法训练的多层前馈网络,它的学习规则是 使用梯度下降法 , 通过反向传播来不断调整网络的权值和阈值 ,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hiddenlayer)和输出层(output layer)。BP网络的学习

    2024年02月11日
    浏览(56)
  • 【Python机器学习】实验14 手写体卷积神经网络(PyTorch实现)

    LeNet-5是卷积神经网络模型的早期代表,它由LeCun在1998年提出。该模型采用顺序结构,主要包括7层(2个卷积层、2个池化层和3个全连接层),卷积层和池化层交替排列。以mnist手写数字分类为例构建一个LeNet-5模型。每个手写数字图片样本的宽与高均为28像素,样本标签值是0~

    2024年02月12日
    浏览(52)
  • python pytorch 纯算法实现前馈神经网络训练(数据集随机生成)-续

    上一次的代码博主看了,有两个小问题其实,一个是,SGD优化的时候,那个梯度应该初始化为0,还一个是我并没有用到随机生成batch。 博主修改了代码,并且加入了accuracy图像绘制的代码。代码如下: 可一下跑出的结果: 可以看到这样看下来,效果就很不错了。

    2024年02月13日
    浏览(42)
  • Python基于PyTorch实现循环神经网络回归模型(LSTM回归算法)项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解 ),如需 数据+代码+文档+视频讲解 可以直接到文章最后获取。 LSTM网络是目前更加通用的循环神经网络结构,全称为Long Short-Term Memory,翻译成中文叫作“长‘短记忆’”网络。读的时候,“长”后面要稍

    2024年02月16日
    浏览(58)
  • Python基于PyTorch实现循环神经网络分类模型(LSTM分类算法)项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解 ),如需 数据+代码+文档+视频讲解 可以直接到文章最后获取。 LSTM网络是目前更加通用的循环神经网络结构,全称为Long Short-Term Memory,翻译成中文叫作“长‘短记忆’”网络。读的时候,“长”后面要稍

    2024年02月16日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包