【问题标题】:Gated Recurrent Neural Networks (e.g. LSTM) in MatlabMatlab 中的门控循环神经网络(例如 LSTM)
【发布时间】:2016-09-07 14:33:40
【问题描述】:

我希望在 Matlab 中探索门控循环神经网络(例如 LSTM)。我能找到的最接近的匹配是layrecnet。这个函数的描述很简短,也不是很清楚(即没有使用我习惯的术语)。因此,我的问题是这个函数是否包含一个门(我 90% 确定它不包含),如果没有,是否还有其他 Matlab 实现呢?如果可能的话,我更喜欢原生(即神经网络工具箱)实现。

【问题讨论】:

    标签: matlab neural-network deep-learning lstm recurrent-neural-network


    【解决方案1】:

    我已经使用 matlab 实现了 LSTM 网络。 代码如下:

    function net1=create_LSTM_network(input_size , before_layers , before_activation,hidden_size, after_layers , after_activations , output_size)
    %% this part split the input into two seperate parts the first part
    %is the input size and the second part is the memory
    real_input_size=input_size ;
    N_before=length(before_layers);
    N_after=length(after_layers) ;
    delays_vec=1 ;
    if (N_before>0 ) && (N_after>0)
    input_size=before_layers(end) ;
    net1=fitnet( [before_layers , input_size+hidden_size , hidden_size*ones(1,9),after_layers]) ;
    elseif (N_before>0) && (N_after==0)
    input_size=before_layers(end) ;
    net1=fitnet([before_layers,input_size+hidden_size , hidden_size*ones(1 , 9)]) ;
    elseif (N_before==0)&&(N_after>0)
    net1=fitnet([input_size+hidden_ size , hidden_size*ones(1, 9) , after_layers]) ;
    else
    net1 =fitnet( [input size+hidden_size, hidden_size*ones(1, 9)]);
    end
    net1=configure(net1 ,rand( real_input_size , 200) , rand(output_size,200)) ;
    %% concatenation
    net1.layers{N_before+1}.name='Concatenation Layer';
    net1.layers{N_before+2}.name = 'Forget Amount' ;
    net1.layers{N_before+3}.name= 'Forget Gate';
    net1.layers{N_before+4}.name= 'Remember Amount';
    net1.layers{N_before+5}.name= 'tanh Input' ;
    net1.layers{N_before+6}.name= 'Forget Gate';
    net1.layers{N_before+7}.name= 'Update Memory';
    net1.layers {N_before+8}.name= 'tanh Memory';
    net1.layers{N_before+9}.name= 'Combine Amount' ;
    net1.layers{N_before+10}.name= 'Combine gate' ;
    net1.layerConnect(N_before+3 , N_before+7) =1 ;
    net1.layerConnect(N_before+1 ,N_before+10)=1 ;
    net1.layerConnect(N_before+4 , N_before+3)=0;
    net1.layerWeights{N_before+1 , N_before+10}.delays=delays_vec ;
    if N_before>0
    net1.LW{N_before+1 , N_before} = [eye(input_size) ; zeros(hidden_size, input_size)];
    else
    net1.IW{1,1}=[eye( input_size) ;zeros(hidden_size , input_size)];
    end
    net1.LW{N_before+1 , N_before+10}=repmat ([zeros(input_size, hidden_size); eye(hidden_size)] , [1 , size(delays_vec,2)] ) ;
    net1.layers{N_before+1}.transferFcn='purelin';
    net1.layerWeights{N_before+1 ,N_before+10}.learn=false;
    if N_before>0
    net1.layerWeights{ N_before+1 ,N_before}.learn=false;
    else
    net1.inputWeights{ 1, 1}.learn=false ;
    end
    %%
    net1.biasConnect = [ones(1,N_before) 0 1 0 1 1 0 0 0 1 0 1 ones(1,N_after)]' ;%
    %% first gate
    net1.layers{N_before+2}.transferFcn= 'logsig' ;
    net1.layerWeights{N_before+3, N_before+2}.weightFcn='scalprod' ;
    % net1 .layerWeights{3 , 7} .weightFcn= ' scalprod ';
    net1.layerWeights{N_before+3, N_before+2}.learn=false;
    net1.layerWeights{N_before+3, N_before+7}.learn=false ;
    net1.layers{N_before+3}.netinputFcn= 'netprod';
    net1.layers{N_before+3}.transferFcn='purelin';
    net1.LW{N_before+3, N_before+2}=1;
    % net1.LW{3 , 7} =1 ;
    %% second gate
    net1.layerConnect(N_before+4,N_before+1)=1;
    net1.layers{N_before+4}.transferFcn='logsig' ;
    %% tanh
    net1.layerConnect(N_before+5 , N_before+4) =0;
    net1.layerConnect( N_before+5 , N_before+1)=1;
    %%second gate mult
    net1.layerConnect(N_before+6, N_before+4)=1;
    net1.layers{N_before+6}.netinputFcn='netprod' ;
    net1.layers{N_before+6} .transferFcn= 'purelin';
    net1.layerWeights{N_before+6, N_before+5}.weightFcn='scalprod';
    net1.layerWeights {N_before+6 , N_before+4}.weightFcn='scalprod';
    net1.layerWeights{N_before+6 , N_before+5}.learn=false ;
    net1.layerWeights{N_before+6,N_before+4}.learn=false;
    net1.LW{N_before+6 , N_before+5} =1;
    net1.LW{N_before+6 , N_before+4}=1 ;
    %% C update
    delays_vec=1;
    net1.layerConnect(N_before+7,N_before+3)=1 ;
    net1.layerWeights{N_before+3,N_before+7} . delays=delays_vec ;
    net1.layerWeights{N_before+7,N_before+3}.weightFcn= 'scalprod';
    net1.layerWeights{N_before+7,N_before+6}.weightFcn= 'scalprod';
    net1 .layers{N_before+7}.transferFcn= 'purelin';
    net1.LW{N_before+7 , N_before+3} =1 ;
    net1.LW{N_before+7 , N_before+6} =1 ;
    net1.LW{N_before+3 , N_before+7}=repmat(eye(hidden_size), [1 , size(delays_vec,2)] );
    net1.layerWeights{N_before+3 , N_before+7}.learn=false ;
    net1.layerWeights{N_before+7 ,N_before+6}.learn=false;
    net1.layerWeights{N_before+7,N_before+3}.learn=false;
    %% output stage
    net1.layerConnect(N_before+9, N_before+8)=0;
    net1.layerConnect(N_before+10 , N_before+8) = 1 ;
    net1.layerConnect(N_before+9, N_before+1) =1 ;
    net1.layerWeights{N_before+10 , N_before+8}.weightFcn='scalprod' ;
    net1.layerWeights{N_before+10 , N_before+9}.weightFcn= 'scalprod' ;
    net1.LW{N_before +10 ,N_before+9}=1 ;
    net1.LW{N_before+10,N_before+8}=1 ;
    net1.layers{N_before+10}.netinputFcn= 'netprod' ;
    net1.layers{N_before+10}.transferFcn= 'purelin';
    net1.layers{N_before+9}.transferFcn= 'logsig';
    net1.layers{N_before+5}.transferFcn='tansig'; 
    net1.layers{N_before+8}.transferFcn='tansig' ;
    net1.layerWeights{N_before+10 ,N_before+ 9}.learn= false ;
    net1.layerWeights{N_before +10,N_before+8 }.learn= false ;
    net1.layerWeights{N_before+7 ,N_before+3 }. learn=false ;
    for ll=1:N_before
    net1.layers{ll}.transferFcn=before_activation;
    end
    for ll=1:N_after
    net1. layers{end-ll}.transferFcn=after_activations ;
    end
    
    net1.layerWeights{N_before+8 , N_before+7}.weightFcn='scalprod' ;
    net1.LW{N_before+8 , N_before+7}=1 ;
    net1.layerWeights{N_before+8 , N_before+7}.learn=false ;
    %%
    net1=configure(net1 , rand(real_input_size ,200) , rand(output_size , 200) ) ;
    net1.trainFcn= 'trainlm';
    

    【讨论】:

      【解决方案2】:

      我相信,没有办法使用本机神经网络工具箱来实现 LSTM/GRU,但是,有很多辅助库可以解决这个问题。请参阅thisthisthis

      最后一个似乎比前两个有更好的文档记录。

      【讨论】:

        猜你喜欢
        • 2017-02-19
        • 2018-10-05
        • 1970-01-01
        • 2015-12-03
        • 2011-08-23
        • 2022-08-15
        • 2015-07-11
        • 1970-01-01
        • 2017-02-16
        相关资源
        最近更新 更多