神经网络框架-Pytorch使用介绍

VIP 从零开始安装pytorch(包含GPU和CPU版本的安装) Pytorch是。 开通可读全文·8.2w 阅读·262 点赞·909 收藏 阅读全文

Pytorch上手使用


近期学习了另一个深度学习框架库Pytorch,对学习进行一些总结,方便自己回顾。

Pytorch是torch的python版本,是由Facebook开源的神经网络框架。与Tensorflow的静态计算图不同,pytorch的计算图是动态的,可以根据计算需要实时改变计算图。

1 安装

如果已经安装了cuda8,则使用pip来安装pytorch会十分简单。若使用其他版本的cuda,则需要下载官方释放出来对应的安装包。具体安装地址参见官网的首页。
目前最新稳定版本为0.4.0。上个版本0.3.0的文档有中文版,见中文文档。

pip install torch torchvision  # for python2.7
pip3 install torch torchvision  # for python3

2 概述

理解pytorch的基础主要从以下三个方面

  • Numpy风格的Tensor操作。pytorch中tensor提供的API参考了Numpy的设计,因此熟悉Numpy的用户基本上可以无缝理解,并创建和操作tensor,同时torch中的数组和Numpy数组对象可以无缝的对接。
  • 变量自动求导。在一序列计算过程形成的计算图中,参与的变量可以方便的计算自己对目标函数的梯度。这样就可以方便的实现神经网络的后向传播过程。
  • 神经网络层与损失函数优化等高层封装。网络层的封装存在于torch.nn模块,损失函数由torch.nn.functional模块提供,优化函数由torch.optim模块提供。

因此下面的内容也主要围绕这三个方面来介绍。第3节介绍张量的操作,第4节介绍自动求导,第5节介绍神经网络层等的封装,第6,7节简单介绍损失函数与优化方法。这三部分相对重要。后续的第8节介绍介绍数据集及torchvision,第9节介绍训练过程可视的工具,第10节通过相对完整的示例代码展示pytorch中如何解决MNIST与CIFAR10的分类。

3 Tensor(张量)

Tensor是神经网络框架中重要的基础数据类型,可以简单理解为N维数组的容器对象。tensor之间的通过运算进行连接,从而形成计算图。

3.1 Tensor类型

Torch 定义了七种 CPU tensor 类型和八种 GPU tensor 类型:

Data typeCPU tensorGPU tensor
32-bit floating pointtorch.FloatTensortorch.cuda.FloatTensor
64-bit floating pointtorch.DoubleTensortorch.cuda.DoubleTensor
16-bit floating pointtorch.HalfTensortorch.cuda.HalfTensor
8-bit integer (unsigned)torch.ByteTensortorch.cuda.ByteTensor
8-bit integer (signed)torch.CharTensortorch.cuda.CharTensor
16-bit integer (signed)torch.ShortTensortorch.cuda.ShortTensor
32-bit integer (signed)torch.IntTensortorch.cuda.IntTensor
64-bit integer (signed)torch.LongTensortorch.cuda.LongTensor

通常情况下使用Tensor类的构造函数返回的是FloatTensor类型对象,可通过在对象上调用cuda()返回一个新的cuda.FloatTensor类型的对象。

torch模块内提供了操作tensor的接口,而Tensor类型的对象上也设计了对应了接口。例如torch.add()与tensor.add()等价。需要注意的是这些接口都采用创建一个新对象返回的形式。如果想就地修改一个tensor对象,需要使用加后缀下划线的方法。例如x.add_(y),将修改x。Tensor类的构建函数支持从列表或ndarray等类型进行构建。默认tensor为FloatTensor。

下面的几节简单的描述重要的操作tensor的方法。

3.1 tensor的常见创建接口

方法名说明
Tensor()直接从参数构造一个的张量,参数支持list,numpy数组
eye(row, column)创建指定行数,列数的二维单位tensor
linspace(start,end,count)在区间[s,e]上创建c个tensor
logspace(s,e,c)在区间[10^s, 10^e]上创建c个tensor
ones(*size)返回指定shape的张量,元素初始为1
zeros(*size)返回指定shape的张量,元素初始为0
ones_like(t)返回与t的shape相同的张量,且元素初始为1
zeros_like(t)返回与t的shape相同的张量,且元素初始为0
arange(s,e,sep)在区间[s,e)上以间隔sep生成一个序列张量

3.2 随机采样

方法名说明
rand(*size)在区间[0,1)返回一个均匀分布的随机数张量
uniform(s,e)在指定区间[s,e]上生成一个均匀分布的张量
randn(*size)返回正态分布N(0,1)取样的随机数张量
normal(means, std)返回一个正态分布N(means, std)

