2016-09-15 56 views
0

我試圖構建一個類框架在Matlab神經網絡(ANN)通過定義一個Node類:定義Matlab的類具有另一個類的屬性

function NodeObject = Node(Input, Weights, Activation) 

Features.Input  = []; 
Features.Weights = []; 
Features.Activation = []; 

Features.Input  = Input; 
Features.Weights = Weights; 
Features.Activation = Activation; 

NodeObject = class(Features, 'Node'); 

如果這裏輸入的是一個整數(預期的輸入數量),權重是長度爲Features.Input的向量,並且Features.Activation是引用存儲在方法中的激活函數的字符串。

我想下一步要做什麼是構造節點的單元陣列,並定義基於此陣列的網絡類:

function Architecture = Network(NodeArray) 

ANN.Layers  = []; % Number of layers in architecture 
ANN.LayerWidths = []; % Vector of length ANN.Layers containing width of each layer 
ANN.NodeArray = []; % Original input is cell array with layers in ascending order (input at top, output at bottom) with nodes in each row. 
ANN.InputSizes = []; 

% Find number of layers 
ANN.Layers = length(NodeArray(:,1)); 

% Find width of each layer 
Widths = zeros(ANN.Layers,1); 
for i = 1:length(Widths) 
    Widths(i) = length(NodeArray(:,i)); 
end 
ANN.LayerWidths = Widths; 

% Pass NodeArray to Network class 
ANN.NodeArray = NodeArray; 

% Construct cell of input sizes 
InputSizes = []; 
for i = 1:ANN.Layers 
    for j = 1:Widths(i) 
     InputSizes(i,j) = NodeArray{i,j}.Inputs; 
    end 
end 

ANN.InputSizes = InputSizes; 



Architecture = class(ANN, 'Network'); 

屬性ANN.InputSizes嘗試提取從Node對象的屬性,但我的代碼不允許我這樣做。我該如何修改這個問題,或者你是否一併推薦了一個不同的體系結構來解決這個問題?目前我的課程NodeNetwork包含在兩個獨立的目錄中,但我有一種感覺,我還沒有看到其他的東西。作爲參考,我在OOP方面絕對沒有任何經驗,從我所收集到的看來,Matlab並不是實現這些結構的最佳環境。目前,雖然我沒有足夠的經驗來用另一種語言來實現這種類型的框架。

+0

使用'classdef'格式來定義類可能更容易。 – Suever

+0

@Suever我曾嘗試使用保存在「@ Network」目錄中的'classdef'格式來定義'Node2'類,但'Network'定義無法識別它。這個問題的一部分是我如何定義我的類,但其中的一部分也可能是我如何鏈接我的目錄。 – Mnifldz

+0

@Folder必須與類具有相同的名稱,所以它需要是「@ Node2」。但是用'classdef'定義,根本不需要'@ Folder'。 – Suever

回答

4

您的InputSizes不是一個單元格。您將它初始化爲一個double數組([]),然後按照原樣填充它。如果你想將它定義爲一個單元,你應該這樣做

InputSizes = cell(); 
for i = 1:ANN.Layers 
    for j = 1:Widths(i) 
     InputSizes{i,j} = NodeArray{i,j}.Inputs; 
    end 
end 

所有這一切,你應該考慮使用一個classdef文件,因爲它更簡單的定義你的類。

Node.m

classdef Node < handle 

    properties 
     Inputs 
     Weights 
     Activation 
    end 

    methods 
     function obj = Node(inputs, weights, activation) 
      obj.Inputs = inputs; 
      obj.Weights = weights; 
      obj.Activation = activation; 
     end 
    end 
end 

Network.m

classdef Network < handle 
    properties 
     NodeArray 
    end 

    properties (Dependent) 
     Layers 
     LayerWidths 
     InputSizes   
    end 

    methods 
     function obj = Network(nodes) 
      obj.NodeArray = nodes; 
     end 

     function result = get.Layers(obj) 
      result = size(obj.NodeArray, 1); 
     end 

     function result = get.LayerWidths(obj) 
      result = size(obj.NodeArray, 2); 
     end 

     function result = get.InputSizes(obj) 
      result = arrayfun(@(x)x.Inputs, obj.NodeArray, 'uniformoutput', 0); 
     end 
    end 
end 

就提示有更好的佈局,這是受個人開發者的意見。

+0

謝謝你的回答。我試圖現在實現這個,但是Matlab沒有識別'get.InputSizes'的函數句柄。具體來說,在'arrayfun(@(x).Inputs,...'中,給我一個關於調用輸入的錯誤。你有推薦嗎? – Mnifldz

+0

@Mnifldz你得到的錯誤是什麼? – Suever

+0

它看到'@(x).Inputs'中的'.'是一個錯誤,具體而言,它給了我「意想不到的MATLAB操作符」。 – Mnifldz

相關問題