0

matlab は初めてです。
誰かが私に次のコードを説明できますか。このコードは、ニューラル ネットワークのトレーニングに使用されます

N = xlsread('data.xls','Sheet1');
N = N(1:150,:);
UN = xlsread('data.xls','Sheet2');
UN = UN(1:150,:);
traindata = [N ; UN];
save('traindata.mat','traindata');
label = [];
for i = 1 : size(N,1)*2
if( i <= size(N,1))
%        label = [label ;sum(traindata(i,:))/size(traindata(i,:),2)];
     label = [label ;sum(traindata(i,:))/10];
else
%        label = [label ;sum(traindata(i,:))/size(traindata(i,:),2)];
     label = [label ;sum(traindata(i,:))/10];
end
end
weightMat = BpTrainingProcess(4,0.0001,0.1,0.9,15,[size(traindata,1) 1],traindata,label);
4

1 に答える 1

0

に対応するニューラル ネットワーク ツールボックス ビルトインが見つかりません。BpTrainingProcess()ローカルでアクセスできるファイルでなければなりません (または、このコードを提供した人から入手する必要があります)。これは、Neural Network ツールボックス関数への複数の関数呼び出しをつなぎ合わせている可能性が高いか、逆伝播トレーニング メソッドの独自の実装である可能性があります。

それ以外の場合、コードにはいくつかの欠点があります。1 つは、内部の if-else ステートメントが実際に何もしていないように見えることです。コメントアウトされた行でさえ、まったく役に立たない if-else セットアップを残します。if-else は、Excel ファイルの Sheet1 からロードされたデータと Sheet2 からロードされたデータに対して異なるラベル正規化を行うことを意図しているようです。それはあなたにとって重要かもしれませんが、現在のプログラムでは発生していません。

最後に、コードは空の配列を使用し、空の配列にlabel行を追加します。行数がすでにわかっているため、これは不要です (合計で行数になります。 for ループの各反復で、通常のインデックス付けをsize(N,1)*2 = 150*2 = 300簡単に設定して使用することもできます: 。これにより、時間とスペースが節約されますが、間違いなく300 行のデータ セットではあまり問題になりません (各行の長さがそれほど大きくないと仮定します)。label=zeros(300,1)label(i) = ...

以下のコードの横にドキュメントを配置します。

% The functionn 'xlsread()' reads data from an Excel file.
% Here it is storing the values from Sheet 1 of the file 'data.xls'
% into the variable N, and then using the syntax N = N(1:150,:) to
% change N from being all of the data into being only the first
% 150 rows of the data
N = xlsread('data.xls','Sheet1');
N = N(1:150,:);

% Now do the same thing for Sheet 2 from the Excel file.
UN = xlsread('data.xls','Sheet2');
UN = UN(1:150,:);

% This concatenates the two different data arrays together, making
% one large array where N is the top half and UN is the bottom half.
% This is basically just stacking N on top of UN into one array.
traindata = [N ; UN];

% This saves a copy of the newly stacked array into the Matlab data file
% 'traindata.mat'. From now on, you should be able to load the data from
% this file, without needing to read it from the Excel sheet above.
save('traindata.mat','traindata');

% This makes an empty array which will have new things appended to it below.
label = [];

% Because UN and N have the same number of rows, then the training data
% has twice as many rows. So this sets up a for loop that will traverse
% all of these rows of the training data. The 'size()' function can be
% used to get the different dimensions of an array.
for i = 1 : size(N,1)*2

    % Here, an if statement is used to check if the current row number, i,
    % is less than or equal to than the number of rows in N. This implies
    % that this part of the if-statement is only for handling the top half
    % of 'trainingdata', that is, the stuff coming from the variable N.

    if( i <= size(N,1))
       % The line below was already commented out. Maybe it had an old use
       % but is no longer needed?
       % label = [label ;sum(traindata(i,:))/size(traindata(i,:),2)];

       % This syntax will append new rows to the variable 'label', which
       % started out as an empty array. This is usually bad practice, memory-wise
       % and also for readability.

       % Here, the sum of the training data is being computed, and divided by 10
       % in every case, and then appended as a new row in 'label'. Hopefully,
       % if you are familiar with the data, you will know why the data in 'N'
       % always needs to be divided by 10.
       label = [label ;sum(traindata(i,:))/10];

    % Otherwise, if i > # of rows then handle the data differently.
    % Really this means the code below treats only data from the variable UN.
    else
       % The line below was already commented out. Maybe it had an old use
       % but is no longer needed?
       % label = [label ;sum(traindata(i,:))/size(traindata(i,:),2)];

       % Just like above, the data is being divided by 10. Given that there
       % is nothing different about the code here, and how it modifies 'label'
       % there is no need for the if-else statements, and they only waste time.
       label = [label ;sum(traindata(i,:))/10];

    % This is needed to show the end of the if-else block.
    end

% This is needed to show the end of the for-loop.
end


% This appears to be a Back-Propagation Neural Network training function.
% This doesn't match any built-in Matlab function I can find, but you might
% check in the Neural Network toolbox to see if the local function
% BpTrainingProcess is a wrapper for a collection of built-in training functions.

weightMat = BpTrainingProcess(4, 0.0001, 0.1, 0.9, 15,
                              [size(traindata,1) 1], traindata,label);

逆伝播トレーニング用の Matlab ニューラル ネットワーク ツールボックス関数の例へのリンクを次に示します。そこにあるドキュメントを調べて、 の内部に似ているものがあるかどうかを確認することをお勧めしますBpTrainingProcess()

于 2012-04-16T03:56:46.130 に答える