3.3 序列化

方法名说明
save(obj, path)张量对象的保存,通过pickle进行
load(path)从文件中反序列化一个张量对象

3.4 数学操作

这些方法均为逐元素处理方法

方法名说明
abs绝对值
add加法
addcdiv(t, v, t1, t2)t1与t2的按元素除后,乘v加t
addcmul(t, v, t1, t2)t1与t2的按元素乘后,乘v加t
ceil向上取整
floor向下取整
clamp(t, min, max)将张量元素限制在指定区间
exp指数
log对数
pow幂
mul逐元素乘法
neg取反
sigmoid
sign取符号
sqrt开根号
tanh

注:这些操作均创建新的tensor,如果需要就地操作,可以使用这些方法的下划线版本,例如abs_。

3.5 归约方法

方法名说明
cumprod(t, axis)在指定维度对t进行累积
cumsum在指定维度对t进行累加
dist(a,b,p=2)返回a,b之间的p阶范数
mean均值
median中位数
std标准差
var方差
norm(t,p=2)返回t的p阶范数
prod(t)返回t所有元素的积
sum(t)返回t所有元素的和

3.6 比较方法

方法名说明
eq比较tensor是否相等,支持broadcast
equal比较tensor是否有相同的shape与值
ge/le大于/小于比较
gt/lt大于等于/小于等于比较
max/min(t,axis)返回最值,若指定axis,则额外返回下标
topk(t,k,axis)在指定的axis维上取最高的K个值

3.7 其他操作

方法名说明
cat(iterable, axis)在指定的维度上拼接序列
chunk(tensor, c, axis)在指定的维度上分割tensor
squeeze(input,dim)将张量维度为1的dim进行压缩,不指定dim则压缩所有维度为1的维
unsqueeze(dim)squeeze操作的逆操作
transpose(t)计算矩阵的转置换
cross(a, b, axis)在指定维度上计算向量积
diag返回对角线元素
hist(t, bins)计算直方图
trace返回迹

3.8 矩阵操作

方法名说明
dot(t1, t2)计算张量的内积
mm(t1, t2)计算矩阵乘法
mv(t1, v1)计算矩阵与向量乘法
qr(t)计算t的QR分解
svd(t)计算t的SVD分解

3.9 tensor对象的方法

方法名作用
size()返回张量的shape属性值
numel(input)计算tensor的元素个数
view(*shape)修改tensor的shape,与np.reshape类似,view返回的对象共享内存
resize类似于view,但在size超出时会重新分配内存空间
item若为单元素tensor,则返回pyton的scalar
from_numpy从numpy数据填充
numpy返回ndarray类型

3.10 tensor内部

tensor对象由两部分组成,tensor的信息与存储,storage封装了真正的data,可以由多个tensor共享。大多数操作只是修改tensor的信息,而不修改storage部分。这样达到效率与性能的提升。

3.11 使用pytorch进行线性回归

import torch
import torch.optim as optim
import matplotlib.pyplot as plt

def get_fake_data(batch_size=32):
    ''' y=x*2+3 '''
    x = torch.randn(batch_size, 1) * 20
    y = x * 2 + 3 + torch.randn(batch_size, 1)
    return x, y

x, y = get_fake_data()

class LinerRegress(torch.nn.Module):
    def __init__(self):
        super(LinerRegress, self).__init__()
        self.fc1 = torch.nn.Linear(1, 1)

    def forward(self, x):
        return self.fc1(x)


net = LinerRegress()
loss_func = torch.nn.MSELoss()
optimzer = optim.SGD(net.parameters())

for i in range(40000):
    optimzer.zero_grad()

    out = net(x)
    loss = loss_func(out, y)
    loss.backward()

    optimzer.step()

w, b = [param.item() for param in net.parameters()]
print w, b  # 2.01146, 3.184525

# 显示原始点与拟合直线
plt.scatter(x.squeeze().numpy(), y.squeeze().numpy())
plt.plot(x.squeeze().numpy(), (x*w + b).squeeze().numpy())
plt.show()

这里写图片描述

从这里的代码可以发现,pytorch需要我们自己实现各轮更新,并手动调用反向传播以及更新参数,此外也没有提供评估及预测功能。相对于Keras这种高层的封装,pytorch需要我们了解更多的低层细节。

4 自动求导

tensor对象通过一系列的运算可以组成动态图,对于每个tensor对象,有下面几个变量控制求导的属性。

