在神经网络权重矩阵中获取NaN值

时间:2016-10-19 17:02:24

标签: matlab neural-network backpropagation feed-forward

**我正在尝试在MATLAB中开发一个前馈NN。我有一个12输入和1输出的数据集与46998个样本。我在Matrix的最后几行中有一些NaN值,因为一些输入是加速度&速度为1&分别比位移少2步。

有了这个当前的数据集,我得到了w1_grad& w2_grad作为NaN矩阵。我尝试使用`Heave_dataset(isnan(Heave_dataset))= [];删除它们,但我的数据集正在转换为(1 * 610964)的列矩阵。

任何人都可以帮我这个吗?

                                                                    %

%% Clear Variables, Close Current Figures, and Create Results Directory 

clc;
clear all;
close all;
mkdir('Results//'); %Directory for Storing Results

%% Configurations/Parameters

load 'Heave_dataset'

% Heave_dataset(isnan(Heave_dataset))=[];

nbrOfNeuronsInEachHiddenLayer = 24; 
nbrOfOutUnits = 1;
unipolarBipolarSelector = -1; %0 for Unipolar, -1 for Bipolar
learningRate = 0.08;
nbrOfEpochs_max = 50000;


%% Read Data

Input = Heave_dataset(:, 1:length(Heave_dataset(1,:))-1);
TargetClasses = Heave_dataset(:, length(Heave_dataset(1,:)));

%% Calculate Number of Input and Output NodesActivations

nbrOfInputNodes = length(Input(1,:)); %=Dimention of Any Input Samples
nbrOfLayers = 2 + length(nbrOfNeuronsInEachHiddenLayer);
nbrOfNodesPerLayer = [nbrOfInputNodes nbrOfNeuronsInEachHiddenLayer nbrOfOutUnits];


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Forward Pass %%%%%%%%%%%


%% Adding the Bias to Input layer

Input = [ones(length(Input(:,1)),1) Input];


%% Weights leading from input layer to hidden layer is w1

w1 = rand(nbrOfNeuronsInEachHiddenLayer,(nbrOfInputNodes+1));

%% Input & output of hidde layer

hiddenlayer_input = Input*w1';

hiddenlayer_output = -1 + 2./(1 + exp(-(hiddenlayer_input)));

%% Adding the Bias to hidden layer

hiddenlayer_output = [ones(length(hiddenlayer_output(:,1)),1) hiddenlayer_output];

%% Weights leading from input layer to hidden layer is w1

w2 = rand(nbrOfOutUnits,(nbrOfNeuronsInEachHiddenLayer+1));

%% Input & output of hidde layer

outerlayer_input = hiddenlayer_output*w2';

outerlayer_output = outerlayer_input;

%% Error Calculation

TotalError = 0.5*(TargetClasses-outerlayer_output).^2;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Backward Pass %%%%%%%%%%%

d3 = outerlayer_output - TargetClasses;

d2 = (d3*w2).*hiddenlayer_output.*(1-hiddenlayer_output);

d2 = d2(:,2:end);

D1 = d2' * Input;

D2 = d3' * hiddenlayer_output;

w1_grad = D1/46998 + learningRate*[zeros(size(w1,1),1) w1(:,2:end)]/46998;

w2_grad = D2/46998 + learningRate*[zeros(size(w2,1),1) w2(:,2:end)]/46998;

1 个答案:

答案 0 :(得分:0)

您应该尝试向量化您的算法。首先将数据排列在46998x12矩阵X.Add偏向X,如X = [ones(46998,1 X)。然后从输入层到第一个隐藏层的权重必须排列在矩阵W1中,其尺寸为numberofneuronsinfirsthiddenlayer(24) x(输入+ 1)。那么X W1'就是你在神经元函数中输入的东西(无论是sigmoid还是其他任何东西)。结果(如sigmoid(X W')是输出您可以像以前一样添加偏差并乘以权重矩阵W2(从隐藏层1到隐藏层2的权重)等等。希望这有助于让您开始对代码进行矢量化,至少对于前向部分。反向传播部分有点棘手,但幸运的是涉及相同的矩阵 我将简要地背诵前馈过程,以便我们使用相同的语言来讨论反向传播 有数据称为X.(尺寸46998x12)
A1 = [ones(46998,1 X)是包括偏差的输入。(46998x13)
Z2 = A1 * W1'(W1是从输入到隐藏层1的重量矩阵)
A2 = S形(Z2);
A2 = [ones(m,1)A2];再次增加偏见
Z3 = A2 * W2';
A3 = sigmoid(Z3);
假设您在这里只有一个隐藏层前馈停止。我现在就开始倒退了,你可以酌情概括一下 d3 = A3 - Y; (Y必须是您数据的一部分,您训练nn的数据的实际值)
d2 =(d3 * W2)。* A2。*(1-A2); (Sigmod函数有一个很好的属性,d(sigmoid(z))/ dz = sigmoid(z)*(1-sigmoid(z))。)
d2 = d2(:,2:end);(你不需要在偏差中对应的第一列)
D1 = d2'* A1;
D2 = d3'* A2;
W1_grad = D1 / m + lambda * [零(大小(W1,1),1)W1(:,2:end)] / m; (lamda是收益率,m是46998)
W2_grad = D2 / m + lambda * [零(大小(W2,1),1)W2(:,2:结束)] / m;
除了必须最小化的矢量化成本函数之外,现在一切都必须到位。希望这有点帮助...