2016-09-15 2 views
0

Я пытаюсь построить структуру класса для нейронной сети (ИНС) в Matlab путем определения класса 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'); 

Где здесь вход является целым числом (ожидаемое количество входов), Weights - это вектор длины 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 объекта, но мой код не позволяет мне это делать. Как мне изменить эту проблему, или вы рекомендуете другую архитектуру для решения этой проблемы? В настоящее время мои классы Node и Network содержатся в двух отдельных каталогах, но я чувствую, что есть что-то еще, чего я не вижу. Для справки, у меня нет абсолютно никакого опыта в ООП, и из того, что я собрал, кажется, что Matlab - не лучшая среда для реализации этих структур. На данный момент, хотя у меня недостаточно опыта для реализации этого типа фреймворков на другом языке.

+0

Может быть проще использовать формат classdef для определения ваших классов. – Suever

+0

@Suever Я попытался определить класс 'Node2' с форматом' classdef', сохраненным в каталоге '@ Network', но определение' 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

Смежные вопросы