变量作用
requirs_grad默认为False,表示变量是否需要计算导数
grad_fn变量的梯度函数
grad变量对应的梯度

在0.3.0版本中,自动求导还需要借助于Variable类来完成,在0.4.0版本中,Variable已经被废除了,tensor自身即可完成这一过程。

import torch

x = torch.randn((4,4), requires_grad=True)
y = 2*x
z = y.sum()

print z.requires_grad  # True

z.backward()

print x.grad
'''
tensor([[ 2.,  2.,  2.,  2.],
        [ 2.,  2.,  2.,  2.],
        [ 2.,  2.,  2.,  2.],
        [ 2.,  2.,  2.,  2.]])
'''

5 创建神经网络

5.1 神经网络层

torch.nn模块提供了创建神经网络的基础构件,这些层都继承自Module类。下面我们简单看下如何实现Liner层。

class Liner(torch.nn.Module):
    def __init__(self,in_features, out_features, bias=True):
        super(Liner, self).__init__()
        self.weight = torch.nn.Parameter(torch.randn(out_features, in_features))
        if bias:
            self.bias = torch.nn.Parameter(torch.randn(out_features))

    def forward(self, x):
        x = x.mm(self.weight)
        if self.bias:
            x = x + self.bias.expand_as(x)
        return x

下面表格中列出了比较重要的神经网络层组件。对应的在nn.functional模块中,提供这些层对应的函数实现。通常对于可训练参数的层使用module,而对于不需要训练参数的层如softmax这些,可以使用functional中的函数。

Layer对应的类功能说明
Linear(in_dim, out_dim, bias=True)提供了进行线性变换操作的功能
Dropout(p)Dropout层,有2D,3D的类型
Conv2d(in_c, out_c, filter_size, stride, padding)二维卷积层,类似的有Conv1d,Conv3d
ConvTranspose2d()
MaxPool2d(filter_size, stride, padding)二维最大池化层
MaxUnpool2d(filter, stride, padding)逆过程
AvgPool2d(filter_size, stride, padding)二维平均池化层
FractionalMaxPool2d分数最大池化
AdaptiveMaxPool2d([h,w])自适应最大池化
AdaptiveAvgPool2d([h,w])自自应平均池化
ZeroPad2d(padding_size)零填充边界
ConstantPad2d(padding_size,const)常量填充边界
ReplicationPad2d(ps)复制填充边界
BatchNorm1d()对2维或3维小批量数据进行标准化操作
RNN(in_dim, hidden_dim, num_layers, activation, dropout, bidi, bias)构建RNN层
RNNCell(in_dim, hidden_dim, bias, activation)RNN单元
LSTM(in_dim, hidden_dim, num_layers, activation, dropout, bidi, bias)构建LSTM层
LSTMCell(in_dim, hidden_dim, bias, activation)LSTM单元
GRU(in_dim, hidden_dim, num_layers, activation, dropout, bidi, bias)构建GRU层
GRUCell(in_dim, hidden_dim, bias, activation)GRU单元

5.2 非线性激活层

激活层类名作用
ReLU(inplace=False)Relu激活层
SigmoidSigmoid激活层
TanhTanh激活层
SoftmaxSoftmax激活层
Softmax2d
LogSoftmaxLogSoftmax激活层

5.3 容器类型

容器类型功能
Module神经网络模块的基类
Sequential序列模型,类似于keras,用于构建序列型神经网络
ModuleList用于存储层,不接受输入
Parameters(t)模块的属性,用于保存其训练参数
ParameterList参数列表

下面的代码演示了使用容器型模块的方式。

# 方法1
model1 = nn.Sequential()
model.add_module('fc1', nn.Linear(3,4))
model.add_module('fc2', nn.Linear(4,2))
model.add_module('output', nn.Softmax(2))

# 方法2
model2 = nn.Sequential(
          nn.Conv2d(1,20,5),
          nn.ReLU(),
          nn.Conv2d(20,64,5),
          nn.ReLU()
        )
# 方法3        
model3 = nn.ModuleList([nn.Linear(3,4), nn.ReLU(), nn.Linear(4,2)])

5.4 其他层

容器类型功能
Embedding(vocab_size, feature_dim)词向量层
Embeddingbag

5.5 模型的保存

前面我们知道tensor可以通过save与load方法实现序列化与反序列化。由tensor组成的网络同样也可以方便的保存。不过通常没有必要完全保存网络模块对象,只需要保存各层的权重数据即可,这些数据保存在模块的state_dict字典中,因此只需要序列化这个词典。

