【深度学习入门篇 ⑤ 】PyTorch网络模型创建

news2024/11/15 13:25:57

【🍊易编橙:一个帮助编程小伙伴少走弯路的终身成长社群🍊】

大家好,我是小森( ﹡ˆoˆ﹡ ) ! 易编橙·终身成长社群创始团队嘉宾,橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官、CSDN人工智能领域优质创作者 。 


今天我们学习PyTorch的网络模型创建,全面概括该怎么创建模型!

神经网络的创建步骤

  1. 定义模型类,需要继承nn.Module
  2. 定义各种层,包括卷积层、池化层、全连接层、激活函数等等
  3. 编写前向传播,规定信号是如何传输的

可以用 torchsummary 查看网络结构,如果没有的话,使用pip命令进行安装 

pip install torchsummary

 Module: 神经网络的模板

所有的神经网络模块都应该继承该模块

import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):
    def _init__( self):
        super()._init_()
        self.conv1 = nn.Conv2d(1,20,5)
        self.conv2 = nn.Conv2d( 20,20,5)
    def forward( self, x):
        x = F.relu( self.conv1(x))
        return F.relu(self.conv2(x) )
    

神经网络中常见的各种层

常见的层包括:卷积层,池化层,全连接层,正则化层,激活层

导入层有两种方法:

一种是将其看作一个类,在torch.nn里面

另一种是将其看作一个函数,在torch.nn.functional里面可以调用

全连接层 

全连接层又称为线性层,所以函数名叫 Linear,执行的操作是𝑦=𝑥𝐴𝑇+𝑏

torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
  • in_feature代表输入数
  • out_features代表输出数,即神经元数量
import torch
import torch.nn as nn
m = nn.Linear(2,3)
input = torch.randn(5,2)
output = m( input)
print(output.size() )

输出:

torch.Size([5, 3])

先搭建个只有一层的网络,用 torchsummry 查看网络结构

import torch  
import torch.nn as nn  
from torchsummary import summary  
  
class NeuralNetwork(nn.Module):  
    def __init__(self):  
        super().__init__()  
        self.fc = nn.Linear(10, 1, bias=False) 
  
    def forward(self, x):  
        x = self.fc(x)  
        return x  
  
if __name__ == '__main__':  
    network = NeuralNetwork()  
    summary(network, (10,))  # 这里调用 torchsummary 来打印网络结构

 输出:

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Linear-1                    [-1, 1]              10
================================================================
Total params: 10
Trainable params: 10
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.00
Estimated Total Size (MB): 0.00
----------------------------------------------------------------

Process finished with exit code 0

我们再自定义输入到网络中:

if __name__ == '__main__':
    network = NeuralNetwork()
    network.to('cuda')

    input = torch.randn(10)
    input = input.to('cuda')
    print('input=', input)

    output = network(input)
    print('output=', output)

    result = output.detach().cpu().numpy()
    print('result=', result)
  •  detach()用于从计算图中分离出一个张量(Tensor),使其成为一个新的张量,这个新张量不再需要计算梯度(即不会参与反向传播)

打印结果:

input= tensor([ 0.5767, -1.2199,  0.4407,  0.6083, -0.1758,  0.2291, -0.8924,  1.1664,
         0.3445,  0.7242], device='cuda:0')
output= tensor([-0.0183], device='cuda:0', grad_fn=<SqueezeBackward4>)
result= [-0.01834533]

激活函数

常见的激活函数包括 sigmoidrelu,以及softmax,学会他们怎么用,就会用其他激活函数了

Sigmoid

sigmoid是早期的激活函数

 函数的示意图:

m = nn.Sigmoid()
input = torch.randn(5)
output = m(input)

print(input)
print(output)
# 输出

tensor([ 0.6759, -0.8753, -0.3187,  0.0088,  2.0625])
tensor([0.6628, 0.2942, 0.4210, 0.5022, 0.8872])
ReLU

ReLU激活函数常放在全连接层、以及卷积层后面

m = nn.ReLU()    # 或m = F.ReLU()
input = torch.randn(5)
output = m(input)

print(input)
print(output)

# 输出
tensor([-2.8164,  0.8885, -0.9526,  0.3723, -0.2637])
tensor([0.0000, 0.8885, 0.0000, 0.3723, 0.0000])
Softmax

softmax是在分类当中经常用到的激活函数,用来放在全连接网络的最后一层

 

m = nn.Softmax(dim=1)
input = torch.randn(4,3)
output = m(input)

print(input)
print(output)

# 输出
tensor([[ 0.1096,  0.7095,  0.5996],
        [-0.6431, -0.0555,  0.5332],
        [-0.2367, -0.1851,  0.4029],
        [-1.0242,  1.9747,  2.0828]])
