Lenet5网络程序

Lenet5网络

 定义初始化网络:

神经网络的典型处理如下:

1.定义可学习参数的网络结构(堆叠各层和层的设计);

2.数据集输入;

3.对输入进行处理(由定义的网络层进行处理),主要体现在网络的前向传播;

4.计算loss,由loss层计算;

5.反向传播求梯度;

6.根据梯度改变参数值,最简单的实现方式为(SGD)为:weight = weight - learning_rate * gradient


  def __init__(self):
        super(Lenet5, self).__init__()

        self.conv_unit = nn.Sequential(
            # x: [b, 3, 32, 32] => [b, 16, ]
            nn.Conv2d(3, 16, kernel_size=5, stride=1, padding=0),
            nn.MaxPool2d(kernel_size=2, stride=2, padding=0),
            #
            nn.Conv2d(16, 32, kernel_size=5, stride=1, padding=0),
            nn.MaxPool2d(kernel_size=2, stride=2, padding=0),
            #
        )
        # flatten
        # fc unit
        self.fc_unit = nn.Sequential(
            nn.Linear(32*5*5, 32),
            nn.ReLU(),
            # nn.Linear(120, 84),
            # nn.ReLU(),
            nn.Linear(32, 10)
        )    
def forward(self, x):
        """

        :param x: [b, 3, 32, 32]
        :return:
        """
        batchsz = x.size(0)
        # [b, 3, 32, 32] => [b, 16, 5, 5]
        x = self.conv_unit(x)
        # [b, 16, 5, 5] => [b, 16*5*5]
        x = x.view(batchsz, 32*5*5)
        # [b, 16*5*5] => [b, 10]
        logits = self.fc_unit(x)

     
        return logits

由上例代码可以看到,不论是在定义网络结构还是定义网络层,均需要定义forward函数. Pytorch官网上的解释.

那么调用forward方法的具体流程是什么样的呢?具体流程是这样的:

以一个Module为例:
1. 调用module的call方法
2. module的call里面调用module的forward方法
3. forward里面如果碰到Module的子类,回到第1步,如果碰到的是Function的子类,继续往下
4. 调用Function的call方法
5. Function的call方法调用了Function的forward方法。
6. Function的forward返回值
7. module的forward返回值
8. 在module的call进行forward_hook操作,然后返回值。

定义网络层

        self.conv_unit = nn.Sequential(
            #x:[b,3,32,32] => [b,6,]
            nn.Conv2d(3,6,kernel_size=5,stride=1,padding=0), #搭积木,第一层
            nn.AvgPool2d(kernel_size=2,stride=2,padding=0),  #搭积木,第二次
            #
            nn.Conv2d(6,16,kernel_size=5,stride=1,padding=0), #搭积木,第三层
            nn.AvgPool2d(kernel_size=2,stride=2,padding=0), #搭积木,第四层


        )

 第一,卷积层:输入通道,输出通道,卷积核大小,步长,填充.

nn.Conv2d(3,6,kernel_size=5,stride=1,padding=0)

 第二,池化层:卷积核为2,步长为2,填充为0

nn.AvgPool2d(kernel_size=2,stride=2,padding=0)

 第三,卷积层:输入通道,输出通道,卷积核,步长,填充.

nn.Conv2d(6,16,kernel_size=5,stride=1,padding=0)

 第四,池化层:卷积核,步长,填充

nn.AvgPool2d(kernel_size=2,stride=2,padding=0)

 这里显示是4层.

nn.Sequential(
            nn.Linear(2,120),  #搭积木,第五层
            nn.ReLU(),
            nn.Linear(120,84),  #搭积木,第六层
            nn.ReLU(),
            nn.Linear(84,10)  #搭积木,第七层
        )

第5,连接层.

nn.Linear(2,120)

 第6,连接层.

nn.Linear(120,84)

 第7,连接层.

nn.Linear(84,10)

将四维数据改造成二维数据

        #将四维数据改造成二维数据
        #输出为b=32
        batchsz = x.size(0)
        # [b, 3, 32, 32] => [b, 16, 5, 5],[32, 3, 32, 32] => [32, 16, 5, 5]
        x = self.conv_unit(x)
        # [b, 16, 5, 5] => [b, 16*5*5]
        x = x.view(batchsz, 32*5*5)
        # [b, 16*5*5] => [b, 10]
        logits = self.fc_unit(x)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeNet-5神经网络 C源代码,这个写的比较好,可以用gcc编译去跑,结合理论可以对深度学习有更深刻的了解 介绍 根据YANN LECUN的论文《Gradient-based Learning Applied To Document Recognition》设计的LeNet-5神经网络,C语言写成,不依赖任何第三方库。 MNIST手写字符集初代训练识别率97%,多代训练识别率98%。 DEMO main.c文件为MNIST数据集的识别DEMO,直接编译即可运行,训练集60000张,测试集10000张。 项目环境 该项目为VISUAL STUDIO 2015项目,用VISUAL STUDIO 2015 UPDATE1及以上直接打开即可编译。采用ANSI C编写,因此源码无须修改即可在其它平台上编译。 如果因缺少openmp无法编译,请将lenet.c中的#include和#pragma omp parallel for删除掉即可。 API #####批量训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 inputs: 要训练的多个图片对应unsigned char二维数组的数组,指向的二维数组的batchSize倍大小内存空间指针。在MNIST测试DEMO中二维数组为28x28,每个二维数组数值分别为对应位置图像像素灰度值 resMat:结果向量矩阵 labels:要训练的多个图片分别对应的标签数组。大小为batchSize batchSize:批量训练输入图像(二维数组)的数量 void TrainBatch(LeNet5 *lenet, image *inputs, const char(*resMat)[OUTPUT],uint8 *labels, int batchSize); #####单个训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 要训练的图片对应二维数组 resMat:结果向量矩阵 label: 要训练的图片对应的标签 void Train(LeNet5 *lenet, image input, const char(*resMat)[OUTPUT],uint8 label); #####预测 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 输入的图像的数据 labels: 结果向量矩阵指针 count: 结果向量个数 return 返回值为预测的结果 int Predict(LeNet5 *lenet, image input, const char(*labels)[LAYER6], int count); #####初始化 lenet: LeNet5的权值的指针,LeNet5神经网络的核心

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值