一、定义Pytorch模型

pytorch基本使用——定义模型 我们通过继承torch.nn.Module来实现自己的类,其中__init__和forward__init__:初始化模型forward:向前传播,输入转输出结果Net(上面代码,当执行net=Net()时,__init__就初始化了两个卷积。之后我们会输出数据x,当我们执行net(x)时进行forward正向传播,计算得到最终的结果。 阅读详情

目录

1. PyTorch模型定义的方式

1.1 torch.nn.Sequential

以上两种方式的唯一区别在于:

1.2 torch.nn.ModuleList

1.3 torch.nn.ModuleDict

1.4 实战

2.  用模型块快速搭建复杂网络 

2.1 卷积神经网络基础

2.1.1 卷积层

2.1.2 池化层

2.1.3 全连接层

2.2 U-Net模型

2.3 U-Net模型块分析 

2.4 U-Net模型块实现

2.5 U-Net模型块组装

3. PyTorch修改模型

3.1 修改模型层

3.2  添加外部输入 

3.3 添加额外输出


1. PyTorch模型定义的方式

  • 基于nn.Module,我们可以通过Sequential,ModuleList,ModuleDict三种方式来定义Pytorch模型。
  • torch.nn.Module是所有网络的基类,在Pytorch实现的Model都要继承该类。而且,Module是可以包含其他的Module的,以树形的结构来表示一个网络结构

1.1 torch.nn.Sequential

  • torch.nn.Sequential 类是 torch.nn 中的一种序列容器,通过在容器中嵌套各种实现神经网络中具体功能相关的类,来完成对神经网络模型的搭建,最主要的是,参数会按照我们定义好的序列自动传递下去。
  • 我们可以将嵌套在容器中的各个部分看作是不同的模块,这些模块可以自由组合。

方式一:直接排列

import torch.nn as nn
hidden_layor = 256
input_data = 784
output_data = 10
net = nn.Sequential(
    nn.Linear(input_data,hidden_layor),      #完成从输入层到隐藏层的线性变换
    nn.ReLU(),  #激活层
    nn.Linear(hidden_layor,output_data),  #隐藏层到输出层的线性变换
)
print(net)

 

 方式二:使用OrderDict有序字典进行传入搭建的模型 

hidden_layor = 256
input_data = 784
output_data = 10

import collections
import torch.nn as nn
net2 = nn.Sequential(collections.OrderedDict
                     ([
                         ('Line1',nn.Linear(input_data,hidden_layor)),
                         ('Relu1',nn.ReLU()),
                         ('Line2',nn.Linear(hidden_layor,output_data))
                     ]))
print(net2)

以上两种方式的唯一区别在于:

  • 使用第二种方式搭建的模型,每一个模块都可以自定义名字
  • 第一个方式搭建的模块是默认从0开始的数字序号作为每一个模块的名字

1.2 torch.nn.ModuleList

  • ModuleList是以list的形式保存sub-modules或者网络层,这样就可以先将网络需要的layer构建好保存到一个list,然后通过ModuleList方法添加到网络中。
import torch.nn as nn

hidden_layor = 256
input_data = 784
output_data = 10

net = nn.ModuleList([nn.Linear(input_data,hidden_layor),nn.ReLU()])
net.append(nn.Linear(hidden_layor,output_data))
print(net) # 类似List的索引访问
print(net[0])

nn.ModuleList 并没有定义一个网络,它只是将不同的模块储存在一起。ModuleList中元素的先后顺序并不代表其在网络中的真实位置顺序,需要经过forward函数指定各个层的先后顺序后才算完成了模型的定义。如下:

class model(nn.Module):
    def __init__(self):
        super(model,self).__init__()
        # 构建layer的list
        self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(10)])
    def forward(self,x):
        # 正向传播,使用遍历每个Layer
        for i, l in enumerate(self.linears):
            x = self.linears[i // 2](x) + l(x)
        return x

1.3 torch.nn.ModuleDict

  • ModuleDict和ModuleList的作用类似,只是ModuleDict能够更方便地为神经网络的层添加名称。
import torch.nn as nn

hidden_layor = 256
input_data = 784
output_data = 10

net = nn.ModuleDict({
    'Line1':nn.Linear(input_data,hidden_layor),
    'ReLu':nn.ReLU()})
net['Line2'] = nn.Linear(hidden_layor,output_data)

print(net)
print(net['Line2'])
print(net.Line2)

1.4 实战

import torch
import torch.nn as nn
from torch.autograd import Variable

batch_n = 100   #? 一个批次中输入数据的数量,意味着在一个批次中输入100个数据
hidden_layer = 100
input_data = 1000   #? 1000个特征
output_data = 10

#! 输入输出
x = Variable(torch.randn(batch_n,input_data),requires_grad=False) #? 输入层纬度(100,1000)
y = Variable(torch.randn(batch_n,output_data),requires_grad=False) #? 输出层维度(100,10)

models = nn.Sequential(
    nn.Linear(input_data,hidden_layer),
    nn.ReLU(),
    nn.Linear(hidden_layer,output_data)
)

#! 训练次数,学习速率
epoch_n = 10000
learning_rate = 1e-4
loss_fn = nn.MSELoss()

optimzer = torch.optim.Adam(models.parameters(),lr=learning_rate)

for epoch in range(epoch_n):
    y_pred = models(x)
    loss = loss_fn(y_pred,y)
    print("Epoch:{}, Loss:{:.4f}".format(epoch,loss.data[0]))
    optimzer.zero_grad()
    
    loss.backward()
    optimzer.step()

2.  用模型块快速搭建复杂网络 

        当模型的深度非常大时候,使用Sequential定义模型结构需要向其中添加几百行代码,使用起来不甚方便。

        对于大部分模型结构(比如ResNet、DenseNet等),我们仔细观察就会发现,虽然模型有很多层, 但是其中有很多重复出现的结构。考虑到每一层有其输入和输出,若干层串联成的”模块“也有其输入和输出,如果我们能将这些重复出现的层定义为一个”模块“,每次只需要向网络中添加对应的模块来构建模型,这样将会极大便利模型构建的过程。

        我们以U-Net为例,介绍如何构建模型块,以及如何利用模型块快速搭建复杂模型。

2.1 卷积神经网络基础

2.1.1 卷积层

        卷积层(Convolution Layer)的主要作用是对输入的数据进行特征提取,而完成该功能的是卷积层中的卷积核(Filter)。可以将卷积核看成是一个指定窗口大小的扫描器,扫描器通过一次又一次地扫描输入的数据,来提取数据中的特征。

        例如:

        通过对卷积过程的计算 ,我们可以总结出一个通用公式,用于计算输入图像经过一轮卷积操作后的输出图像的宽度和高度的参数,公式如下:

                                        ​​​​​​​       W_{output}=\frac{W_{input}-W_{filter}+2P}{S}+1

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​      H_{output}=\frac{H_{input}-H_{filter}+2P}{S}+1

        通用公式中的W和H分别表示图像的宽度和高度的值;下标input表示输入图像的相关参数;下标output表示输出的图像的相关参数;下标filter表示卷积核的相关参数;S表示卷积核的步长;P表示在图像边缘增加的边界像素层数,如果图像边界像素填充的方式选择的是Same模式,那么P的值就等于图像增加的边界层数,如果选择的是Valid模式,那么P=0。

2.1.2 池化层

        卷积神经网络中的池化层可以被看作卷积神经网络中的一种提取输入数据的核心特征的方式,不仅实现了对原始数据的压缩,还大量减少了参与模型计算的参数,从某种意义上提高了计算效率。

        其中,最常被用到的池化层方法是平均池化层和最大池化层,池化层处理的输入数据在一般情况下是经过卷积操作之后生成的特征图。

        如下为最大池化层: 

         通过池化层的计算,也能总结出一个通用公式,可以用来计算输入的特征图经过一轮池化操作后输出的特征图的宽度和高度:

W_{output}=\frac{W_{input}-W_{filter}}{S}+1

H_{output}=\frac{H_{input}-H_{filter}}{S}+1

        其中,W和H分别表示特征图的宽度和高度值,下标inout表示输入的特征图的相关参数,下标output表示输出的特征图的相关参数,下标filter表示滑块窗口的相关参数,S表示滑动窗口的步长,并且输入的特征图的深度和滑动窗口的深度保持一致。

2.1.3 全连接层

        全连接层的主要作用是将输入图像在经过卷积和池化操作后提取的特征进行压缩,并且根据压缩的特征完成模型的分类功能,如下是一个全连接层的简化流程。

         上图中input是通过卷积层和池化层提取的输入图像的核心特征,与全连接层中定义的权重参数相乘,最后被压缩成只有10个输出参数,这10个输出参数其实已经是一个分类的结果,再经过激活函数的进一步处理,就能使分类预测结果更加明显。将10个参数输入到Softmax激活函数中,激活函数的输出结果就是模型预测的输入图像对应的各个类别的可能值。

2.2 U-Net模型

        它的输入是一个维度为572x572x1的图像,即输入的是高度和宽度都为572的单通道图像。    

        经过两次卷积,使用的卷积核滑动窗口为3x3x1,步长为1,套用卷积通用公式,可以得出第一次卷积得出的特征图的高度和宽度均为570=(572-3-0)/1+1,第二次卷积得出的特征图的高度和宽度均为568=(570-3-0)/1+1。同时可以看到这个第一次的卷积层要求最后输出深度为64的特征图,所以需要进行64次同样的卷积操作,第一次卷积输出的特征图的维度为570x570x64,第二次卷积只需要对每一层进行1次卷积操作,输出的特征图维度为568x568x64。其中每次卷积都紧接着一个ReLu激活函数。

        接下来是使用最大池化层进行下采样,下采样要完成的功能是缩减输入的特征图的大小,选择最大池化层的滑动窗口为2x2x64,因为输入的特征图的高度和宽度均为568,所以套用池化通用公式,可以得到最后输出的特征图的高度和宽度均为284=(568-2)/2+1,所以池化后输出的特征图的维度为284x284x64。再经过两次卷积,最后输出的特征图维度为280x280x128。

        扩展路径包含一个上采样(2x2上卷积),这样会减半feature channel,接着是一个对应的收缩路径的feature map,然后是2个3x3卷积,每个卷积后面跟一个RELU,因为每次卷积会丢失图像边缘,所以裁剪是有必要的,最后来一个1x1的卷积,用来将有64个元素的feature vector映射到一个类标签,整个网络一共有23个卷积层。

  可以看出来,就是一个全卷积神经网络,输入和输出都是图像,没有全连接层。较浅的高分辨率层用来解决像素定位的问题,较深的层用来解决像素分类的问题。

2.3 U-Net模型块分析 

        从上图中可以看到,U-Net模型具有良好的对称性。模型从上到下分为若干层,每层由左侧和右侧两个模型块组成,每侧的模型块与其上下模型块之间有连接;同时位于同一层左右两侧的模型块之间也有连接,称为“Skip-connection”。此外还有输入和输出处理等其他组成部分。由于模型的形状非常像英文字母的“U”,因此被命名为“U-Net”。

        U-Net的模块主要有以下几个部分:

  1. 每个子块中进行两次卷积(Double Convolution)
  2. 左侧模块为向下采样连接,即最大池化(Max Pooling)
  3. 右侧模块为向上采样连接
  4. 输出层的处理

2.4 U-Net模型块实现

        将以上四个模块分别起名:DoubleConv,Down,Up,OutConv。

import torch
import torch.nn as nn
import torch.nn.functional as F
class DdoubleConv(nn.Module):
    def __init__(self, in_channels, out_channels, mid_channels=None):
        #hs 初始化PyTorch父类
        super().__init__()  #? super().__init__()是调用了父类的构造函数
        
        if not mid_channels:
            mid_channels = out_channels
        
        self.double_conv = nn.Sequential(
            nn.Conv2d(in_channels, mid_channels, kernel_size=3, padding=1, bias=False),
            #? 二维卷积nn.Conv2d用于图像数据,对宽度和高度都进行卷积
            nn.BatchNorm2d(mid_channels),
            #? 在卷积神经网络的卷积层之后总会添加BatchNorm2d进行数据的归一化处理,这使得数据在进行Relu之前不会因为数据过大而导致网络性能的不稳定
            nn.ReLU(inplace=True),#? 运算后覆盖
            nn.Conv2d(mid_channels, out_channels, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True)
        )
    def forward(self, x):
        #? 我们只将输入传递给self.double_conv(),它由nn.Sequential()定义,模型的输出直接返回给forward()主调函数
        return self.double_conv(x)
class Down(nn.Module):
    def __init__(self, in_channels, out_channels):
        super().__init__()
        self.maxpool_conv = nn.Sequential(
            nn.MaxPool2d(2),
            DdoubleConv(in_channels,out_channels)
        )
    def forward(self,x):
        return self.maxpool_conv(x)
class Up(nn.Module):
    def __init__(self, in_channels, out_channels, bilinear=True):
        #? dilation:控制 kernel 点之间的空间距离,
        if bilinear:
            self.up = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
            #? torch.nn.Upsample(size=None, scale_factor=None, mode='nearest', align_corners=None)
            #? size:据不同的输入制定输出大小;
            #? scale_factor:指定输出为输入的多少倍数;
            #? mode:可使用的上采样算法,有nearest,linear,bilinear,bicubic 和 trilinear。默认使用nearest;
            #? align_corners :如果为 True,输入的角像素将与输出张量对齐,因此将保存下来这些像素的值。
            self.conv = DdoubleConv(in_channels, out_channels, in_channels//2)
        else:
            self.np = nn.ConvTranspose2d(in_channels,in_channels//2,kernel_size=2,stride=2)
            self.conv = DdoubleConv(in_channels,out_channels)
    
    def forward(self,x1,x2):
        x1 = self.up(x1)
        
        diffY = x2.size()[2] - x1.size()[2]
        diffX = x2.size()[3] - x1.size()[3]
        
        x1 = F.pad(x1,[diffX//2,diffX - diffX//2,
                       diffY//2,diffY - diffY//2])
        x = torch.cat([x2,x1],dim=1)
        return self.conv(x)
class OutConv(nn.Module):
    def __init__ (self,in_channels, out_channels):
        super(OutConv,self).__init__()
        self.conv = nn.Conv2d(in_channels,out_channels,kernel_size=1)
    def forward(self,x):
        return self.conv(x)

2.5 U-Net模型块组装

class UNet(nn.Module):
    def __init__ (self, n_channels, n_classes, bilinear=True):
        super(UNet,self).__init__()
        self.n_channels = n_channels
        self.n_classes = n_classes
        self.bilinear = bilinear
        
        self.inc = DdoubleConv(n_channels,64)
        self.down1 = Down(64,128)
        self.down1 = Down(128,256)
        self.down3 = Down(256,512)
        factor = 2 if bilinear else 1
        self.down4 = Down(512,1024//factor)
        self.up1 = Up(1024, 512 // factor, bilinear)
        self.up2 = Up(512, 256 // factor, bilinear)
        self.up3 = Up(256, 128 // factor, bilinear)
        self.up4 = Up(128, 64, bilinear)
        self.outc = OutConv(64, n_classes)
        
    def forward(self, x):
        x1 = self.inc(x)
        x2 = self.down1(x1)
        x3 = self.down2(x2)
        x4 = self.down3(x3)
        x5 = self.down4(x4)
        x = self.up1(x5, x4)
        x = self.up2(x, x3)
        x = self.up3(x, x2)
        x = self.up4(x, x1)
        logits = self.outc(x)
        return logits

3. PyTorch修改模型

3.1 修改模型层

先查看模型的定义:

import torchvision.models as models
net = models.resnet50()
print(net)

        假设我们要用这个resnet模型去做一个10分类的问题,就应该修改模型的fc层,将其输出节点数替换为10。另外,我们觉得一层全连接层可能太少了,想再加一层。可以做如下修改:

from collections import OrderedDict
classifier = nn.Sequential(
    OrderedDict([('fc1', nn.Linear(2048, 128)),
                 ('relu1', nn.ReLU()), 
                 ('dropout1',nn.Dropout(0.5)),
                 ('fc2', nn.Linear(128, 10)),
                 ('output', nn.Softmax(dim=1))
                ]))
    
net.fc = classifier

3.2  添加外部输入 

        基本思路是:将原模型添加输入位置前的部分作为一个整体,同时在forward中定义好原模型不变的部分、添加的输入和后续层之间的连接关系,从而完成模型的修改。

        我们希望利用已有的模型结构,在倒数第二层增加一个额外的输入变量add_variable来辅助预测。

class Model(nn.Module):
    def __init__(self, net):
        super(Model, self).__init__()
        self.net = net
        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(0.5)
        self.fc_add = nn.Linear(1001, 10, bias=True)
        self.output = nn.Softmax(dim=1)
        
    def forward(self, x, add_variable):
        x = self.net(x)
        x = torch.cat((self.dropout(self.relu(x)), add_variable.unsqueeze(1)),1)
        x = self.fc_add(x)
        x = self.output(x)
        return x

3.3 添加额外输出

        基本的思路是修改模型定义中forward函数的return变量。

        在已经定义好的模型上,同时输出了1000维的倒数第二层,还有10维的最后一层结构。

class Model(nn.Module):
    def __init__(self, net):
        super(Model, self).__init__()
        self.net = net
        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(0.5)
        self.fc1 = nn.Linear(1000, 10, bias=True)
        self.output = nn.Softmax(dim=1)
        
    def forward(self, x, add_variable):
        x1000 = self.net(x)
        x10 = self.dropout(self.relu(x1000))
        x10 = self.fc1(x10)
        x10 = self.output(x10)
        return x10, x1000

实战:从零到一,在Windows上训练自定义数据集的PyTorch Mask R-CNN模型 本文提供了在Windows系统上从零开始训练自定义数据集PyTorch Mask R-CNN模型的完整实战指南。详细介绍了环境搭建、数据准备、代码配置与训练调试全流程,重点解决了非公共数据集转换为COCO格式的关键步骤,帮助开发者高效完成自定义实例分割模型的训练与部署。 阅读详情

相关推荐

pytorch自定义初始化权重

在常见的pytorch代码中,我们见到的初始化方式都是调用init类对每层所有参数进行初始化。但是,有时我们有些特殊需求,比如用某一层的权重取优化其它层,或者手动指定某些权重的初始值。 核心思想就是构造和该层权重同一尺寸的矩阵去对该层权重赋值。但是,值得注意的是,pytorch中各层权重的数据类型是nn.Parameter,而不是Tensor或者Variable。 import torch ...

goodxin_ie的博客 1万+

PyTorch(四)——PyTorch模型定义

PyTorch模型定义的方式 equential ModuleList ModuleDict 三种方法比较与适用场景 利用模型块快速搭建复杂网络 U-Net简介 U-Net模型块分析 U-Net模型块实现 利用模型块组装U-Net PyTorch修改模型 修改模型层 添加外部输入 添加额外输出 PyTorch模型保存与读取 模型存储格式 模型存储内容 单卡和多卡模型存储的区别 情况分类讨论...

qq_44941689的博客 2696

使用pytorch构建LSTM_AE模型的两种方式

2.基本LSTM_Unit计算——基本LSTM_AE结构 3.自定义LSTM_Unit计算——自定义LSTM_AE结构 1.LSTM-Encoder-Decoder模型结构及简要解析 图基本lstm计算单元

qq_37840762的博客 7275

深入解析PyTorch中的模型定义:原理、代码示例及应用

在机器学习和深度学习领域,PyTorch是一种广泛使用的开源深度学习框架。它提供了丰富的工具和函数,方便用户定义、训练和部署各种深度学习模型。本篇博客将详细介绍PyTorch中模型定义的方式,并结合原理和代码示例进行讲解,旨在帮助读者深入理解PyTorch的模型定义过程。

WeLearnNLP 5247

pytorch保存最终模型方式:①、直接保存模型,加载模型的时候直接把读取的模型给一个参数就行;②、只保存参数,在读取模型参数前要先定义一个模型(模型必须与原模型相同的构造),然后对这个模型导入参数

一、直接保存整个模型并读取 第一种方法可以直接保存模型,加载模型的时候直接把读取的模型给一个参数就行。 # 创建你的模型实例对象: model model = net() ## 保存模型 torch.save(model, 'model_name.pth') ## 读取模型 model = torch.load('model_name.pth') 二、只保存模型中的参数并读取 ## 保存模型 torch.save({'model': model.state_dict()}, 'model_name.p

u013250861的博客 988

pytorch中如何自定义一个模型,如何建立层以及层和层之间的关系,一看就懂系列

pytorch中自定义模型操作都是继承nn.Module类来实现。构造函数__init__里面,定义一系列层,forword里面实现层和层之间的关系

pvmsmfchcs的博客 1188

pytorch模型

pytorch模型基本搭建过程及存储、加载

Gu_NN的博客 2716

Pytorch使用手册-快速开始(专题一)

在 PyTorch 中,定义神经网络需要创建一个继承自。

436

【Pytorch】模型部署

pytorch 模型部署 教程

高朗的博客 3503

AudioTrack音频播放流程深度解析

深入解析Android AudioTrack音频播放的完整链路:从Java API到Native层,从共享内存Ring Buffer机制到FAST Track低延迟优化,配合源码分析带你彻底搞懂Android音频播放的底层原理

Cheson的专栏 940

基于51单片机的通讯聊天系统

通过编写51单片机通讯聊天程序,掌握51单片机的各个模块的知识点和运用C语言编写51单片机的能力。用51单片机与口袋开发板设计实现一个单片机与电脑串口助手实现通讯功能的程序。程序的主要功能如下: 1 OLED初始化显示Welcome to Bluetooth communication! 字符串。 2 程序开始时处于接收信息模式, 电脑串口助手发送信息时,将从初始化字符第一个开始显示,电脑串口助手发送信息后,蜂鸣器响铃2秒左右。 3 每次同时按下左右键时,可以轮流切换接收/发送信息模式 4 在发送信息模式时

m0_47419053的博客 3639

pytorch 模型的保存与加载

pytorch 模型的保存与加载

zyxzyx_的博客 1052

APP抓包-代理转发绕过反代理+Xposed绕过证书校验

而这里的牛牛不止设置了反代理还设置了证书校验,一闪而过的三个数据包就是在校验证书。而proxifier工具的转发机制获取的是网络接口出口数据,相当于是在网络接口设代理。这个时候就可以在夜神打开牛牛开始抓包了,打开牛牛可以看到proxifier有夜神流量通过。关闭代理之后牛牛就正常了,可恶的牛牛啊,这样我没办法抓包啊,怎么办啊。模拟器开启代理,burp开启监听。打开牛牛app,牛牛不在报错。牛牛app检测的是系统代理,也就是在模拟器或手机上设置的代理。再在浏览器下载两个模块,在夜神安装,用来屏蔽证书校验。

xiaoheizi的博客 7532

人工智能(Pytorch)搭建模型2-LSTM网络实现简单案例

LSTM网络是一种特殊的循环神经网络,它能够学习处理序列中的长期依赖性,而不会受到梯度消失或梯度爆炸的影响。LSTM中的关键组成部分是门控机制,它允许网络选择性地丢弃或保留信息。在训练过程中,LSTM网络通过反向传播算法自动调整门控单元的参数,使其能够更好地适应数据。PyTorch是一个基于Python的深度学习框架,提供了自动求导机制、强大的GPU支持和动态图等特性。PyTorch搭建神经网络的具体步骤都是按照以上模板进行搭建的,大家可以记住以上步骤。:决定从前一个时间步的记忆状态中删除哪些信息。

微学AI的博客 1万+

告别单一查询!MultiQueryRetriever在LangChain中的高级用法解析

本文深入解析了LangChain中的MultiQueryRetriever高级用法,该工具通过大语言模型自动生成多样化查询,显著提升文档检索的召回率和准确性。文章详细介绍了其核心机制、高级配置调优策略以及在多语言和专业领域中的实际应用,为开发者提供了优化知识库问答系统的实用方案。

weixin_28730927的博客 271

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3657

画pytorch模型图,以及参数计算

刚入pytorch的坑,代码还没看太懂。之前用keras用习惯了,第一次使用pytorch还有些不适应,希望广大老司机多多指教。 首先说说,我们如何可视化模型。在keras中就一句话,keras.summary(),或者plot_model(),就可以把模型展现的淋漓尽致。 但是pytorch中好像没有这样一个api让我们直观的看到模型的样子。但是有网友提供了一段代码,可以把模型画出来...

506

Open Dynamics Engine(ODE)物理引擎教程(1)--下载与安装准备

引言 ODE是一个免费的工业级库,用于模拟关节式刚体动力学,例如地面车辆、腿部生物和虚拟现实环境中的移动对象。它具有快速、灵活、健壮和独立于平台的特点,具有先进的关节、摩擦接触和内置的碰撞检测功能。 项目主页:http://www.ode.org/ 线上手册:http://ode.org/wiki/index.php?title=Manual 本教程为博主亲自亲测过程的总结,转载请注明出处! ...

腿足机器人领域 2216

如何保存和读取pytorch模型

如何保存和读取pytorch模型1. 相信大家也会遇到这样的问题吧,在使用pytorch训练自己模型的时候,如果不将我们训练的模型保存起来,我们每一次都是从头开始训练我们的模型,这样真的很麻烦。其实在我的上一篇博客中我已经发现这个问题了。 1. ...

weixin_38468077的博客 1262

Oracle 11g安装教程(保姆级超详细安装教程)

Oracle详细安装步骤,每一步都配有图例引导 ORACLE是数据库(Oracle服务端)。是连接数据库的客户端(Oracle客户端)。是连接oracle的可视化客户端软件。

2302_81846649的博客 1万+

人工智能面试总结-分类与聚类

目录说说常用的分类算法,以及各自的优缺点?说说为什么正确率有时不能有效评估分类算法?说说什么样的分类器最好?说说聚类算法有哪些衡量标准?(选看)各聚类算法性能比较汇总说说什么是聚类,你知道哪些聚类算法?具体展开介绍你知道的聚类算法?说说K-Means聚类算法流程?说说K-Means聚类算法如何调优?说说K-Means聚类算法如何选择初始点?说说K-Means聚类聚的是特征还是样本?说说K-Means聚类的特征距离是如何计算的?说说聚类与分类的区别?手撕K-Means聚类 说说常用的分类算法,以及各自的优缺点

啥都生的博客 3865

PyTorch-网络模型的保存和读取

网络模型的保存和加载(读取)。

qq_61706112的博客 926

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

如何从Pytorch中导出ONNX模型并使用它实现图像超分

在本教程中,我们将介绍如何将 PyTorch 中定义的模型转换为 ONNX 格式,然后使用 ONNX 运行时运行它。ONNX 运行时是面向 ONNX 模型的以性能为中心的引擎,可跨多个平台和硬件(Windows、Linux 和 Mac)以及 CPU 和 GPU 进行高效推理。ONNX 运行时已被证明可以显著提高多个模型的性能,如此处所述。对于本教程,您需要安装 ONNX 和 ONNX 运行时。可以使用获取 ONNX 和 ONNX 运行时的二进制生成。

金戈鐡馬 1290

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【pytorch】线性回归模型

线性回归是机器学习中最简单的模型了,简单来说就是给定一定的数据点,我们需要给定一条直线y=w*x+b,确定w和b的取值,让所有数据点到这条线的距离最短。 在进行回归的时候我们使用均方差作为损失函数,训练的目标就是让损失函数的值最小。 下面这段代码是可以跑通的 #coding=utf-8 """ 一阶线性回归 """ import numpy as np import torch from...

haohulala的博客 660

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Pytorch——模型的保存与加载

1. 方法一(保存模型及参数) vgg16_false = torchvision.models.vgg16(pretrained=False)##加载初始模型,模型参数还没有训练 torch.save(vgg16_false, "method1.pth") torch.load("method1.pth") 2. 方法二(仅保存模型参数) torch.save(vgg16_false.state_dict(), "method2.pth") torch.load("method2.pth") 注:当

qq_42374603的博客 1351

17.初识Pytorch保存模型(model save)与加载模型(model load)

模型的保存有两种方式:一种是保存模型;另一种是保存模型的参数,将参数以字典的形式保存(官方推荐)。 There are two ways to save the model: one is to save the model; the other is to save the parameters of the model, and save the parameters in the form of a dictionary (official recommendation). code: impo

对方正在输入中... 2844
上一篇: 788. 逆序对的数量
下一篇: 1. 机器学习绪论
暮棂
博客等级 码龄8年 340粉丝 103原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮棂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值