tensor([[0.2245, 0.4090, 0.3665],
        [0.1655, 0.2979, 0.5366],
        [0.2532, 0.2667, 0.4801],
        [0.0230, 0.4621, 0.5149]])

随机失活Dropout

当 FC层过多,容易对其中某条路径产生依赖,从而使得某些参数未能训练起来

为了防止上述问题,在 FC层之间通常还会加入随机失活功能,也就是Dropout

dropout的作用是随机失活的,通常加载FC层之间

m = nn.Dropout(p=0.5)
input = torch.randn(6,6)
output = m(input)

print(input)
print(output)

输出:

tensor([[-2.1174,  0.1180, -1.2979,  0.3600, -1.0417, -1.3583],
        [-0.2945,  1.0038, -0.9205,  2.5044, -1.2789,  0.4402],
        [-0.4641,  1.3378,  0.1766,  0.1972,  1.6867, -1.7123],
        [-1.1137,  1.1291, -0.1404,  0.6881,  0.3442,  0.7479],
        [ 2.4966, -2.5837,  2.0277, -1.0195,  0.2140, -0.1453],
        [-0.9259,  1.2443, -0.2939,  0.0304, -0.1057, -0.7959]])
tensor([[-4.2347,  0.0000, -0.0000,  0.0000, -0.0000, -2.7165],
        [-0.5890,  2.0076, -0.0000,  0.0000, -2.5579,  0.0000],
        [-0.0000,  0.0000,  0.3533,  0.3945,  3.3733, -3.4246],
        [-0.0000,  2.2581, -0.0000,  1.3763,  0.0000,  0.0000],
        [ 0.0000, -0.0000,  4.0554, -0.0000,  0.0000, -0.0000],
        [-0.0000,  2.4887, -0.5878,  0.0608, -0.0000, -0.0000]])

至此,一个全连接网络就可以构建了。

案例1:全连接网络处理一维信息

搭建以下的网络结构

组合全连接层,dropout层,激活函数,我们就可以构建出一个完整的全连接网络结构,代码如下

import torch
import torch.nn as nn
from torchsummary import summary


class NeuralNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.relu = nn.ReLU()
        self.softmax = nn.Softmax(dim=1)
        self.dropout = nn.Dropout(p=0.5)
        self.fc_1 = nn.Linear(1000, 100)
        self.fc_2 = nn.Linear(100, 50)
        self.fc_3 = nn.Linear(50, 10)


    def forward(self,x):
        x = x.view(-1, 1000)  # 将输入的维度变成1000
        x = self.dropout(self.relu(self.fc_1(x)))
        x = self.dropout(self.relu(self.fc_2(x)))
        x = self.softmax(self.fc_3(x))
        return x

if __name__ == '__main__':
    network = NeuralNetwork()
    network.to('cuda')
    input = torch.randn(10, 1000)
    input = input.to('cuda')
    output = network(input)
    result = output.detach().cpu().numpy()
    print('result=', result)
    summary(network, (1000,))

输出:

result= [[0.08132502 0.0739548  0.09398187 0.10661174 0.12098686 0.11598682
  0.09127808 0.11483455 0.10602687 0.0950134 ]
 [0.09192658 0.08138597 0.07189317 0.12415235 0.11198585 0.11625377
  0.11482875 0.09960157 0.11294526 0.07502676]
 [0.09182167 0.05779037 0.14180492 0.09080649 0.11460604 0.09648075
  0.10017563 0.08380282 0.10664819 0.11606318]
 [0.07540213 0.09515596 0.11200604 0.11029708 0.14663948 0.08727078
  0.06854413 0.07956128 0.10746382 0.1176593 ]
 [0.07536343 0.091349   0.1040979  0.08714981 0.11877389 0.14497975
  0.08420233 0.08688229 0.11904272 0.08815894]
 [0.08312867 0.05986795 0.12148032 0.10792468 0.10400964 0.1238383
  0.11305461 0.08796311 0.11383145 0.08490121]
 [0.07948367 0.09183787 0.08272586 0.11967309 0.12150185 0.10853862
  0.09249827 0.10322765 0.102726   0.09778718]
 [0.09022301 0.09465341 0.08689808 0.08957365 0.14267558 0.1025212
  0.08516254 0.08472932 0.12696771 0.09659547]
 [0.08116906 0.12094414 0.09831021 0.12145476 0.12512349 0.10931041
  0.09090355 0.08238174 0.07898384 0.0914188 ]
 [0.10484971 0.08653011 0.09862521 0.1086348  0.09272213 0.0991234
  0.08527588 0.10124511 0.10974825 0.11324544]]
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Linear-1                  [-1, 100]         100,100
              ReLU-2                  [-1, 100]               0
           Dropout-3                  [-1, 100]               0
            Linear-4                   [-1, 50]           5,050
              ReLU-5                   [-1, 50]               0
           Dropout-6                   [-1, 50]               0
            Linear-7                   [-1, 10]             510
           Softmax-8                   [-1, 10]               0
