使用pytorch搭建前向神经网络

一、前向神经网络原理

“人工智能”是目前非常火的一个概念,而“深度学习”是催生人工智能发展的一个重要因素。这个领域其实是非常会造概念的。由于和人的神经结构有类似,最初始的模型被命名为“神经网络”。之后随着机器硬件的发展和算力的提高,神经网络的层数不断被提高,这种比较多层的神经网络就被命名为“深度学习”。不可否认的是,在实践中深度学习模型取得了非常好的效果。

最早知道“神经网络”这个名词是在七八年前的数学建模竞赛资料大全里,记得当时感觉什么神经网络,蚁群算法,模拟退火fancy的不行。谁也没想到,仅仅过了几年,神经网络就已经成为明星般的存在。其中原因包含下面两个:1. 随着 multi-core CPU 和 GPU 的发展,计算能力足以支持复杂神经网络的计算;2. 产生可用的数据量越来越大,而神经网络正是在训练数据量达到一定程度的时候才能发挥作用。最开始提出的是前向神经网络(feed forward neural network),之后又有卷积神经网络(convolutional neural network)和 循环神经网络recurrent neural network)等。

我们知道给定输入向量 x1 和权重矩阵 w1,w2 ,神经网络模型是如何输出 x3 。但是,在实际问题中我们最开始除了网络的机构以外,是不知道权重w1,w2的,所给的数据仅仅是输入向量 x1以及其所对应的标签 y1 。于是,这就需要我们用手头上的数据来“训练”神经网络,所谓的“训练”就是估计权重矩阵w1,w2.

要建立一个待训练的神经网络,需要确定以下要素:

1.确定神经网络的结构(如图一所示),具体包括各层的神经元个数,激活函数的选择,神经元连接方式等。

2.确定损失函数。不同的损失函数对应不同的目的,不过总的来说分为分类神经网络回归神经网络。

3.确定参数优化方式。参数优化一般都是用的梯度下降法,不同的优化方法在细节方面会有一些差异。

二、使用pytorch搭建前向神经网络

import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms

batch_size = 64
learning_rate = 1e-2
num_epochs = 5 

use_gpu = torch.cuda.is_available()

train_dataset = datasets.FashionMNIST(
    root='../datasets', train=True, transform=transforms.ToTensor(), download=True)

test_dataset = datasets.FashionMNIST(
    root='../datasets', train=False, transform=transforms.ToTensor())

train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) 
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) 

# 基本的网络构建类模板
class net_name(nn.Module):
    def __init__(self):
        super(net_name, self).__init__()

        self.conv1 = nn.Conv2d(3, 10, 3)
   
        
    def forward(self, x):

        out = self.conv1(x)
        return out

# 定义简单的前馈神经网络
class neuralNetwork(nn.Module):
    def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
        super(neuralNetwork, self).__init__() # super() 

        self.layer1 = nn.Sequential(
            nn.Linear(in_dim, n_hidden_1),
            nn.ReLU(True)) 
        self.layer2 = nn.Sequential(
            nn.Linear(n_hidden_1, n_hidden_2),
            nn.ReLU(True))
        self.layer3 = nn.Sequential(
            nn.Linear(n_hidden_2, out_dim),
            nn.ReLU(True))

# 定义向前传播
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        return x

model = neuralNetwork(28 * 28, 300, 100, 10)
if use_gpu:
    model = model.cuda() 

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) 

这样就搭建好了一个前向神经网络。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
PyTorch是现代的深度学习框架,为研究人员和开发人员提供了很好的工具和支持。在PyTorch中,我们可以轻松地搭建3D卷积神经网络。 首先,我们需要导入必要的包。PyTorch包含了torch.nn模块,它提供我们搭建神经网络所需的各种工具和模块。我们还需要一个包,就是torchvision.models模块,里面包含已经搭好的模型,我们可以使用它们。 接着,我们要定义我们的3D卷积神经网络。定义方法如下: ```python import torch.nn as nn class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv3d(1, 64, kernel_size=3, padding=1) self.bn1 = nn.BatchNorm3d(64) self.relu1 = nn.ReLU(inplace=True) self.conv2 = nn.Conv3d(64, 128, kernel_size=3, padding=1) self.bn2 = nn.BatchNorm3d(128) self.relu2 = nn.ReLU(inplace=True) self.conv3 = nn.Conv3d(128, 256, kernel_size=3, padding=1) self.bn3 = nn.BatchNorm3d(256) self.relu3 = nn.ReLU(inplace=True) self.pool = nn.MaxPool3d((2, 2, 2)) self.fc1 = nn.Linear(256 * 8 * 8 * 8, 1024) self.fc2 = nn.Linear(1024, 10) def forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.relu1(x) x = self.conv2(x) x = self.bn2(x) x = self.relu2(x) x = self.conv3(x) x = self.bn3(x) x = self.relu3(x) x = self.pool(x) x = x.view(-1, 256 * 8 * 8 * 8) x = self.fc1(x) x = self.fc2(x) return x ``` 这里我们定义了一个名为Net的类。在__init__函数中,我们定义了三层卷积层,每一层后面跟着一个BatchNormalization层和ReLU激活层。之后我们定义一个池化层,最后是两层全连接层,其中第二层的输出是类别数目。 在forward函数中,我们把输入x通过卷积层、池化层、全连接层的顺序处理,最后输出。 接着,我们就可以对我们的三维数据进行训练了,使用PyTorch内置的optim包进行优化器的定义,再使用loss进行计算。 其中,数据需要先引入PyTorch,再进行一些简单的预处理,然后导入DataLoader中,以便进行网络训练。 ```python import torch.optim as optim net = Net() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(net.parameters(), lr=0.001) trainloader = DataLoader(train_dataset, batch_size=16, shuffle=True, num_workers=4) ``` 最后,我们就可以进行训练了。在训练过程中,我们一般选择mini-batch的方式进行,即把数据集分成若干个小批次进行训练,并在每个小批次训练完后更新网络权重。 ```python for epoch in range(10): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 100 == 99: print('[%d, %5d] loss: %.3f' % (epoch+1, i+1, running_loss/100)) running_loss = 0.0 print('Finished Training') ``` 随着迭代次数的增加,我们的网络会逐渐提高准确性。在训练完整个数据集后,我们可以对网络进行评估并进行可视化分析。 以上是使用PyTorch搭建3D卷积神经网络的过程。我们可以通过PyTorch提供的工具和模块,轻松地建立自己的卷积神经网络,并进行训练、评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值