Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >神经网络学习(十三)卷积神经网络的MATLAB实现

神经网络学习(十三)卷积神经网络的MATLAB实现

作者头像
全栈程序员站长
发布于 2022-11-08 11:13:18
发布于 2022-11-08 11:13:18
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

系列博客是博主学习神经网络中相关的笔记和一些个人理解,仅为作者记录笔记之用,不免有很多细节不对之处。博主用Numpy实现了一个小巧的深度学习框架kitorch,可以方便实现CNN: MNIST例子。请不要再私信我要matlab的代码了。

卷积神经网络回顾

上一节,我们简单探讨了卷积神经网络的反向传播算法,本节我们着手实现了一个简单的卷积神经网,在此之前先以最基本的批量随机梯度下降法+L2正则化对对卷积神经网络的反向传播算法做一个很简单回顾。

需要确定参数有:

  • 小批量数据的大小 m m m
  • CNN模型的层数 L L L 和所有隐藏层的类型
  • 对于卷积层,要定义卷积核的大小 k k k,卷积核子矩阵的维度 d d d,填充大小 p p p,步幅 s s s
  • 对于池化层,要定义池化区域大小 h h h 和池化标准(max 或者 mean)
  • 对于全连接层,要定义全连接层的激活函数和各层的神经元个数
  • 对于输出层,要定义输出函数和代价函数,多分类任务一般采用 softmax 函数和交叉熵代价函数 C = y ln ( a ) C = y\texttt{ln}(a) C=yln(a)
  • 超参数:学习速率 η \eta η, 惩罚系数 λ \lambda λ,最大迭代次数 max_iter, 和停止条件 ϵ \epsilon ϵ

计算步骤

  1. 初始化每个隐含层的 W , b W,b W,b 的值为随机数。一般可以采用标准正态分布进行初始化(选用 1 ( n i n ) \dfrac{ 1}{\sqrt{(n_{in})}} (nin​) ​1​ 进行来缩放优化初始值),也可以采用 ( − ξ , ξ ) (-\xi, \xi) (−ξ,ξ) 的均匀分布( ξ \xi ξ 取小值) 2.正向传播 2.1).将输入数据 x x x 赋值于输入神经元 a 1 , a 1 = x a^1, a^1 = x a1,a1=x 2.2).从第二层开始,根据下面3种情况进行前向传播计算:
    • 如果当前是全连接层:则有 a l = σ ( z l ) = σ ( W l a l − 1 + b l ) a^{l} = \sigma(z^{l}) = \sigma(W^la^{l-1} + b^{l}) al=σ(zl)=σ(Wlal−1+bl)
    • 如果当前是卷积层:则有 a l = σ ( z l ) = σ ( W l ∗ a l − 1 + b l ) a^{l} = \sigma(z^{l}) = \sigma(W^l*a^{l-1} + b^{l}) al=σ(zl)=σ(Wl∗al−1+bl)
    • 如果当前是池化层:则有 a l = pool ( a l − 1 ) a^{l}= \texttt{pool}(a^{l-1}) al=pool(al−1)

    2.3).对于输出层第 L L L 层,计算输出 a L = softmax ( z l ) = softmax ( W l a l − 1 + b l ) a^{L}= \texttt{softmax}(z^{l}) = \texttt{softmax}(W^la^{l-1} + b^{l}) aL=softmax(zl)=softmax(Wlal−1+bl)

3. 反向传播 3.1).通过损失函数计算输出层的 δ L \delta^L δL 3.2).从倒数第二层开始,根据下面3种情况逐层进行反向传播计算:

  • 如果当前是全连接层:则有 δ l = ( W l + 1 ) T δ l + 1 ⊙ σ ′ ( z l ) \delta^{l} = (W^{l+1})^T\delta^{l+1}\odot \sigma^{‘}(z^{l}) δl=(Wl+1)Tδl+1⊙σ′(zl)
  • 如果上层是卷积层:则有 δ l = δ l + 1 ∗ rot180 ( W l + 1 ) ⊙ σ ′ ( z l ) \delta^{l} = \delta^{l+1}*\texttt{rot180}(W^{l+1}) \odot \sigma^{‘}(z^{l}) δl=δl+1∗rot180(Wl+1)⊙σ′(zl)
  • 如果上层是池化层:则有 δ l = upsample ( δ l + 1 ) ⊙ σ ′ ( z l ) \delta^{l} = \texttt{upsample}(\delta^{l+1})\odot \sigma^{‘}(z^{l}) δl=upsample(δl+1)⊙σ′(zl)。

