Pytorch实现卷积神经网络(回归问题)


前言

深度学习当前的热度虽然没有前两年那么火热,尤其是在学界领域,但是在一些特殊问题中仍有一定的利用价值。一般而言,pytorch在学界使用的较多,tensorflow在业界使用的较多。

一、Pytorch

pytorch的使用基于tensor(张量)来进行最基本的运算。对于一般的神经网络而言,四维张量是最常见的

import torch
torch.Tensor(5,2,50,50)

上边的代码表示生成了一个4维tensor,四个维度分别表示(batch_size, channel_num, width, height)。batch_size表示一组中有多少条数据,channel_num表示一条数据的通道数,如彩色照片的通道数为3,而黑白照片的通道数为1;width, height则表示一个二维数据的两个维度。

Pytorch中

二、卷积神经网络

1.CNN结构

CNN的结构通常由卷积层、池化层、全连接层构成。卷积、池化的数目多少可以自行设计,下面是torch中封装好可以在CNN中直接使用的子类。

from torch import nn
nn.Conv2d(in_channels=1, out_channels=10, kernel_size=3, stride=1)
nn.MaxPool2d(kernel_size=2, stride=1)
nn.Linear(3240, 200)
nn.Flatten()

需要注意的是,在卷积、池化层组与全连接层之间会有一步“展平”操作,其含义即为将高维数据转换为一维数据。例如,shape为(4,3,28,28)的数据在 nn.Flatten() 操作后会变成 (4,3 * 28 * 28)的数据。

2.实现一个卷积神经网络类——代码

代码如下(示例):

class Cnn(nn.Module):
    def __init__(self, out_node):
        super(Cnn, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(in_channels=1, out_channels=10, kernel_size=3, stride=1), #卷积层
            # nn.ReLU(True),
            nn.MaxPool2d(kernel_size=2, stride=1),#最大池化层
            nn.Conv2d(in_channels=10, out_channels=10, kernel_size=3, stride=1),
            # nn.ReLU(True),
            nn.MaxPool2d(kernel_size=2, stride=1),
            nn.Flatten() # 展平操作,为了与全连接层匹配
        )
        self.fc = nn.Sequential(
            nn.Linear(3240, 200), #线性层
            nn.ReLU(inplace=True), # relu激活函数
            # nn.Dropout(),
            nn.Linear(200, out_node),
            nn.ReLU(inplace=True),
        )

    def forward(self, x):  #
        out = self.conv(x)
        print(out.shape)
        # out = out.view(out.size(0), 10 * 25 * 25)
        # print(out.shape)
        out = self.fc(out)
        # print(out.shape)
        return out

总结

本篇简单的对CNN的pytorch实现进行了说明,主要是卷积网络类的实现,要完整实现训练、验证、测试、调参还需要很多步骤,将会在之后陆续分享。

猜你喜欢

转载自blog.csdn.net/weixin_45667108/article/details/123035339
今日推荐