# 模型的保存
torch.save(model.state_dict, 'path')
# 模型的加载
model.load_state_dict('path)

5.6 实现LeNet神经网络

torch.nn.Module提供了神经网络的基类,当实现神经网络时需要继承自此模块,并在初始化函数中创建网络需要包含的层,并实现forward函数完成前向计算,网络的反向计算会由自动求导机制处理。

下面的示例代码创建了LeNet的卷积神经网络。通常将需要训练的层写在init函数中,将参数不需要训练的层在forward方法里调用对应的函数来实现相应的层。

import torch.nn as nn
import torch.nn.functional as F

class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = F.max_pool2d(F.relu(self.conv1(x)), 2)
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

6 损失函数与优化方法

6.1 损失函数

torch.nn模块中提供了许多损失函数类,这里列出几种相对常见的。

类名功能
MSELoss均方差损失
CrossEntropyLoss交叉熵损失
NLLLoss负对数似然损失
PoissonNLLLoss带泊松分布的负对数似然损失

6.2 优化方法

由torch.optim模块提供支持

类名功能
SGD(params, lr=0.1, momentum=0, dampening=0, weight_decay=0, nesterov=False)随机梯度下降法
Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)Adam
RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)RMSprop
Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)Adadelta
Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0)Adagrad
lr_scheduler.ReduceLROnPlateau(optimizer, mode=’min’, factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode=’rel’, cooldown=0, min_lr=0, eps=1e-08)学习率的控制

在神经网络的性能调优中,常见的作法是对不对层的网络设置不同的学习率。

class model(nn.Module):
    def __init__():
        super(model,self).__init__()
        self.base = Sequencial()
        # code for base sub module
        self.classifier = Sequencial()
        # code for classifier sub module

optim.SGD([
            {'params': model.base.parameters()},
            {'params': model.classifier.parameters(), 'lr': 1e-3}
            ], lr=1e-2, momentum=0.9)

6.3 参数初始化

良好的初始化可以让模型快速收敛,有时甚至可以决定模型是否能训练成功。Pytorch中的参数通常有默认的初始化策略,不需要我们自己指定,但框架仍然留有相应的接口供我们来调整初始化方法。

初始化方法说明
xavier_uniform_
xavier_normal_
kaiming_uniform_
from torch.nn import init

# net的类定义
...

# 初始化各层权重
for name, params in net.named_parameters():
    init.xavier_normal(param[0])
    init.xavier_normal(param[1])

7 数据集与数据加载器

7.1 DataSet与DataLoader

torch.util.data模块提供了DataSet类用于描述一个数据集。定义自己的数据集需要继承自DataSet类,且实现__getitem__()与__len__()方法。__getitem__方法返回指定索引处的tensor与其对应的label。

为了支持数据的批量及随机化操作,可以使用data模块下的DataLoader类型来返回一个加载器:
DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0)

7.2 torchvision简介

torchvision是配合pytorch的独立计算机视觉数据集的工具库,下面介绍其中常用的数据集类型。

torchvision.datasets.ImageFolder(dir, transform, label_map,loader)
提供了从一个目录初始化出来一个图片数据集的便捷方法。
要求目录下的图片分类存放,每一类的图片存储在以类名为目录名的目录下,方法会将每个类名映射到唯一的数字上,如果你对数字有要求,可以用label_map来定义目录名到数字的映射。

torchvision.datasets.DatasetFolder(dir,transform, label_map, loader, extensions)
提供了从一个目录初始化一般数据集的便捷方法。目录下的数据分类存放,每类数据存储在class_xxx命名的目录下。

此外torchvision.datasets下实现了常用的数据集,如CIFAR-10/100, ImageNet, COCO, MNIST, LSUN等。

除了数据集,torchvision的model模块提供了常见的模型实现,如Alex-Net, VGG,Inception, Resnet等。

7.3 torchvision提供的图像变换工具

torchvision的transforms模块提供了对PIL.Image对象和Tensor对象的常见操作。如果需要连续应用多个变换,可以使用Compose对象组装多个变换。

转换操作说明
ScalePIL图片进行缩放
CenterCropPIL图片从中心位置剪切
PadPIL图片填充
ToTensorPIL图片转换为Tensor且归一化到[0,1]
NormalizeTensor标准化
ToPILImage将Tensor转为PIL表示
import torchvision.tranforms as Trans
tranform = Trans.Compose([
                          T.Scale(28*28), 
                          T.ToTensor(), 
                          T.Normalize([0.5],[0.5])
                         ])

8 训练过程可视化

8.1 使用Tensorboard