4. 根据以下两种情况进行模型更新: 4.1).如果当前是全连接层: W l = ( 1 − η λ n ) W l − η m ∑ [ δ l ( a l − 1 ) T ] W^l = \left(1-\frac{\eta\lambda}{n}\right)W^l -\frac{\eta}{m} \sum \left[ \delta^{l}(a^{ l-1})^T\right] Wl=(1−nηλ​)Wl−mη​∑[δl(al−1)T] b l = b l − η m ∑ ( δ l ) b^l = b^l -\frac{\eta}{m} \sum \left( \delta^{l} \right) bl=bl−mη​∑(δl)4.2).如果当前是卷积层,对于每一个卷积核有: W l = ( 1 − η λ n ) W l − η m ∑ [ δ l ∗ rot90 ( a l − 1 , 2 ) ] W^l = \left(1-\frac{\eta\lambda}{n}\right)W^l – \frac{\eta}{m} \sum \left[ \delta^{l}*\texttt{rot90}(a^{ l-1},2)\right] Wl=(1−nηλ​)Wl−mη​∑[δl∗rot90(al−1,2)] b l = b l − η m ∑ [ mean ( δ l ) ] b^l = b^l – \frac{\eta}{m} \sum \left[ \texttt{mean}(\delta^{l})\right] bl=bl−mη​∑[mean(δl)]

MATLAB实现

限于个人能力,我们目前先实现一个简单的 1+N 结构的卷积神经网络,即 1 个卷积层(包括池化层)和 N个全连接层。下面是这个简单网络的结构

下面对各层做简要的说明: 1、 卷积层:无padding,步幅 stride 设置为 1,激活函数选择ReLU函数 2、 池化层:无padding,池化类型只实现 ‘average’ 方法 3、 展铺层:为方便计算设计的层,属于预先分配的内存空间,作为全连接层的输入 4、 全连接层:激活函数为Sigmoid函数 5、 输出层:分类函数选择Softmax函数,代价函数选择交叉熵代价函数+L2正则化

网络定义的MATLAB代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loadMnistDataScript; %加载数据
ntrain = size(training_data_label,2);
mini_batch_size = 100;
cnn.ntrain = ntrain;
cnn.eta = 1;       %学习速率
cnn.lambda = 5;    %正则化惩罚系数

cnn.layer = {
    % input layer: 'input', mini_size, [height,width] of image
    {'input',mini_batch_size,[28,28]};
    % convlution layer: 'conv', kernel_number, [height,width] of kernel
    {'conv',20,[9,9]};
    % pooling layer: 'pool', pooling_type, [height,width] of pooling area
    {'pool','average',[2,2]};
    % flatten layer: 'flat', a layer for pre-allocated memory
    {'flat'};
    % full connect layer: 'full', neuron number
    {'full',100};
    {'full',100};
    % output layer: 'output', neuron number
    {'output',10};
    };

由于变量过多,将cnn设计为一个结构体,包含的成员变量有 1、cnn.layer:网络结构的定义,元胞数组; 2、cnn.z:每一层的带权输入,元胞数组; 3、cnn.a:每一层的输出,元胞数组; 4、cnn.delta::每一层的误差敏感项,元胞数组; 5、cnn.weights:每一层的权重。元胞数组; 6、cnn.biases:每一层的偏置,元胞数组; 7、cnn.nabla_w:权重的梯度,元胞数组; 8、cnn.nabla_b:偏置的梯度,元胞数组; 9、其他一些超参数 这样每一层包含7个量:带权输入( z z z),输出( a a a),误差( δ \delta δ),权重( W W W),偏置( b b b),权重梯度( ∇ W \nabla W ∇W),偏置梯度( ∇ b \nabla b ∇b)。并不是每一层都实际需要这7个量,不需要的层将其设置为空数组即可,下面是网络初始化的过程,假如第 n n n层为: 1、输入层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a{n} = zeros([ImageHeight, ImageWidth, mini_batch_size])

