我是MATLAB面向对象编程的新手,我在初始化正在构建的类时遇到了问题。我正在从头开始构建一个神经网络,我正在使用下面一个名为network的类,它带有一个名为layers的初始化函数:
classdef network
properties
sizes
biases
weights
nLayers
end
methods
function [ ] = layers(self)
self.nLayers = length(self.sizes);
self.biases{1} = zeros(self.sizes(1));
for i = 2:self.nLayers
self.biases{i} = zeros(self.sizes(i), 1);
for j = 1:self.sizes(i)
bias(j, 1) = normRand(0);
end
self.biases{i} = bias(1:j, 1);
end
for i = 2:self.nLayers
for j = 1:self.sizes(i)
for k = 1:self.sizes(i-1)
weight(j, k) = normRand(0);
end
end
self.weights{i} = weight(1:j, 1:k);
end
end
因此,在创建类网络的变量网并设置大小如下之后:
>> net = network; net.sizes = [2 3 2 4]
net =
network with properties:
sizes: [2 3 2 4]
biases: []
weights: []
nLayers: []
我运行了图层功能,但没有更新。
>> net.layers
>> net
net =
network with properties:
sizes: [2 3 2 4]
biases: []
weights: []
nLayers: []
令我困惑的是,如果我在图层功能的末尾设置了一个断点,我会在调试模式下得到这些结果:
>> net.layers
29 end
K>> self
self =
network with properties:
sizes: [2 3 2 4]
biases: {[2×2 double] [3×1 double] [2×1 double] [4×1 double]}
weights: {[] [3×2 double] [2×3 double] [4×2 double]}
nLayers: 4
这是我正在寻找的结果。知道我做错了什么吗?另外,有没有人知道将输入传递给类的方法,以便我可以创建我的网络,如: net =网络(大小) ?
另外,我知道python对神经网络来说要好得多,甚至java也是更好的选择。我这样做是为了学习练习,并不是对任何人对哪种语言最适合的观点感兴趣。
由于
答案 0 :(得分:1)
您需要从self
方法返回修改后的layers
对象:
function self = layers(self)
...
这是因为默认情况下MATLAB中的类是value classes(即修改对象的方法必须将修改后的对象作为输出参数返回)。或者,您也可以通过将类设为handle class来设计具有类似引用行为的类。可以找到一些有用的值和句柄类示例here,以及何时使用它们的指南。
此外,您可以为类对象创建constructor,它可以使用一组输入来初始化它。例如,它可以这样设计:
function self = network(sizes, biases, weights, nLayers)
if (nargin > 0)
self.sizes = sizes;
end
if (nargin > 1)
self.biases = biases;
end
if (nargin > 2)
self.weights = weights;
end
if (nargin > 3)
self.nLayers = nLayers;
end
end
然后您可以像这样实例化它:
net = network([2 3 2 4]); % Sets sizes to [2 3 2 4] and other properties to []
答案 1 :(得分:1)
Matlab有两种类型 - 值类和句柄类。默认情况下,Matlab的类是值类,这意味着Matlab在对象的副本上操作,而不是对它的引用。在该示例中,layers
方法正在对象的副本上运行,并且net
对象未按您观察到的更新。
本文详细解释了这些差异: https://www.mathworks.com/help/matlab/matlab_oop/comparing-handle-and-value-classes.html
该问题有两种解决方案:
1)继续使用值类并从layers
函数
function self = layers(self)
然后使用赋值来更新对象。
net = net.layers
2)通过从句柄类派生network
来使用句柄类。
classdef network < handle
layers
函数现在将修改对象的引用。
下面的链接包含有关Matlab中对象修改的更多信息。
https://www.mathworks.com/help/matlab/matlab_oop/matlab-vs-other-oo-languages.html#bslvcv1