通过使用第三方库tensorboard_logger,将训练过程中的数据保存为日志,然后便可以通过Tensorboard来查看这些数据了。其功能支持相对有限,这里不做过多介绍。

8.2 使用visdom

visdom是facebook开源的一个可视工具,可以用来完成pytorch训练过程的可视化。
安装可以使用pip install visdom
启动类似于tb,在命令行上执行:python -m visdom.server
服务启动后可以使用浏览器打开http://127.0.0.1:8097/即可看到主面板。

visdom的绘图API类似于plot,通过API将绘图数据发送到基于tornado的web服务器上并显示在浏览器中。更详细内容参见visdom的github主页

9 GPU及并行支持

为了能在GPU上运行,Tensor与Module都需要转换到cuda模式下。

import torch
import torchvision

t = torch.Tensor(3,4)
print t.is_cuda #False
t = t.cuda(0)
print t.is_cuda #True

net = torchvision.model.AlexNet()
net.cuda(0)

如果有多块显卡,可以通过cuda(device_id)来将tensor分到不同的GPU上以达到负载的均衡。

另一种比较省事的做法是调用torch.set_default_tensor_type使程序默认使用某种cuda的tensor。或者使用torch.cuda.set_device(id)指定使用某个GPU。

10 示例:Pytorch实现CIFAR10与MNIST分类

关于cifar10与mnist数据集不再进行解释了。这里的Model类实现的二者的共同的任务,借鉴了keras的接口方式,Model类提供了train与evaluat方法,并没有实现序列模型的添加方法以及predict方法。此外设定损失函数与优化函数时,也只是简单的全部实例化出来,根据参数选择其中的一个,这里完全可以根据参数动态创建。

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import torchvision
import torchvision.transforms as transforms

class Model:
    def __init__(self, net, cost, optimist):
        self.net = net
        self.cost = self.create_cost(cost)
        self.optimizer = self.create_optimizer(optimist)
        pass

    def create_cost(self, cost):
        support_cost = {
            'CROSS_ENTROPY': nn.CrossEntropyLoss(),
            'MSE': nn.MSELoss()
        }

        return support_cost[cost]

    def create_optimizer(self, optimist, **rests):
        support_optim = {
            'SGD': optim.SGD(self.net.parameters(), lr=0.1, **rests),
            'ADAM': optim.Adam(self.net.parameters(), lr=0.01, **rests),
            'RMSP':optim.RMSprop(self.net.parameters(), lr=0.001, **rest)
        }

        return support_optim[optimist]

    def train(self, train_loader, epoches=3):
        for epoch in range(epoches):
            running_loss = 0.0
            for i, data in enumerate(train_loader, 0):
                inputs, labels = data

                self.optimizer.zero_grad()

                # forward + backward + optimize
                outputs = self.net(inputs)
                loss = self.cost(outputs, labels)
                loss.backward()
                self.optimizer.step()

                running_loss += loss.item()
                if i % 100 == 0:
                    print('[epoch %d, %.2f%%] loss: %.3f' %
                          (epoch + 1, (i + 1)*1./len(train_loader), running_loss / 100))
                    running_loss = 0.0

        print('Finished Training')

    def evaluate(self, test_loader):
        print('Evaluating ...')
        correct = 0
        total = 0
        with torch.no_grad():  # no grad when test and predict
            for data in test_loader:
                images, labels = data

                outputs = self.net(images)
                predicted = torch.argmax(outputs, 1)
                total += labels.size(0)
                correct += (predicted == labels).sum().item()

        print('Accuracy of the network on the test images: %d %%' % (100 * correct / total))


classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')


def cifar_load_data():
    transform = transforms.Compose(
        [transforms.ToTensor(),
         transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

    trainset = torchvision.datasets.CIFAR10(root='./data', train=True,download=True, transform=transform)
    trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,shuffle=True, num_workers=2)

    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)

    return trainloader, testloader


class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = F.max_pool2d(F.relu(self.conv1(x)), 2)
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

def mnist_load_data():
    transform = transforms.Compose(
        [transforms.ToTensor(),
         transforms.Normalize([0,], [1,])])

    trainset = torchvision.datasets.MNIST(root='./data', train=True,
                                            download=True, transform=transform)
    trainloader = torch.utils.data.DataLoader(trainset, batch_size=32,
                                              shuffle=True, num_workers=2)

    testset = torchvision.datasets.MNIST(root='./data', train=False,
                                           download=True, transform=transform)
    testloader = torch.utils.data.DataLoader(testset, batch_size=32,shuffle=True, num_workers=2)
    return trainloader, testloader