2、卷积层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ImageHeight = ImageHeight – KernelHeight+1
ImageWidth = ImageWidth– KernelWidth+1
z{n} = zeros([ImageHeight, ImageWidth, mini_batch_size, kernel_number])
a{n} = zeros([ImageHeight, ImageWidth, mini_batch_size, kernel_number])
delta{n} = zeros([ImageHeight, ImageWidth, mini_batch_size, kernel_number])
weights{n} = rand([KernelHeight, KernelWidth, kernel_number])-0.5
nabla_w =zeros( [KernelHeight, KernelWidth, kernel_number])
biases{n} = rand([1, kernel_number])-0.5
nabla_b{n} =zeros( [1, kernel_number])

3、池化层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ImageHeight = ImageHeight / KernelHeight
mageWidth = ImageWidth / KernelWidth
a{n} = zeros([ImageHeight, ImageWidth, mini_batch_size, kernel_number])
delta{n} = zeros([ImageHeight, ImageWidth, mini_batch_size, kernel_number])

4、展铺层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a{n} = zeros([ImageHeight*ImageWidth* kernel_number, mini_batch_size])
delta{n} = zeros([ImageHeight*ImageWidth* kernel_number, mini_batch_size])

5、全连接层和输出层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
z{n} = zeros([neuron_number, mini_batch_size])
a{n} = zeros([neuron_number, mini_batch_size])
delta{n} = zeros([neuron_number, mini_batch_size])
weights{n} = rand([neuron_number,prev_layer_neuron_number])-0.5
nabla_w{n} = zeros([neuron_number,prev_layer_neuron_number])
biases{n} = rand([neuron_number,1])-0.5
nabla_b{n} = zeros([neuron_number,1])

下面是详细代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function cnn = cnn_initialize(cnn)
%CNN_INIT initialize the weights and biases, and other parameters
%   
index = 0;
num_layer = numel(cnn.layer);
for in = 1:num_layer
switch cnn.layer{in}{1}
case 'input'
index = index + 1;
height = cnn.layer{in}{3}(1);
width = cnn.layer{in}{3}(2);
mini_size = cnn.layer{in}{2};
cnn.weights{index} = [];
cnn.biases{index} = [];
cnn.nabla_w{index} = [];
cnn.nabla_b{index} = [];
%n*n*m
cnn.a{index} = [];
cnn.z{index} = [];
cnn.delta{index} = [];
cnn.mini_size = mini_size;
case 'conv'
index = index + 1;
%kernel height, width, number
ker_height = cnn.layer{in}{3}(1);
ker_width = cnn.layer{in}{3}(2);
ker_num = cnn.layer{in}{2};
cnn.weights{index} = grand(ker_height,ker_width,ker_num) - 0.5;
cnn.biases{index} = grand(1,ker_num) - 0.5;
cnn.nabla_w{index} = zeros(ker_height,ker_width,ker_num);
cnn.nabla_b{index} = zeros(1,ker_num);
height = height - ker_height + 1;
width = width - ker_width + 1;
cnn.a{index} = zeros(height,width,mini_size,ker_num);
cnn.z{index} = zeros(height,width,mini_size,ker_num);
cnn.delta{index} = zeros(height,width,mini_size,ker_num);
case 'pool'
index = index + 1;
%kernel height, width, number
ker_height = cnn.layer{in}{3}(1);
ker_width = cnn.layer{in}{3}(2);
cnn.weights{index} = [];
cnn.biases{index} = [];
cnn.nabla_w{index} = [];
cnn.nabla_b{index} = [];
height = height / ker_height;
width = width / ker_width;
cnn.a{index} = zeros(height,width,mini_size,ker_num);
cnn.z{index} = [];
cnn.delta{index} = zeros(height,width,mini_size,ker_num);
case 'flat'
index = index + 1;
cnn.weights{index} = [];
cnn.biases{index} = [];
cnn.nabla_w{index} = [];
cnn.nabla_b{index} = [];
cnn.a{index} = zeros(height*width*ker_num,mini_size);
cnn.z{index} = [];
cnn.delta{index} = zeros(height*width*ker_num,mini_size);
case 'full'
index = index + 1;
%kernel height, width, number
neuron_num = cnn.layer{in}{2};
neuron_num0 = size(cnn.a{in-1},1);
cnn.weights{index} = grand(neuron_num,neuron_num0) - 0.5;
cnn.biases{index} = grand(neuron_num,1) - 0.5;
cnn.nabla_w{index} = zeros(neuron_num,neuron_num0);
cnn.nabla_b{index} = zeros(neuron_num,1);
cnn.a{index} = zeros(neuron_num,mini_size);
cnn.z{index} = zeros(neuron_num,mini_size);
cnn.delta{index} = zeros(neuron_num,mini_size);
case 'output'
index = index + 1;
%kernel height, width, number
neuron_num = cnn.layer{in}{2};
neuron_num0 = size(cnn.a{in-1},1);
cnn.weights{index} = grand(neuron_num,neuron_num0) - 0.5;
cnn.biases{index} = grand(neuron_num,1);
cnn.nabla_w{index} = zeros(neuron_num,neuron_num0);
cnn.nabla_b{index} = zeros(neuron_num,1);
cnn.a{index} = zeros(neuron_num,mini_size);
cnn.z{index} = zeros(neuron_num,mini_size);
cnn.delta{index} = zeros(neuron_num,mini_size);
otherwise
end
end
end