================================================================
Total params: 105,660
Trainable params: 105,660
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.40
Estimated Total Size (MB): 0.41
----------------------------------------------------------------

案例2:全连接网络处理二维图像

搭建以下的网络结构

使用全连接网络处理二维图像信息,当二维特征(Feature Map)转为一维特征时,需要从高维压缩成一维

这时候可以用 tensor.view(),或者用nn.Flatten(start_dim=1)

import torch
import torch.nn as nn
from torchsummary import summary


class NeuralNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.relu = nn.ReLU()
        self.softmax = nn.Softmax(dim=1)
        self.dropout = nn.Dropout(p=0.5)
        self.fc_1 = nn.Linear(3*256*256, 100)
        self.fc_2 = nn.Linear(100, 10)
        self.fc_3 = nn.Linear(10,5)


    def forward(self,x):
        x = x.view(-1, 3*256*256)
        x = self.dropout(self.relu(self.fc_1(x)))
        x = self.dropout(self.relu(self.fc_2(x)))
        x = self.softmax(self.fc_3(x))
        return x

if __name__ == '__main__':
    network = NeuralNetwork()
    network.to('cuda')
    input = torch.randn((4,3,256,256))   # 4个样本,每个样本3通道,256*256像素
    input = input.to('cuda')
    output = network(input)
    result = output.detach().cpu().numpy()
    print('result=', result)
    summary(network, (3, 256, 256))

输出:

result= [[0.17621297 0.14625552 0.19215888 0.2527377  0.23263492]
 [0.16786984 0.16124012 0.1907313  0.2352923  0.24486642]
 [0.17400946 0.16431957 0.18192714 0.23585317 0.2438907 ]
 [0.1535219  0.18567167 0.18704179 0.16786435 0.30590025]]
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Linear-1                  [-1, 100]      19,660,900
              ReLU-2                  [-1, 100]               0
           Dropout-3                  [-1, 100]               0
            Linear-4                   [-1, 10]           1,010
              ReLU-5                   [-1, 10]               0
           Dropout-6                   [-1, 10]               0
            Linear-7                    [-1, 5]              55
           Softmax-8                    [-1, 5]               0
================================================================
Total params: 19,661,965
Trainable params: 19,661,965
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.75
Forward/backward pass size (MB): 0.00
Params size (MB): 75.00
Estimated Total Size (MB): 75.76
----------------------------------------------------------------

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

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

相关文章

注册中心与配置中心,是分?是合?

一零年代初&#xff0c;我还自己动手写过socket连接来做服务注册发现&#xff0c;后来有了zookeeper就方便多了&#xff0c;那时候zookeeper也直接做配置中心使用。后来出现了一些专门的服务注册发现组件如Eureka\etcd\consul&#xff0c;专门的配置中心比如spring cloud confi…

2024年上半年信息系统项目管理师——综合知识真题题目及答案(第1批次)(2)

2024年上半年信息系统项目管理师 ——综合知识真题题目及答案&#xff08;第1批次&#xff09;&#xff08;2&#xff09; 第21题&#xff1a;在一个大型信息系统项目中&#xff0c;项目经理发现尽管已经建立了沟通机制&#xff0c;但团队间的沟通依然不畅&#xff0c;项目风险…

【JavaScript】解决 JavaScript 语言报错:Uncaught SyntaxError: Unexpected token

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 缺少必要的语法元素2. 使用了不正确的字符或符号3. JSON 格式错误4. 字符串未正确闭合 四、解决方案与预防措施1. 检查语法元素2. 正确使用符号和字符3. 修正 JSON 格式4. 字符串闭合 五、示例代码和实践建议…

C++基础语法:STL之迭代器

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 C基础:STL概述-CSDN博客 上一篇梳理了一些同STL有关的概念.同时对理解迭代器需要的类包含,内部类,链表等内容做了分析,这篇从<C Prime Plus> 6th Edition(以下称"本书")的P684,大标题16.4泛型编…

Sortable.js板块拖拽示例

图例 代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 页面加载后显示 拖拽效果 源代码 由于js库使用外链&#xff0c;所以会加载一会儿 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&qu…

Pycharm 导入 conda 环境

使用时经常在此处卡壳&#xff0c;在此做个记录。 这个位置选择 conda 安装路径下的 python.exe 文件即可

书生浦语大模型实战营---Linux 基础知识

