Alexnet 卷积神经网络 纯 matlab代码 底层实现(一)正向传播

本文介绍了使用MATLAB实现Alexnet卷积神经网络的底层代码,包括卷积、池化、局部响应归一化和全连接层。详细探讨了分组卷积对参数数量的影响,并提供了正向传播过程的代码实现,同时欢迎读者指正和交流优化技巧。
摘要由CSDN通过智能技术生成

本程序的主要目的是通过自主编写alexnet网络,深入了解卷积、pooling、局部区域正则化、全连接层、基于动量的随机梯度下降、卷积神经网络的参数修正算法等神经网络的基础知识。

写这个博客一方面帮助自己理清思路,另一方面督促自己加快进度,也希望可以帮助到同样想深入了解卷积神经网络运算机制的朋友们。

根据前人们对Alexnet深入浅出的分析,基本可以完整还原整个网络结构。但还是遇到了一个问题:第一层卷积结果厚度是96,为什么到第二层时卷积核的厚度是48呢?

由于GPU显存资源的限制,Alexnet在卷积的过程中讲卷积核分成两组,由两个GPU进行运算。96 是两块GPU中卷积核数量的总和,其中每块GPU卷积核的数量都是48。所以输出的数据是两个厚度为48的tensor。由此得出结论:

分组对卷积核参数数量有很大影响。例如 第一层到第二层的过程,第一层有96个的卷积核,分成两组后,每组有48个卷积核,经过pooling层后,输出两个27*27*28大小的tensor,此时第二层的卷积核厚度为48,个数为128+128,第二层卷积参数数量为(5*5*48*128+128)*2=307456。如果不分组计算,输出的第一层输出的tensor大小为27*27*96,第二层参的卷积核厚度为96,个数为256,第二层卷积参数数量为5*5*96*256+256=614656.数量几乎增加1倍。

这里给出Alexnet结构代码,其中kernalcell中存放卷积核参数,bias存放偏置。


function [ output,kernalcell,biasout,Edeltak,Edeltab ] = myalexnet( X,label,kernalcell,bias,Edeltak,Edeltab )

    %1st Layer: Conv (w ReLu) -> Lrn -> Pool
    conv1_1 = conv(X, kernalcell{1}{1},bias{1}{1},0,4, 4);
    conv1_2 = conv(X, kernalcell{1}{2}, bias{1}{2},0,4, 4);%55*55*48
    norm1_1 = local_response_norm(conv1_1, 2,1, 2e-05, 0.75);
    norm1_2 = local_response_norm(conv1_2, 2,1, 2e-05, 0.75);
    pool1_1 = max_pool(norm1_1, 3, 3, 2, 2);
    pool1_2 = max_pool(norm1_2, 3, 3, 2, 2);%27*27*48
    %2nd Layer: Conv (w ReLu)  -> Lrn -> Pool 
    conv2_1 = conv(pool1_1, kernalcell{2}{1}, bias{2}{1}, 2, 1, 1);
    conv2_2 = conv(pool1_2, kernalcell{2}{2}, bias{2}{2}, 2, 1, 1);%27*27*128
    conv2 = cat(3,conv2_1,c
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值