下面是正向计算过程(伪代码),假设第 n n n层为 1、输入层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a{n} = x 

2、卷积层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
z{n} = conv(weights{n}*a{n-1})+biases{n} 
a{n} = relu(z{n}) 

3、池化层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a{n}=pool(a{n-1}) %程序中同样使用卷积实现的 

4、展铺层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a{n} = reshape(a{n-1}) 

5、全连接层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  z{n} = weights{n}*a{n-1}+biases{n} 
a{n} = sigmoid(z{n})  

6、输出层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
z{n} = weights{n}*a{n-1}+biases{n} 
a{n} = softmax(z{n}) 

具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function cnn = cnn_feedforward(cnn,x)
%CNN_FEEDFORWARD CNN feedforward
%   
num = numel(cnn.layer);
for in = 1:num
switch cnn.layer{in}{1}
case 'input'
cnn.a{in} = x;
case 'conv'
kernel_num = cnn.layer{in}{2};
for ik = 1:kernel_num
cnn.z{in}(:,:,:,ik) = convn(cnn.a{in-1},...
cnn.weights{in}(:,:,ik),'valid')+cnn.biases{in}(ik);
end
cnn.a{in} = relu(cnn.z{in});
case 'pool'
ker_h = cnn.layer{in}{3}(1);
ker_w = cnn.layer{in}{3}(2);
kernel = ones(ker_h,ker_w)/ker_h/ker_w;
tmp = convn(cnn.a{in-1},kernel,'valid');
cnn.a{in} = tmp(1:ker_h:end,1:ker_w:end,:,:);
case 'flat'
[height,width,mini_size,kernel_num] = size(cnn.a{in-1});
for ik = 1:mini_size
cnn.a{in}(:,ik) = reshape(cnn.a{in-1}(:,:,ik,:),[height*width*kernel_num,1]);
end
case 'full'
cnn.z{in}= bsxfun(@plus,cnn.weights{in}*cnn.a{in-1},cnn.biases{in});
cnn.a{in} = sigmoid(cnn.z{in});
case 'output'
cnn.z{in}= bsxfun(@plus,cnn.weights{in}*cnn.a{in-1},cnn.biases{in});
cnn.a{in} = softmax(cnn.z{in});
end
end
end

下面是反向计算过程(伪代码),假设第 n n n层为

1、卷积层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delta{n} = upsample(delta{n+1}).*relu_prime(z{n})
nabla_w{n} = conv2(delta{n},rot90(a{n-1},2),'valid')/mini_batch_size
nabla_b{n} = mean(delta{n})

2、池化层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delta{n} = reshape(delta{n+1}) 

3、展铺层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delta{n} = weights{n+1}'*delta{n+1}

4、全连接层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delta{n} = weights{n+1}'*delta{n+1}.*sigmoid_prime(a{n})
nabla_w{n} = delta{n}*a{n-1}'/mini_batch_size
nabla_b{n} = mean(delta{n})

5、输出层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delta{n} = a{n}-y 
nabla_w{n} = delta{n}*a{n-1}'/mini_batch_size
nabla_b{n} = mean(delta{n})