class MnistNet(torch.nn.Module):
    def __init__(self):
        super(MnistNet, self).__init__()
        self.fc1 = torch.nn.Linear(28*28, 512)
        self.fc2 = torch.nn.Linear(512, 512)
        self.fc3 = torch.nn.Linear(512, 10)

    def forward(self, x):
        x = x.view(-1, 28*28)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.softmax(self.fc3(x), dim=1)
        return x


if __name__ == '__main__':
    # train for mnist
    net = MnistNet()
    model = Model(net, 'CROSS_ENTROPY', 'RMSP')
    train_loader, test_loader = mnist_load_data()
    model.train(train_loader)
    model.evaluate(test_loader)

    # train for cifar
    net = LeNet()
    model = Model(net, 'CROSS_ENTROPY', 'RMSP')
    train_loader, test_loader = cifar_load_data()
    model.train(train_loader)
    model.evaluate(test_loader)

VIP Pytorch 最全入门介绍,看这一篇就够了 在这一部分,我们将会对Pytorch做一个简单的介绍,包括它的历史、优点以及使用场景等。DataLoader类提供了对数据集的并行加载,可以有效地加载大量数据,并提供了多种数据采样方式。dataset:加载的数据集(Dataset对象)batch_size:batch大小shuffle:是否每个epoch时都打乱数据num_workers:使用多进程加载的进程数,0表示不使用多进程# 数据转换])# 下载并加载训练集# 下载并加载测试集除了使用内置的数据集,我们也可以自定义数据集。 开通可读全文·2.9k 阅读·4 点赞·29 收藏 阅读全文

相关推荐

图神经网络框架-PyTorch Geometric(PyG)的使用

PyG用torch_geometric.data.Data保存图结构的数据,导入的data(这个data指的是你导入的具体数据,不是前面那个torch_geometric.data)在PyG中会包含以下属性data.x:图节点的属性信息,比如社交网络中每个用户是一个节点,这个x可以表示用户的属性信息,维度为[num_nodes,num_node_features]

oldsummer 8462

通透讲解!Pytorch 十大核心操作全总结!!!

可以通过继承。

Python数据挖掘 1万+

【RL】Pytorch简洁教程 | 坑点总结

训练一个神经网络通畅需要以下步骤: - 定义一个神经网络,通常有一些可以训练的参数 - 迭代一个数据集(Dataset) - 处理网络的输入 - 计算损失(会调用Module对象的`forward()`方法) - 计算损失函数对参数的梯度 - 更新参数,通常使用如下的梯度下降方法来更新:`weight=weight-learning_rate × gradien`。

发现问题,并解决问题,批判性思维 8637

使用pytorch深度学习框架搭建神经网络

数据集为CIFAR10,CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成,每个类有 6000 张图像。有 50000 张训练图像和 10000 张测试图像。图像大小为3x32x32数据集分为 5 个训练批次和 1 个测试批次,每个批次有 10000 张图像。测试批次包含每个类中随机选择的 1000 张图像。训练批次包含按随机顺序排列的剩余图像,但某些训练批次可能包含来自一个类的图像多于另一个类的图像。在它们之间,训练批次正好包含来自每个类的 5000 张图像。

qq_57290048的博客 2932

PyTorch框架:(5)使用PyTorch框架构建卷积神经网络

基于pytorch构建一个非常简单的卷积神经网络,以Mnist数据集为例演示基本的流程 1、导工具包 2、读取数据 (把该写的超参数全部写出来) PS:当前输入图像的大小,注意这里使用卷积网络处理Mnist数据他就不是一个一个像素点了,既然我们要用卷积网络去做,那输入的他得是一张图像,对于一张图像我们现在的输入得是28x28x1的三维的数据,我们现在需要的数据他是三维的他是三维的。 3、卷积网络模块构建 定义的conv1不光是做了一个卷积,他是一个卷积模块,包含了卷积、...

m0_37957160的博客 781

卷积神经网络的实现框架:TensorFlow与PyTorch

卷积神经网络的实现框架:TensorFlow与PyTorch 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍 1.1 问题的由来

AI天才研究院 1498

深度学习(深度神经网络)Pytorch框架

Caffe(2015年):贾扬清开发,早期主流框架,因缺乏持续更新逐渐被淘汰。TensorFlow(2017年)一版本代码冗长,后被Keras封装简化。二版本优化底层但不兼容一版本,目前仍广泛使用。PyTorch(2018年)Facebook开发,易用性高,支持动态计算图。近年使用率显著上升(约59%),成为大模型开发的主流框架。

weixin_72931638的博客 1540

