在神经网络权重矩阵中获取 NaN 值
Getting NaN values in neural network weight matrices
**我正在尝试在 MATLAB 中开发前馈神经网络。我有一个包含 46998 个样本的 12 个输入和 1 个输出的数据集。我在 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;
您应该尝试向量化您的算法。首先将数据排列在一个 46998x12 矩阵 X.Add 中偏向 X,如 X=[ones(46998,1 X)。然后,从输入层到第一个隐藏层的权重必须排列在矩阵 W1 中,维度为 numberofneuronsinfirsthiddenlayer( 24)x(input + 1)。那么 XW1' 就是你输入神经元函数的内容(要么是 sigmoid,要么是什么)。结果(如 sigmoid(XW ') 是隐藏层 1 神经元的输出。你像以前一样添加偏差并乘以权重矩阵 W2(从隐藏层 1 到隐藏层 2 的权重)等等。希望这有助于你开始矢量化你的至少为前馈部分编写代码。反向传播部分有点棘手,但幸运的是涉及相同的矩阵。
我将很快背诵前馈过程,以便我们使用相同的语言谈论反向传播。
有一个名为 X 的数据。(尺寸 46998x12)
A1 = [ones(46998,1 X] 是包含偏差的输入。(46998x13)
Z2 = A1*W1'(W1是从输入到隐藏层1的权重矩阵)
A2 = 乙状结肠 (Z2);
A2 = [ones(m,1) A2];再次添加偏见
Z3 = A2 * W2';
A3 = 乙状结肠 (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*[zeros(size(W1,1),1) W1(:,2:end)]/m; (lamda为收益率,m为46998)
W2_grad = D2/m + lambda*[zeros(size(W2,1),1) W2(:,2:end)]/m;
除了必须最小化的矢量化成本函数外,现在一切都必须就绪。希望这会有所帮助...
**我正在尝试在 MATLAB 中开发前馈神经网络。我有一个包含 46998 个样本的 12 个输入和 1 个输出的数据集。我在 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;
您应该尝试向量化您的算法。首先将数据排列在一个 46998x12 矩阵 X.Add 中偏向 X,如 X=[ones(46998,1 X)。然后,从输入层到第一个隐藏层的权重必须排列在矩阵 W1 中,维度为 numberofneuronsinfirsthiddenlayer( 24)x(input + 1)。那么 XW1' 就是你输入神经元函数的内容(要么是 sigmoid,要么是什么)。结果(如 sigmoid(XW ') 是隐藏层 1 神经元的输出。你像以前一样添加偏差并乘以权重矩阵 W2(从隐藏层 1 到隐藏层 2 的权重)等等。希望这有助于你开始矢量化你的至少为前馈部分编写代码。反向传播部分有点棘手,但幸运的是涉及相同的矩阵。
我将很快背诵前馈过程,以便我们使用相同的语言谈论反向传播。
有一个名为 X 的数据。(尺寸 46998x12)
A1 = [ones(46998,1 X] 是包含偏差的输入。(46998x13)
Z2 = A1*W1'(W1是从输入到隐藏层1的权重矩阵)
A2 = 乙状结肠 (Z2);
A2 = [ones(m,1) A2];再次添加偏见
Z3 = A2 * W2';
A3 = 乙状结肠 (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*[zeros(size(W1,1),1) W1(:,2:end)]/m; (lamda为收益率,m为46998)
W2_grad = D2/m + lambda*[zeros(size(W2,1),1) W2(:,2:end)]/m;
除了必须最小化的矢量化成本函数外,现在一切都必须就绪。希望这会有所帮助...