下面是反向传播和模型更新部分的 MATLAB 代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function cnn = cnn_backpropagation(cnn,y)
%CNN_BP CNN backpropagation
num = numel(cnn.layer);
for in = num:-1:2
switch cnn.layer{in}{1}
case 'conv'
ker_h = cnn.layer{in+1}{3}(1);
ker_w = cnn.layer{in+1}{3}(2);
kernel = ones(ker_h,ker_w)/ker_h/ker_w;
[~,~,mini_size,kernel_num] = size(cnn.delta{in+1});
cnn.nabla_w{in}(:) = 0;
cnn.nabla_b{in}(:) = 0;
for ik = 1:kernel_num
for im = 1:mini_size
cnn.delta{in}(:,:,im,ik) = kron(cnn.delta{in+1}(:,:,im,ik),kernel).*relu_prime(cnn.z{in}(:,:,im,ik));
cnn.nabla_w{in}(:,:,ik) = cnn.nabla_w{in}(:,:,ik) +...
conv2(rot90(cnn.a{in-1}(:,:,im),2),cnn.delta{in}(:,:,im,ik),'valid');
cnn.nabla_b{in}(ik) = cnn.nabla_b{in}(ik) + mean(mean(cnn.delta{in}(:,:,im,ik)));
end
cnn.nabla_w{in}(:,:,ik) = cnn.nabla_w{in}(:,:,ik)/mini_size;
cnn.nabla_b{in}(ik) = cnn.nabla_b{in}(ik)/mini_size;
end
case 'pool'
[height,width,mini_size,kernel_num] = size(cnn.a{in});
for ik = 1:mini_size
cnn.delta{in}(:,:,ik,:) = reshape(cnn.delta{in+1}(:,ik),[height,width,kernel_num]);
end
case 'flat'
cnn.delta{in} = cnn.weights{in+1}'*cnn.delta{in+1};
case 'full'
cnn.delta{in}= cnn.weights{in+1}'*cnn.delta{in+1}.*sigmoid_prime(cnn.z{in});
cnn.nabla_w{in} = cnn.delta{in}*(cnn.a{in-1})'/cnn.mini_size;
cnn.nabla_b{in} = mean(cnn.delta{in},2);
case 'output'
cnn.delta{in}= (cnn.a{in} - y);
cnn.nabla_w{in} = cnn.delta{in}*(cnn.a{in-1})'/cnn.mini_size;
cnn.nabla_b{in} = mean(cnn.delta{in},2);
otherwise
end
end
eta = cnn.eta;
lambda = cnn.lambda;
ntrain = cnn.ntrain;
% update models
for in = 1:num
cnn.weights{in} = (1-eta*lambda/ntrain)*cnn.weights{in} - eta*cnn.nabla_w{in};
cnn.biases{in} = (1-eta*lambda/ntrain)*cnn.biases{in} - eta*cnn.nabla_b{in};
end
end

下面是主程序部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cnn = cnn_initialize(cnn);
max_iter = 50000;
for in = 1:max_iter
pos = randi(ntrain-mini_batch_size);
x = training_data(:,:,pos+1:pos+mini_batch_size);
y = training_data_label(:,pos+1:pos+mini_batch_size);
cnn = cnn_feedforward(cnn,x);
cnn = cnn_backpropagation(cnn,y);
if mod(in,100) == 0
disp(in);
end
if mod(in,5000) == 0
disp(['validtion accuracy: ',num2str(...
cnn_evaluate(cnn,validation_data,validation_data_label)*100), '%']);
end
end

运行结果为

迭代次数为50000次,mini_batch_size = 100,如果按照无放回的随机梯度计算,迭代次数为100个epoch。在校验数据(validation_data)上的识别率最高为 99.02%, 在测试数据(test_data)上的识别率为 99.13%。CNN的效率比较低,单线程迭代50000次,共耗时3个多小时。-_-||。

本节代码可在这里下载