【Pytorch】2024 Pytorch基础入门教程(完整详细版)

Pytorch是torch的python版本,是由Facebook开源的神经网络框架,专门针对 GPU 加速的深度神经网络(DNN)编程。Torch 是一个经典的对多维矩阵数据进行操作的张量(tensor )库,在机器学习和其他数学密集型应用有广泛应用。与Tensorflow的静态计算图不同,pytorch的计算图是动态的,可以根据计算需要实时改变计算图。但由于Torch语言采用 Lua,导致在国内一直很小众,并逐渐被支持 Python 的 Tensorflow 抢走用户。

优快云已停更,感兴趣关注https://aaronzijingcai.github.io/ 27万+

MemCNN:高效可逆神经网络的PyTorch框架

MemCNN:高效可逆神经网络的PyTorch框架 项目介绍 MemCNN是一个基于PyTorch的开源框架,专注于开发内存高效的可逆神经网络。通过使用InvertibleModuleWrapper类,MemCNN能够显著减少训练过程中的内存消耗,同时保持模型的性能。该项目不仅提供了丰富的功能,还支持多种PyTorch版本和Python环境,确保了广泛的兼容性和易用性。 项目技术分析 MemCNN...

gitblog_01006的博客 725

给STM32F103的7寸屏找个新UI:LVGL 8.2裸机移植保姆级教程(附避坑清单)

本文详细介绍了如何将LVGL 8.2裸机移植到STM32F103开发板,特别针对7寸大屏(800×480分辨率)进行优化配置。从环境准备、工程搭建到显示驱动移植、内存优化与性能调优,提供完整的解决方案和避坑清单,帮助开发者快速实现美观的用户界面。

weixin_29181861的博客 413

解决fetch_california_housing数据集403错误的三种实用方法

本文针对机器学习初学者加载fetch_california_housing数据集时常见的HTTPError 403: Forbidden错误,提供了三种经过实测的解决方案。详细介绍了手动下载与本地替换、修改源码下载路径以及配置网络访问策略的具体步骤,帮助用户根据自身网络环境和开发场景选择最佳方法,确保数据集顺利加载。

weixin_29074295的博客 550

什么是神经网络?神经网络开发框架——PyTorch和架构Transformer的区别和联系

PyTorch就是工具,而Transformer就是理论;而理论指导工具。我们都知道大模型的本质是一个神经网络模型,因此我们学习大模型就是在学习神经网络模型;但了解了很多关于神经网络的理论,但大部分人对神经网络都没有一个清晰的认识,也就是说神经网络到底是什么?它长什么样?事实上所谓的神经网络本质上就是一个数学模型,里面涉及大量的数学运算;只不过其运算的主要数据类型是——向量,具体表现为多维矩阵。PyTorch和Transformer在神经网络的学习研究过程中,有两个东西是绕不过去的;

Java癫疯的博客 1281

MATPOWER下载安装教程

将MATPOWER文件复制在C:\Program Files (x86)\MATLAB\R2016b\bin目录下。原来的窗口中多了很多文件路径,点击【保存】,再点击【关闭】选择所要添加的MATPOWER文件夹,点击【选择文件夹】二、将MATPOWER放在bin目录下。找到菜单栏的【设置路径】点击【添加并包含子文件】一、从官网下载后解压。

weixin_47365903的博客 2万+

【升华】另一个神经网络学习框架pytorch

PyTorch是深度学习的主流框架之一,是一个基于Python的科学计算包,它提供了一个简单而灵活的接口,用于构建模型。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 1143

ADS 2024 Circuit Envelope 仿真:3步配置调制源,分析5G NR EVM与ACPR

本文详细介绍了ADS 2024 Circuit Envelope仿真技术在5G NR调制源配置与关键指标分析中的应用。通过3步配置调制源,工程师可以高效评估EVM与ACPR等关键指标,特别适用于功放设计中的非线性效应诊断。文章还提供了优化仿真设置和精确提取EVM、ACPR的实用方法,助力5G射频前端设计。

weixin_28559803的博客 383

Unity URP项目里Post Processing死活没效果?别急,这5个坑我帮你踩过了

本文详细解析了Unity URP项目中Post Processing效果不显示的5个常见问题及解决方案,包括管线配置、Volume设置、摄像机选项、Layer冲突和Shader兼容性。通过专业排查步骤和实用代码片段,帮助开发者快速定位并修复后处理效果失效问题,提升项目开发效率。

weixin_28693309的博客 233

SpikingJelly:基于PyTorch的脉冲神经网络开源框架

