Neural network 为什么feedforwardnet(int32(8))会引发错误,而feedforwardnet(double(8))不会?

Neural network 为什么feedforwardnet(int32(8))会引发错误,而feedforwardnet(double(8))不会?,neural-network,matlab,Neural Network,Matlab,在MATLAB中,前馈网络8创建一个前馈网络,其中一个隐藏层包含8个隐藏神经元。MATLAB将数字数据存储为双精度浮点双精度。因此,feedforwardnet8相当于feedforwardnetdouble8 但是,前馈328将引发以下错误: Undefined function or variable 'ind'. Error in network/subsasgn>setLayerSize (line 1170) err = sprintf('"layers{%g}.size"

在MATLAB中,前馈网络8创建一个前馈网络,其中一个隐藏层包含8个隐藏神经元。MATLAB将数字数据存储为双精度浮点双精度。因此,feedforwardnet8相当于feedforwardnetdouble8

但是,前馈328将引发以下错误:

Undefined function or variable 'ind'.

Error in network/subsasgn>setLayerSize (line 1170)
  err = sprintf('"layers{%g}.size" must be a positive integer.',ind);

Error in network/subsasgn>network_subsasgn (line 180)
        if isempty(err), [net,err] = setLayerSize(net,i,newSize); end

Error in network/subsasgn (line 13)
net = network_subsasgn(net,subscripts,v,netname);

Error in feedforwardnet>create_network (line 116)
      net.layers{i}.size = param.hiddenSizes(i);

Error in feedforwardnet (line 69)
    net = create_network(param);
为什么feedforwardnet不接受int32作为参数?等价地,为什么在*network/subsasgn.m中,当给定int328作为参数时,第1169行的isposit不返回true


使用Matlab2011a、2012a和2012b对代码进行了测试

不确定您拥有的工具箱的版本,但isposintv的1.7版测试参数如下:

[...]
if ~isa(v,'double') | any(size(v) ~= [1 1]) | ...
  ~isreal(v) | v<0 | round(v) ~= v
[...]
这意味着对于不是double或double的子类的所有内容,它都将返回false


至于未定义的函数或变量“ind”。消息,我猜这是因为代码中的一个bug变量ind没有作为参数在函数中的任何位置创建/分配/传递。

不确定您使用的是哪个版本的工具箱,但isposintv的1.7版测试参数如下:

[...]
if ~isa(v,'double') | any(size(v) ~= [1 1]) | ...
  ~isreal(v) | v<0 | round(v) ~= v
[...]
这意味着对于不是double或double的子类的所有内容,它都将返回false


至于未定义的函数或变量“ind”。消息,我猜这是因为代码中的一个bug变量ind没有作为参数在函数中的任何位置创建/分配/传递。

编辑风险自担,没有在第9行对isposint.m进行彻底测试:

%如果~isav,'double'| anysizev~=[11]|。。。 如果~isnumericv | anysizev~=[11]|。。。 两者都经历了:

a=前馈网络8; b=前馈网络328; 尺寸变化不大:

>>谁 名称大小字节类属性 1x1 31224网络 b 1x1 30968网络
编辑风险自担,第9行的isposint.m未经彻底测试:

%如果~isav,'double'| anysizev~=[11]|。。。 如果~isnumericv | anysizev~=[11]|。。。 两者都经历了:

a=前馈网络8; b=前馈网络328; 尺寸变化不大:

>>谁 名称大小字节类属性 1x1 31224网络 b 1x1 30968网络
谢谢,但是如果参数是int32或int8/int64,返回false有什么意义呢?我觉得拒绝int32说函数需要一个整数是很奇怪的。我必须承认,我不知道作者决定使用isav,“double”而不是例如isnumericv的原因。可能是某些库使用双精度浮点进行了快速执行的调优,而任何其他数值类型都需要转换为双精度浮点,这需要时间。或者,作者可能想避免追逐由混合整数/浮点算法引起的潜在错误的痛苦,并强制执行一个独特的类型来处理。或者这就是作者用来测试这类值的Matlab习惯用法。@FranckDernoncourt这是因为每当你用一种类型(而不是double)进行算术运算时,Matlab都会将结果转换回该类型。例如:uint160.6*2=2,类ANS将是uint16。所以isPosit函数正在测试以确保它是double类的整数,可能是因为要对它进行一些运算,但它仍然需要是整数。好的,在我看来,将int8、int16、int32、int64、uint8、uint16、uint32、uint64转换为double是个好主意,虽然这可能会给大数带来麻烦,但这可能是它们不强制转换的另一个原因。谢谢,但是如果参数是int32或int8/int64,返回false有什么意义?我觉得拒绝int32说函数需要一个整数是很奇怪的。我必须承认,我不知道作者决定使用isav,“double”而不是例如isnumericv的原因。可能是某些库使用双精度浮点进行了快速执行的调优,而任何其他数值类型都需要转换为双精度浮点,这需要时间。或者,作者可能想避免追逐由混合整数/浮点算法引起的潜在错误的痛苦,并强制执行一个独特的类型来处理。或者这就是作者用来测试这类值的Matlab习惯用法。@FranckDernoncourt这是因为每当你用一种类型(而不是double)进行算术运算时,Matlab都会将结果转换回该类型。例如:uint160.6*2=2,类ANS将是uint16。所以isPosit函数正在测试以确保它是double类的整数,可能是因为要对它进行一些运算,但它仍然需要是整数。好的,在我看来,将int8、int16、int32、int64、uint8、uint16、uint32、uint64转换为double是个好主意,虽然这可能会给很多人带来麻烦,但这可能是他们不投的另一个原因。很有趣,谢谢!伊格
uess大小的变化是由于int32是4字节,而double是8字节。是的,这里的要点是,您实际上在内存和性能方面都没有获得太多。除非你真的被迫使用int,否则我会选择double。将int转换为double没有问题,因为你可以使用intmax'uint64'和realmax'double'进行检查,但是你会受到轻微的性能损失。好吧,使用doubleintmax'uint64'会降低精度。但我同意这不是什么大事,除非你的人际网络是人脑-对,被愚弄开始在2^53处失去精度,而uint64的最大值为2^64-1。很有趣,谢谢!我猜大小的变化是因为int32是4字节,而double是8字节。是的,这里的要点是你实际上在内存和性能方面都没有获得太多。除非你真的被迫使用int,否则我会选择double。将int转换为double没有问题,因为你可以使用intmax'uint64'和realmax'double'进行检查,但是你会受到轻微的性能损失。好吧,使用doubleintmax'uint64'会降低精度。但我同意这不是什么大事,除非你的人际网络是人脑-对,被愚弄开始在2^53处失去精度,而uint64的最大值为2^64-1。