免费代码在这里呀,由于MATLAB版本的问题,可能会出错哦,自己调整下吧

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/190840.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月22日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
神经网络算法
20 世纪五、六⼗年代,科学家 Frank Rosenblatt其受到 Warren McCulloch 和 Walter Pitts早期的⼯作的影响,发明了感知机(Perceptrons)。
foochane
2019/05/23
8930
神经网络算法
神经网络模型解决分类问题的思考方式
本文介绍了如何使用反向传播算法来训练神经网络,并使用MNIST数据集进行手写数字分类。首先介绍了反向传播算法的基本原理,然后通过一个具体的例子展示了如何使用该算法来训练神经网络,最后给出了一个完整的代码实现。
人工智能的秘密
2017/12/25
2.3K0
神经网络模型解决分类问题的思考方式
TensorFlow从0到1 - 11 - 74行Python实现手写体数字识别
到目前为止,我们已经研究了梯度下降算法、人工神经网络以及反向传播算法,他们各自肩负重任: 梯度下降算法:机器自学习的算法框架; 人工神经网络:“万能函数”的形式表达; 反向传播算法:计算人工神经网络梯度下降的高效方法; 基于它们,我们已经具备了构建具有相当实用性的智能程序的核心知识。它们来之不易,从上世纪40年代人工神经元问世,到80年代末反向传播算法被重新应用,历经了近半个世纪。然而,实现它们并进行复杂的手写体数字识别任务,只需要74行Python代码(忽略空行和注释)。要知道如果采用编程的方法(非学习
袁承兴
2018/04/11
1.8K0
TensorFlow从0到1 - 11 - 74行Python实现手写体数字识别
小白也能看懂的BP反向传播算法之Surpass Backpropagation
上篇文章小白也能看懂的BP反向传播算法之Further into Backpropagation中,我们小试牛刀,将反向传播算法运用到了一个两层的神经网络结构中!然后往往实际中的神经网络拥有3层甚至更多层的结构,我们接下来就已一个三层的神经网络结构为例,分析如何运用动态规划来优化反向传播时微分的计算!
desperate633
2018/08/23
8610
TensorFlow从0到1 | 第十一章 74行Python实现手写体数字识别
到目前为止,我们已经研究了梯度下降算法、人工神经网络以及反向传播算法,他们各自肩负重任: 梯度下降算法:机器自学习的算法框架; 人工神经网络:“万能函数”的形式表达; 反向传播算法:计算人工神经网络梯度下降的高效方法; 基于它们,我们已经具备了构建具有相当实用性的智能程序的核心知识。它们来之不易,从上世纪40年代人工神经元问世,到80年代末反向传播算法被重新应用,历经了近半个世纪。然而,实现它们并进行复杂的数字手写体识别任务,只需要74行Python代码(忽略空行和注释)。要知道如果采用编程的方法(非学习的
用户1332428
2018/03/08
1.2K0
TensorFlow从0到1  | 第十一章 74行Python实现手写体数字识别
连载 | 深度学习入门第六讲
1.6 实现我们的网络来分类数字 好吧,现在让我们写一个学习如何识别手写数字的程序,使用随机梯度下降算法和 MNIST训练数据。我们需要做的第一件事情是获取 MNIST 数据。如果你是一个 git 用戶,那么你能够 通过克隆这本书的代码仓库获得数据, git clone https://github.com/mnielsen/neural-networks-and-deep-learning.git 如果你不使用 git,也可以从这里下载数据和代码。 顺便提一下,当我在之前描述 MNIST 数据时,我
用户1107453
2018/06/21
4240
前馈神经网络——深度学习之神经网络核心原理与算法
因上几次读者反映,公式代码有乱码和不规整的问题,小编有改善哟,这篇文章开始亲们会看到效果的哟~
用户1332428
2018/07/30
1.1K0
前馈神经网络——深度学习之神经网络核心原理与算法
《neural network and deep learning》题解——ch02 Network源码分析
http://blog.csdn.net/u011239443/article/details/75008380
小爷毛毛_卓寿杰
2019/02/13
1.5K0
神经网络中 BP 算法的原理与 Python 实现源码解析
最近这段时间系统性的学习了BP算法后写下了这篇学习笔记,因为能力有限,若有明显错误,还请指出。 目录 1、什么是梯度下降和链式求导法则 2、神经网络的结构 3、BP算法中的执行流程(前向传递和逆向更新) 4、输出层和隐藏层权重以及偏置更新的推导 5、Python 实现源码解析 6、手写数字识别实例 7、训练神经网络中有哪些难点(TODO) 梯度下降和链式求导法则 假设
用户1332428
2018/03/08
2K0
神经网络中 BP 算法的原理与 Python 实现源码解析
【深度学习系列】卷积神经网络详解(二)——自己手写一个卷积神经网络
Screenshot (15).png   上篇文章中我们讲解了卷积神经网络的基本原理,包括几个基本层的定义、运算规则等。本文主要写卷积神经网络如何进行一次完整的训练,包括前向传播和反向传播,并自己手写一个卷积神经网络。如果不了解基本原理的,可以先看看上篇文章:【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理  卷积神经网络的前向传播   首先我们来看一个最简单的卷积神经网络: image.png  1.输入层---->卷积层 以上一节的例子为例,输入是一个4*4 的image,经过两个2
Charlotte77
2018/01/15
2.5K0
【深度学习系列】卷积神经网络详解(二)——自己手写一个卷积神经网络
《neural network and deep learning》题解——ch03 再看手写识别问题题解与源码分析
http://blog.csdn.net/u011239443/article/details/77649026
小爷毛毛_卓寿杰
2019/02/13
4560
《neural network  and deep learning》题解——ch03 再看手写识别问题题解与源码分析
李理:从Image Caption Generation理解深度学习(part II)
本系列文章面向程序员,希望通过Image Caption Generation,一个有意思的具体任务,深入浅出地介绍深度学习的知识,涉及到很多深度学习流行的模型,如CNN,RNN/LSTM,Attention等。本文为第二篇。 作者李理,MDCC 2016 移动开发者大会人工智能与机器人专场的出品人,邀请人工智能一线专家担任演讲嘉宾,从无人驾驶、智能机器人、智能应用开发实战等方面解读人工智能技术的内涵及其对移动开发工作的影响。 大会目前火热报名中,门票6.8折优惠即将结束,倒计时2天!(票务详情链接,欲购从
用户1737318
2018/06/06
9060
《neural network and deep learning》题解——ch03 其他技术(momentun,tanh)
http://blog.csdn.net/u011239443/article/details/77848503
小爷毛毛_卓寿杰
2019/02/13
4840
《neural network and deep learning》题解——ch03 其他技术(momentun,tanh)
卷积神经网络
0.说在前面1.卷积神经网络1.1 卷积层1.2 汇聚层1.3 全连接层2.卷积层实现2.1 前向传播2.2 反向传播3.汇聚层3.1 前向传播3.2 反向传播4.组合层5.三层卷积神经网络5.1 架构5.2 类构造方法5.3 计算损失5.3.1 前向传播5.3.2 反向传播6.Spatial batch normalization6.1 要求解读6.2 前向传播6.3 反向传播7.Group Normalization7.1 什么是Group Normalization?7.2 前向传播7.3 反向传播8.作者的话
公众号guangcity
2019/09/20
1.3K0
卷积神经网络
取代Python?Rust凭什么
【导语】Rust 也能实现神经网络?在前一篇帖子中,作者介绍了MNIST数据集以及分辨手写数字的问题。在这篇文章中,他将利用前一篇帖子中的代码,通过Rust实现一个简单的神经网络。其目标是探索用Rust实现数据科学工作流程的性能以及人工效率。
AI科技大本营
2019/09/09
1.2K0
取代Python?Rust凭什么
04.卷积神经网络 W1.卷积神经网络(作业:手动/TensorFlow 实现卷积神经网络)
0 padding 会在图片周围填充 0 元素(下图 p = 2 p=2 p=2 )
Michael阿明
2021/02/19
9600
数据科学 IPython 笔记本 四、Keras(上)
深度学习允许由多层组成的计算模型,来学习具有多个抽象级别的数据表示。这些方法极大地改进了语音识别,视觉对象识别,物体检测,以及药物发现和基因组学等许多其他领域的最新技术。
ApacheCN_飞龙
2022/05/07
1.7K0
数据科学 IPython 笔记本 四、Keras(上)
聊聊神经网络模型流程与卷积神经网络的实现
在这里我主要是把整个流程分为两个主流程,即预训练与推理。预训练过程主要是生成超参数文件与搭设神经网络结构;而推理过程就是在应用超参数与神经网络。
Ryan_OVO
2023/12/06
2330
聊聊神经网络模型流程与卷积神经网络的实现
李理:详解卷积神经网络
本系列文章面向深度学习研发者,希望通过Image Caption Generation,一个有意思的具体任务,深入浅出地介绍深度学习的知识。本系列文章涉及到很多深度学习流行的模型,如CNN,RNN/LSTM,Attention等。本文为第6篇。 作者:李理 目前就职于环信,即时通讯云平台和全媒体智能客服平台,在环信从事智能客服和智能机器人相关工作,致力于用深度学习来提高智能机器人的性能。 相关文章请访问:http://geek.csdn.net/news/detail/127365 若下文链接不能成
用户1737318
2018/06/06
5580
卷积神经网络(CNN):从原理到实现
MachineLP
2018/01/09
1.9K0
卷积神经网络(CNN):从原理到实现
推荐阅读
相关推荐
神经网络算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验