SpikingJelly 是一个开源的脉冲神经网络(SNN)深度学习框架,基于 PyTorch 构建。该项目旨在简化SNN的构建和训练过程,使其与传统的基于梯度的神经网络(ANN)一样易于使用。SpikingJelly 通过提供一系列用户友好的API,使得研究人员和开发者能够轻松地实现脉冲神经网络的搭建、训练和模拟。 主要编程语言:Python ## 2. 核心功能 - **简单的SNN构建...

gitblog_01177的博客 1061

异构图中的注意力机制网络:节点级别和语义级别的注意力(Python实现)

在本文中,我们介绍了如何使用Python实现异构图中的节点级别注意力和语义级别注意力。通过语义级别注意力,我们可以根据节点的语义信息对节点进行加权聚合。在本文中,我们将介绍如何使用Python实现异构图中的注意力机制网络,包括节点级别的注意力和语义级别的注意力。最后,我们使用注意力权重对节点特征进行加权聚合,得到聚合后的节点表示。然后,将聚合后的节点表示传递给语义级别注意力模型,根据节点的语义信息进行加权聚合,得到最终的表示。函数中,首先使用节点级别注意力模型对节点特征进行聚合,得到聚合后的节点表示。

HackNebulaZ的博客 485

CoatNet-PyTorch:基于PyTorch的高效卷积神经网络框架

CoatNet-PyTorch:基于PyTorch的高效卷积神经网络框架 项目介绍 CoatNet-PyTorch 是一个开源项目,旨在提供一种结构更为简单高效的卷积神经网络(CNN)架构,该架构灵感来源于coat-like的设计理念。本项目基于 GitHub 开发,利用PyTorch深度学习框架实现,为研究人员和开发者提供了在计算机视觉任务中探索新性能边界的机会。CoatNet设计强调了减少计算...

gitblog_01069的博客 834

每周技巧tc 问题处理技巧Teamcenter

(内部)Dataset和Tool相关之2.1——Tool轮询Contents Type和Type Name-赖良顺.docx。(内部)Dataset和Tool相关之3.2——编写Batch和Perl为客户端自动注册相关内容-赖良顺.docx。(内部)Dataset和Tool相关之1.1——Tools和Datasets参数定义-赖良顺.docx。(内部)Dataset和Tool相关之1.2——相关首选项定义及修改-赖良顺.docx。(内部)Dataset和Tool相关之0——概述-赖良顺.docx。

TC技术专栏 1230

当C#遇见声音魔法:从麦克风到文字的0.1秒奇幻漂流

为什么选300Hz?因为人声基频通常在85-255Hz,但清脆的“啊”可能到2kHz,所以300Hz是安全区!(参考知识库[1])

墨夶的博客 365

基于 PyTorch 框架使用神经网络实战手写数字识别

基于 PyTorch 框架使用神经网络实战手写数字识别1 torch和torchvision1.1 torchvision 包1.2 torch.transforms1.3 torchvision.datasets2 数据预览和数据装载【关于 torchvision.utils.make_grid:】【关于 numpy 和 transpose:】3 模型搭建和参数优化3.1 搭建卷积神经网络模型【关于torch.nn.Conv2d:】【关于torch.nn.MaxPool2d:】【关于torch.nn.Dr

niexinyu0026的博客 1709

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SpikingJelly终极指南:基于PyTorch的脉冲神经网络框架完整教程

脉冲神经网络(SNN)作为下一代人工智能的重要方向,正在改变我们对深度学习的认知。SpikingJelly是一个基于PyTorch的开源脉冲神经网络框架,为开发者提供了完整的SNN深度学习解决方案。本文将带您深入了解这个强大的工具,从安装到应用,一站式掌握SNN开发技巧。 ## 🚀 快速安装与配置 ### 一键安装指南 安装SpikingJelly非常简单,只需执行以下命令即可完成安装:

gitblog_01111的博客 1584

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

银行股价预测——基于pytorch框架RNN神经网络

银行股价预测——基于pytorch框架RNN神经网络) 基于csv数据,建立RNN模型,预测股价

萘菏萘荷的博客 3368

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

PyTorch Geometric(PyG):基于PyTorch的图神经网络(GNN)开发框架

PyTorch Geometric(PyG)是基于PyTorch的图神经网络(GNN)开发框架,专为**不规则结构数据**(如图、网格、点云)设计,提供从数据加载、模型构建到训练优化的全流程工具链。

Edward的博客 2222
上一篇: 深度学习之五:序列模型与词向量
下一篇: 流畅的Python学习
zzulp
博客等级 码龄19年 464粉丝 176原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值