1. 程式人生 > >卷積神經網路matlab 程式碼理解

卷積神經網路matlab 程式碼理解

網路結構圖: 
這裡寫圖片描述

開啟路徑\tests\test_example_cnn.m

function test_example_CNN
clc,
clear;
addpath D:\matlab文件\DeepLearnToolbox\data\ %按照文件所在路徑進行載入 
addpath D:\matlab文件\DeepLearnToolbox\CNN\  
addpath D:\matlab文件\DeepLearnToolbox\util\  
load mnist_uint8;  %載入訓練、測試資料

train_x = double(reshape(train_x',28,28,60000))/255
; % 訓練集變成60000張28*28的圖片 28*28*60000,畫素點歸一化到[0,1] test_x = double(reshape(test_x',28,28,10000))/255; % 測試集 28*28*10000 train_y = double(train_y'); %10*6000 test_y = double(test_y'); %% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error.
%With 100 epochs you'll get around 1.2% error rand('state',0) %如果指定狀態,產生隨機結果就相同 cnn.layers = { %%% 設定各層feature maps個數及卷積模板大小等屬性 struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %卷積層有6張特徵圖,卷積核大小為5*5 struct('type', 's', 'scale', 2) %抽樣層,定義2
*2的臨域相連線 struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %同上 struct('type', 's', 'scale', 2) %同上 }
; opts.alpha = 1; %迭代下降的速率 opts.batchsize = 50; %每次選擇50個樣本進行更新 opts.numepochs = 1; %迭代次數 cnn = cnnsetup(cnn, train_x, train_y); %對各層引數進行初始化 包括權重和偏置 cnn = cnntrain(cnn, train_x, train_y, opts); %訓練的過程,包括bp演算法及迭代過程 [er, bad] = cnntest(cnn, test_x, test_y); %plot mean squared error figure; plot(cnn.rL); assert(er<0.12, 'Too big error'); end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

\CNN\cnnsetup.m

function net = cnnsetup(net, x, y)   %對各層引數進行初始化 包括權重和偏置  
    assert(~isOctave() || compare_versions(OCTAVE_VERSION, '3.8.0', '>='), ['Octave 3.8.0 or greater is required for CNNs as there is a bug in convolution in previous versions. See http://savannah.gnu.org/bugs/?39314. Your version is ' myOctaveVersion]);
    inputmaps = 1;   %輸入圖片數量
    mapsize = size(squeeze(x(:, :, 1)));   % 圖片的大小 squeeze 要不要都行28 28,squeeze的功能是刪除矩陣中的單一維

    for l = 1 : numel(net.layers)   %layer層數
        if strcmp(net.layers{l}.type, 's')
            mapsize = mapsize / net.layers{l}.scale;%% sumsampling的featuremap長寬都是上一層卷積層featuremap的不重疊平移scale大小
            %分別為24/2=12;8/2=4
            %%assert:斷言函式
            assert(all(floor(mapsize)==mapsize), ['Layer ' num2str(l) ' size must be integer. Actual: ' num2str(mapsize)]);

            for j = 1 : inputmaps % 就是上一層有多少張特徵圖,通過初始化為1然後依層更新得到
                net.layers{l}.b{j} = 0; 
                % 將偏置初始化0, 權重weight,這段程式碼subsampling層將weight設為1/4 而偏置引數設為0,故subsampling階段無需引數  
            end
        end
        if strcmp(net.layers{l}.type, 'c')
            mapsize = mapsize - net.layers{l}.kernelsize + 1; % 得到當前層feature map的大小,卷積平移,預設步長為1   
            fan_out = net.layers{l}.outputmaps * net.layers{l}.kernelsize ^ 2;% 隱藏層的大小,是一個(後層特徵圖數量)*(用來卷積的kernel的大小)  
            for j = 1 : net.layers{l}.outputmaps  %當前層feature maps的個數 
                fan_in = inputmaps * net.layers{l}.kernelsize ^ 2;  %對於每一個後層特徵圖,有多少個引數鏈到前層,包含權重的總數分別為1*25;6*25
                for i = 1 : inputmaps  %  共享權值,故kernel引數個數為inputmaps*outputmaps個數,每一個大小都是5*5  
                    net.layers{l}.k{i}{j} = (rand(net.layers{l}.kernelsize) - 0.5) * 2 * sqrt(6 / (fan_in + fan_out));
                    % 初始化每個feature map對應的kernel引數 -0.5 再乘2歸一化到[-1,1]
                    % 最終歸一化到[-sqrt(6 / (fan_in + fan_out)),+sqrt(6 / (fan_in + fan_out))] why?? 
                end
                net.layers{l}.b{j} = 0; % 初始話feture map對應的偏置引數 初始化為0  
            end
            inputmaps = net.layers{l}.outputmaps;% 修改輸入feature maps的個數以便下次使用
        end
    end
    % 'onum' is the number of labels, that's why it is calculated using size(y, 1). If you have 20 labels so the output of the network will be 20 neurons.
    %  onum 是標籤數,也就是最後輸出層神經元的個數。你要分多少個類,自然就有多少個輸出神經元;
    % 'fvnum' is the number of output neurons at the last layer, the layer just before the output layer.
    %  fvnum是最後輸出層的前面一層的神經元個數,這一層的上一層是經過pooling後的層,
    %包含有inputmaps個特徵map。每個特徵map的大小是mapsize。所以,該層的神經元個數是 inputmaps * (每個特徵map的大小); 
    % 'ffb' is the biases of the output neurons.
    % ffb 是輸出層每個神經元對應的基biases  
    % 'ffW' is the weights between the last layer and the output neurons. Note that the last layer is fully connected to the output layer, that's why the size of the weights is (onum * fvnum)
    % ffW 輸出層前一層 與 輸出層 連線的權值,這兩層之間是全連線的  
    fvnum = prod(mapsize) * inputmaps;% prod函式用於求陣列元素的乘積,fvnum=4*4*12=192,是全連線層的輸入數量 
    onum = size(y, 1);%最終分類的個數  10類  ,最終輸出節點的數量
    % 這裡是最後一層神經網路的設定 
    net.ffb = zeros(onum, 1);%softmat迴歸的偏置引數個數 
    net.ffW = (rand(onum, fvnum) - 0.5) * 2 * sqrt(6 / (onum + fvnum)); %% softmaxt迴歸的權值引數 為10*192個 全連線
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

\CNN\cnnff.m

function net = cnntrain(net, x, y, opts)  %%訓練的過程,包括bp演算法及迭代過程  

    m = size(x, 3); %% m為樣本照片的數量,size(x)=[28*28*6000] 
    numbatches = m / opts.batchsize;% 迴圈的次數 共1200次,每次使用50個樣本進行
    if rem(numbatches, 1) ~= 0
        error('numbatches not integer');
    end
    net.rL = [];%rL是最小均方誤差的平滑序列,繪圖要用
    for i = 1 : opts.numepochs    %迭代次數  
        disp(['epoch ' num2str(i) '/' num2str(opts.numepochs)]);
        tic;
        kk = randperm(m); %% 隨機產生m以內的不重複的m個數  
        for l = 1 : numbatches  %% 迴圈1200次,每次選取50個不重複樣本進行更新 
            batch_x = x(:,:, kk((l - 1) * opts.batchsize + 1 : l * opts.batchsize));%50個樣本的訓練資料 
            batch_y = y(:,    kk((l - 1) * opts.batchsize + 1 : l * opts.batchsize));%50個樣本所對應的標籤

            net = cnnff(net, batch_x);%計算前向傳導過程 
            net = cnnbp(net, batch_y);%計算誤差並反向傳導,計算梯度
            net = cnnapplygrads(net, opts); %% 應用梯度迭代更新模型
            %net.L為模型的costFunction,即最小均方誤差mse
            %rL是最小均方誤差的平滑序列
            if isempty(net.rL)%為空
                net.rL(1) = net.L; %loss function的值
            end
            net.rL(end + 1) = 0.99 * net.rL(end) + 0.01 * net.L; 
            %相當於對每一個batch的誤差進行累積(加權平均)
        end
        toc;
    end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

\CNN\cnnff.m 
back propagation 計算gradient

function net = cnnff(net, x)%完成訓練的前向過程,  
    n = numel(net.layers);  
    net.layers{1}.a{1} = x; % a是輸入map,是一個【28,28,50】的矩陣
    inputmaps = 1;

    for l = 2 : n   %針對每一個卷積層
        if strcmp(net.layers{l}.type, 'c')
            for j = 1 : net.layers{l}.outputmaps   % 針對該層的每一個feture map  
                %  create temp output map
                z = zeros(size(net.layers{l - 1}.a{1}) - [net.layers{l}.kernelsize - 1 net.layers{l}.kernelsize - 1 0]);
                %z=zeros([28,28,50]-[5-1,5-1,0])=([24,24,50])
                % 該層feture map的大小,最後一位是樣本圖片個數 初始化為0  
                for i = 1 : inputmaps  %針對每一個輸入feature map 
                    z = z + convn(net.layers{l - 1}.a{i}, net.layers{l}.k{i}{j}, 'valid');
                    %做卷積操作  k{i}{j} 是5*5的double型別,其中a{i}是輸入圖片的feature map 大小為28*28*50 50為影象數量  
                    %卷積操作這裡的k已經旋轉了180度,z儲存的就是該層中所有的特徵
                end 
                % 通過非線性加偏值
                net.layers{l}.a{j} = sigm(z + net.layers{l}.b{j});%%獲取sigmoid function的值 
            end
            inputmaps = net.layers{l}.outputmaps; %% 設定新的輸入feature maps的個數      

        elseif strcmp(net.layers{l}.type, 's')% 下采樣採用的方法是,2*2相加乘以權值1/4,  沒有取偏置和取sigmoid  
            %  downsample
            for j = 1 : inputmaps
                %這裡做的是mean-pooling
                z = convn(net.layers{l - 1}.a{j}, ones(net.layers{l}.scale) / (net.layers{l}.scale ^ 2), 'valid');  
                 %先卷積後各行各列取結果
                net.layers{l}.a{j} = z(1 : net.layers{l}.scale : end, 1 : net.layers{l}.scale : end, :);
                 %得到的結果是上一層卷積層行列的一半  a=z  
            end
        end
    end
    %  收納到一個vector裡面,方便後面用~~  
    %  concatenate all end layer feature maps into vector
    net.fv = []; %%用來儲存最後一個隱藏層所對應的特徵 將feature maps變成全連線的形式 
    %%net.fv: 最後一層隱藏層的特徵矩陣,採用的是全連線方式
    for j = 1 : numel(net.layers{n}.a) % fv每次拼合入subFeaturemap2[j],[包含50個樣本]
        sa = size(net.layers{n}.a{j}); % 每一個featureMap的大小為a=sa=4*4*50,得到sfm2的一個輸入圖的大小
        %rashape(A,m,n)
        %把矩陣A改變形狀,變為m行n列(元素個數不變,原矩陣按列排成一隊,再按行排成若干隊)
        %把net.layers{numLayers}.a[j](一個sfm2)排列成為[4*4行,1列]的一個向量
        %把所有的sfm2拼合成為一個列向量fv
        net.fv = [net.fv; reshape(net.layers{n}.a{j}, sa(1) * sa(2), sa(3))];
        % 最後得到192*50的矩陣,每一列對應一個樣本影象的特徵 
    end                        
    %feedforward into output perceptrons
    %net.ffW是【10,192】的權重矩陣
    %net.ffW*net.fv是一個【10,50】的矩陣
    %repat(net.ffb,1,size(net.fv,2))把bias複製成50份排開
    net.o = sigm(net.ffW * net.fv + repmat(net.ffb, 1, size(net.fv, 2))); 
    %結果為10*50的矩陣,每一列表示一個樣本影象的標籤結果 取了sigmoid function表明是k個二分類器,各類之間不互斥,當然也可以換成softmax迴歸  
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

\CNN\cnnbp.m

function net = cnnbp(net, y)%計算並傳遞神經網路的error,並計算梯度(權重的修改量) 
    n = numel(net.layers); %layers層個數 
    %   error
    net.e = net.o - y; % 10*50  每一列表示一個樣本影象
    %  loss function,均方誤差
    net.L = 1/2* sum(net.e(:) .^ 2) / size(net.e, 2);%沒有加入引數構成貝葉斯學派的觀點

    %% backprop deltas
    %計算尾部單層感知機的誤差
    net.od = net.e .* (net.o .* (1 - net.o));   %  輸出層的誤差 sigmoid誤差
    %fvd,feature vector delta,特徵向量誤差,上一層收集下層誤差,size=[192*50]
    net.fvd = (net.ffW' * net.od);            
    %如果MLP的前一層(特徵抽取最後一層)是卷基層,卷基層的輸出經過sigmoid函式處理,error需要求導
    %在數字識別這個網路中不需要用到
    if strcmp(net.layers{n}.type, 'c')          %  only conv layers has sigm function
        %對於卷基層,它的特徵向量誤差 再求導
        net.fvd = net.fvd .* (net.fv .* (1 - net.fv)); %% 如果最後一個隱藏層是卷積層,直接用該公式就能得到誤差
    end

    %  reshape feature vector deltas into output map style
    %把單層感知機的輸入層featureVector 的誤差矩陣,恢復為subFeatureMap2的4*4二位矩陣形式
    sa = size(net.layers{n}.a{1}); %size(a{1})=[4*4*50],一共有a{1}~a{12}}
    fvnum = sa(1) * sa(2);%fvnum 一個圖所含有的特徵向量數量,4*4
    for j = 1 : numel(net.layers{n}.a)   %subFeatureMap的數量,1:12
        %net最後一層的delta,由特徵向量delta,依次取一個featureMap大小,然後組合成為一個featureMap的形狀
        %在fvd裡面儲存的是所有樣本的特徵向量(在cnnff.m函式中用特徵map拉成的),這裡需要重新變換回來特徵map的形式
        net.layers{n}.d{j} = reshape(net.fvd(((j - 1) * fvnum + 1) : j * fvnum, :), sa(1), sa(2), sa(3));
        %size(net.layers{numLayers}.d{j})=【4*4*50】
        %size(net.fvd)=[192*50]
    end

    for l = (n - 1) : -1 : 1   %實際是到2終止了,1是輸入層,沒有誤差要求
        %l層是卷積層,誤差從下層(降取樣層傳來),採用從後往前均攤的方式傳播誤差,上層誤差內攤2倍,再除以4
        if strcmp(net.layers{l}.type, 'c')  %卷積層的計算方式
            for j = 1 : numel(net.layers{l}.a)   %第n-1層具有的feature maps的個數,進行遍歷 每個d{j}是8*8*50的形式, 由於下一層為下采樣層,故後一層d{j}擴充套件為8*8的(每個點複製成2*2的),按照bp求誤差公式就可以得出,這裡權重就為1/4,
                %net.layers{l}.a{j}.*(1-net.layers{l}.a{j})為sigmoid的倒數
                %(expand(net.layers{l+1}.d{j},[net.layers{j+1}.scale net.layers{l+1}.scale 1]))
                %expand多項式展開相乘
                %net.layers{l+1}.scale^2
                net.layers{l}.d{j} = net.layers{l}.a{j} .* (1 - net.layers{l}.a{j}) .* (expand(net.layers{l + 1}.d{j}, [net.layers{l + 1}.scale net.layers{l + 1}.scale 1]) / net.layers{l + 1}.scale ^ 2);%克羅內克積進行擴充,求取樣曾的卷基層的殘差,d表示殘差,a表示輸出值
            end
            %l層是降取樣層,誤差從下層(卷積層傳來),採用卷積的方式得到
        elseif strcmp(net.layers{l}.type, 's') 
            for i = 1 : numel(net.layers{l}.a)  %l層輸出層的數量
                z = zeros(size(net.layers{l}.a{1}));  %z得到一個feature map的大小的零矩陣
                for j = 1 : numel(net.layers{l + 1}.a) %從l+1層收集錯誤
                    %net.layers{l+1}.d{j}下一層(卷積層)的靈敏度
                    %net.layers{l+1}.k{i}{j},下一層(卷積層)的卷積核
                     z = z + convn(net.layers{l + 1}.d{j}, rot180(net.layers{l + 1}.k{i}{j}), 'full');
                end  
                net.layers{l}.d{i} = z;  %% 因為是下采樣層,所以a=z,就f(z)=z,導數就等於1,所以誤差就是所連線結點權值與後一層誤差和  
            end
        end
    end

    %%  calc gradients    
    %計算特徵抽取層(卷積+降取樣)的梯度
    for l = 2 : n
        if strcmp(net.layers{l}.type, 'c')%卷積層
            for j = 1 : numel(net.layers{l}.a)%l層的featureMap的數量
                for i = 1 : numel(net.layers{l - 1}.a)
                    %卷積核的修改量=輸入影象*輸出影象的delta
                    net.layers{l}.dk{i}{j} = convn(flipall(net.layers{l - 1}.a{i}), net.layers{l}.d{j}, 'valid') / size(net.layers{l}.d{j}, 3);% 可以看論文中的推導!與論文中先將k rot180,然後再rot整體效果是一樣的。 
                end
                %net.layers{l}.d{j}(:)是一個24*24*50的矩陣,db僅除以50
                net.layers{l}.db{j} = sum(net.layers{l}.d{j}(:)) / size(net.layers{l}.d{j}, 3);  %% 對偏置引數b的導數 
            end
        end
    end
    %計算尾部單層感知機的梯度
    %sizeof(net.od)=[10,50]
    %修改量,求和除以50(batch大小)
    net.dffW = net.od * (net.fv)' / size(net.od, 2);  %softmax迴歸中引數所對應的導數  
    net.dffb = mean(net.od, 2);%% 第二維取均值  

    function X = rot180(X)
        X = flipdim(flipdim(X, 1), 2);% flipdim(X, 1) 行互換  flipdim(X, 2) 列互換  
    end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

在這裡插入一張圖片便於大家理解: 
這裡寫圖片描述 
\CNN\cnnapplygrads.m 
該函式完成權重修改,更新模型的功能 
1更新特徵抽取層的權重 weight+bias 
2 更新末尾單層感知機的權重 weight+bias

function net = cnnapplygrads(net, opts)%% 把計算出來的梯度加到原始模型上去  
    %特徵抽取層(卷積降取樣)的權重更新
    for l = 2 : numel(net.layers)%從第二層開始
        if strcmp(net.layers{l}.type, 'c')%對於每個卷積層
            for j = 1 : numel(net.layers{l}.a)%美劇該層的每個輸出
                for ii = 1 : numel(net.layers{l - 1}.a)
                    net.layers{l}.k{ii}{j} = net.layers{l}.k{ii}{j} - opts.alpha * net.layers{l}.dk{ii}{j};
                    % 梯度下降求更新後的引數 
                end
                %修改bias
                net.layers{l}.b{j} = net.layers{l}.b{j} - opts.alpha * net.layers{l}.db{j};
            end
        end
    end
    %單層感知機的權重更新
    net.ffW = net.ffW - opts.alpha * net.dffW;%更新權重
    net.ffb = 
            
           

相關推薦

神經網路matlab 程式碼理解

網路結構圖:  開啟路徑\tests\test_example_cnn.m function test_example_CNN clc, clear; addpath D:\matlab文件\DeepLearnToolbox\data\ %按照文件所在路徑進行載入 addpath D:\matlab文

Matlab程式設計之——神經網路CNN程式碼解析

卷積神經網路CNN程式碼解析 deepLearnToolbox-master是一個深度學習matlab包,裡面含有很多機器學習演算法,如卷積神經網路CNN,深度信念網路DBN,自動編碼AutoE ncoder(堆疊SAE,卷積CAE)的作者是 RasmusBerg Palm 今天給介紹d

二維神經網路的結構理解

針對這個圖,我們對應著卷積的api函式來說: tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)   如上圖: 第一列為一張輸入影象, 大小為7*7*3,

續(利用tensorflow實現簡單的神經網路-對程式碼中相關函式介紹)——遷移學習小記(三)

  上篇文章對cnn進行了一些介紹,附了完整小例子程式碼,介紹了一部分函式概念,但是對我這樣的新手來說,程式碼中涉及的部分函式還是無法一下子全部理解。於是在本文中將對程式碼中使用的函式繼續進行一一介紹。 具體程式碼見上一篇(二) 一、 #定義輸入的placehoder,x是特徵

神經網路CNNs的理解與體會

孔子說過,溫故而知新,時隔倆月再重看CNNs,當時不太瞭解的地方,又有了新的理解與體會,特此記錄下來。文章圖片及部分素材均來自網路,侵權請告知。 卷積神經網路(Convolutinal Neural Networks)是非常強大的一種深度神經網路,它在圖片的識

深度學習與神經網路(直觀理解

基本上在輸入影象中,如果有一個形狀是類似於這種濾波器的代表曲線,那麼所有的乘積累加在一起會導致較大的值!現在讓我們看看當我們移動我們的過濾器時會發生什麼。可以看到結果值是0哦,為什麼?還不明白麼,因為耳朵的邊緣和剛剛尾股部曲線太不同了。 這樣的多個濾波器就可以在大量資料的訓練下得到大量特徵了

TensorFlow實現用於影象分類的神經網路程式碼詳細註釋)

這裡我們採用cifar10作為我們的實驗資料庫。 首先下載TensorFlow Models庫,以便使用其中提供的CIFAR-10資料的類。 git clone https://github.com/tensorflow/models.git cd mo

Alexnet 神經網路matlab程式碼 底層實現(一)正向傳播

本程式的主要目的是通過自主編寫alexnet網路,深入瞭解卷積、pooling、區域性區域正則化、全連線層、基於動量的隨機梯度下降、卷積神經網路的引數修正演算法等神經網路的基礎知識。 寫這個部落格一方面幫助自己理清思路,另一方面督促自己加快進度,也希望可以幫助到同樣想深入瞭

CNN--神經網路從R-CNN到Faster R-CNN的理解(CIFAR10分類程式碼)

1. 什麼是CNN 卷積神經網路(Convolutional Neural Networks, CNN)是一類包含卷積計算且具有深度結構的前饋神經網路(Feedforward Neural Networks),是深度學習(deep learning)的代表演算法之一。 我們先來看卷積神經網路各個層級結構圖

神經網路理解(一):濾波器的意義

歡迎大家關注我們的網站和系列教程:http://www.tensorflownews.com/,學習更多的機器學習、深度學習的知識! 荔枝boy 卷積神經網路的發展 卷積神經網路的重要性 卷積神經網路與影象識別 濾波器 一.卷積神經網路的發展

DeepLearning tutorial(4)CNN神經網路原理簡介+程式碼詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Python CNN神經網路程式碼實現

1 # -*- coding: utf-8 -*- 2 """ 3 Created on Wed Nov 21 17:32:28 2018 4 5 @author: zhen 6 """ 7 8 import tensorflow as tf 9 from tensorflow.e

利用Python實現神經網路的視覺化(附Python程式碼

對於深度學習這種端到端模型來說,如何說明和理解其中的訓練過程是大多數研究者關注熱點之一,這個問題對於那種高風險行業顯得尤為重視,比如醫療、軍事等。在深度學習中,這個問題被稱作“黑匣子(Black Box)”。如果不能解釋模型的工作過程,我們怎麼能夠就輕易相信模型的輸出結果呢? 以深度學習模型檢測

神經網路6_CNN(神經網路)、RNN(迴圈神經網路)、DNN(深度神經網路)概念區分理解

 sklearn實戰-乳腺癌細胞資料探勘(部落格主親自錄製視訊教程,QQ:231469242) https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campaign=commission&utm

神經網路CNN與基於MNIST的Python程式碼示例

卷積神經網路入門學(1) 原文地址:http://blog.csdn.net/hjimce/article/details/47323463 作者:hjimce 卷積神經網路演算法是n年前就有的演算法,只是近年來因為深度學習相關演算法為多層網路的訓練提供了新方法,然後現在

神經網路中感受野的理解和計算

什麼是感受野 “感受野”的概念來源於生物神經科學,比如當我們的“感受器”,比如我們的手受到刺激之後,會將刺激傳輸至中樞神經,但是並不是一個神經元就能夠接受整個面板的刺激,因為面板面積大,一個神經元可想而知肯定接受不完,而且我們同時可以感受到身上面板在不同的地方,如手、腳,的不同的刺激,如

CNN神經網路原理的直觀理解

哈哈?偶然在知乎上翻到了我旭神對CNN原理的通俗易懂的解釋,看完以後簡直醍醐灌頂呢。 下面上頭像!! 哼,趕緊記錄一下加強一下理解! 轉自知乎我旭神 如果學過數字影象處理,對於卷積核的作用應該不陌生,比如你做一個最簡單的方向濾波器,那就是一個二維卷積核,這個

神經網路CNN原理——結合例項matlab實現

卷積神經網路CNN是深度學習的一個重要組成部分,由於其優異的學習效能(尤其是對圖片的識別)。近年來研究異常火爆,出現了很多模型LeNet、Alex net、ZF net等等

lesson26-27神經網路,lenet5程式碼講解

https://www.bilibili.com/video/av22530538/?p=27   ##mnist_lenet5_forward.py #encoding:utf-8 import tensorflow as tf IMAGE_SIZE = 28 NUM_CHANN

CNN筆記 通俗理解神經網路

                               通俗理解卷積神經網路(cs231n與5月dl班課程筆記)1 前言    2012年我在北京組織過8期machine learning讀書會,那時“機器學習”非常火,很多人都對其抱有巨大的熱情。當我2013年再次來到北京時,有一個詞似乎比“機器學習”