创建开发机 开建开发机首先填写开发机名称&#xff0c;选择镜像和配置资源&#xff0c;最后选择立即创建 ssh免密钥登陆 1、本地执行ssh-keygen -t rsa&#xff0c;然后一路回车就可以了 2、执行cat ~/.ssh/id_rsa.pub 3、回到开发机平台&#xff0c;在首页点击配置SSH Key…

手机数据恢复篇:如何从 Android 设备内恢复数据

如何从 Android 内部存储恢复数据&#xff1f; 要从 Android 内部存储恢复已删除的文件&#xff0c;您需要一个 Android 内部存储恢复应用或程序。请继续阅读以获取可靠的 Android 数据恢复软件&#xff0c;并让它帮助您从 Android 手机的内部存储恢复数据。 是否有可能恢复 An…

工业大数据是什么?应用工业大数据时面临哪些挑战?

在当今快速发展的工业领域&#xff0c;大数据已成为推动企业转型升级的核心动力。工业大数据&#xff0c;以其独特的价值和潜力&#xff0c;正逐渐改变着传统的生产、管理和决策模式。然而&#xff0c;伴随着大数据的快速发展&#xff0c;一系列挑战也随之浮现。本文将深入探讨…

刷题之单词规律同构字符串(leetcode)

同构字符串 单词规律 两个都是映射关系&#xff0c;用两张哈希表记录互相映射就可以了 同构字符串&#xff1a; class Solution { public:bool isIsomorphic(string s, string t) {//用两张哈希表做映射if(s.size()!t.size()){return false;}unordered_map<char,char&…

零基础学JS之APIS

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

算法day04 位运算 插入排序 二分法 对数器

位运算: 1&#xff09;有一个数组只包含这样的数&#xff0c;有几个数出现偶数次&#xff0c;有1个数出现奇数次&#xff0c;要求时间复杂度不超过o(n),怎么求出现奇数次的数。 使用 ^ 异或运算整个数组&#xff0c;偶数次运算结果为0&#xff0c;只留下最后一个奇数次的数。 …

【零基础】学JS之APIS第四天

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

网络层重点协议—IP协议

在复杂的网络环境中确定一个合适的路径 协议头格式如下&#xff1a; 4位版本号(version) 指定协议的版本&#xff08;IPV4-4,IPV6-6&#xff09; 4位首部长度(header length) IP头部的长度是多少个32bit&#xff0c;也就是length*4的字节数。4bit表示最大的数字是15&#x…

记一次TIDB开启TLS失败导致PD扩容失败案例

作者&#xff1a; Dora 原文来源&#xff1a; https://tidb.net/blog/8ee8f295 问题背景 集群之前由于TIUP目录被删除导致TLLS证书丢失&#xff0c;后续需要重新开启TLS 在测试环境测试TLS开启步骤&#xff0c;导致后续两台PD扩容失败&#xff0c;步骤如下&#xff1a; …

Linux Win 10 Windows上安装Ollama部署大模型qwen2 7b/15配置启动 LangChain-ChatChat 0.2.10进行对话

Win 10 Window安装Ollama部署qwen2 7b LangChain-ChatChat 环境说明 Win 10 Python 3.11.9 LangChain-ChatChat 0.20 Ollama 0.2.10 Qwen2 1.5b/7b Windows 安装Ollama 下载并安装Windows版Ollama https://ollama.com/download#/ 下载大模型qwen2:1.5b或者qwen2:7b 在命令…

电子技术员基础

这是介绍电子技术员必须掌握的基础知识&#xff0c;在维修和测试中可能有所帮助。放在电脑里有几十年了&#xff0c;是我早期在做电子技术员期间做的文档&#xff0c;所有插图都是自己做的&#xff0c;当初学习态度是绝对认真。如果把这股子劲用在考研上呢&#xff0c;... ...&…

Dataset for Stable Diffusion

1.Dataset for Stable Diffusion 笔记来源&#xff1a; 1.Flickr8k数据集处理 2.处理Flickr8k数据集 3.Github&#xff1a;pytorch-stable-diffusion 4.Flickr 8k Dataset 5.dataset_flickr8k.json 6.About Train, Validation and Test Sets in Machine Learning Tarang Shah …

python-28-零基础自学python-json存数据、读数据,及程序合并

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; import json引入、 try-except-else return def函数、打开文件、 练习内容&#xff1a; 练习10-11&#xff1a;喜欢的数 编写一个程序&#xff0c;提示用户输入喜欢的数&#xff…

机器学习基本概念,Numpy,matplotlib和张量Tensor知识进一步学习

机器学习一些基本概念&#xff1a; 监督学习 监督学习是机器学习中最常见的形式之一&#xff0c;它涉及到使用带标签的数据集来训练模型。这意味着每条训练数据都包含输入特征和对应的输出标签。目标是让模型学会从输入到输出的映射&#xff0c;这样当给出新的未见过的输入时…