如何解决此代码中与维度相关的错误?

时间:2013-09-26 08:01:16

标签: modelica dymola

我在Modelica编写了一个代码,用于训练我的硕士论文的前馈双层神经网络。代码接收六个元素(u [nin])的向量,并提供两个元素y [nout]的输出向量。当我在dymola中翻译代码时,我收到一个错误,指出特定代码行中包含的部分的维度必须相等。删除此特定行后,代码将成功翻译。我真的花了太多精力试图解决这个错误,但徒劳无功!任何关于这个问题的帮助都将非常感激。

代码可以在下面找到:(请注意,导致生成转换错误的行在代码中用//标记)。

model NN_block
Modelica.Blocks.Interfaces.RealInput
        u[nin] "Connector of Real input signals"
annotation (Placement(transformation(extent={{-140,-20},{-100,20}},
    rotation=0)));
Modelica.Blocks.Interfaces.RealOutput y[nout]
annotation (Placement(transformation(extent={{100,-10},{120,10}})));
parameter Integer nin2=1;
parameter Integer nin=6;
parameter Integer nout=2;
Real wji[10,6];
Real delta_wij[6,10];
Real bj[10,1];
Real delta_bjT[1,10];
Real wkj[2,10];
Real delta_wjk[10,2];
Real bk[2,1];
Real delta_bkT[1,2];
Real E;
Real ek[1,2];
Real yj[10,1];

Modelica.Blocks.Interfaces.BooleanOutput Input_trigger
                                               annotation (Placement(
    transformation(extent={{100,-46},{120,-26}}), iconTransformation(extent=
       {{100,-46},{120,-26}})));
Modelica.Blocks.Interfaces.RealInput eTau1 annotation (Placement(
    transformation(extent={{-182,36},{-142,76}}), iconTransformation(
    extent={{10,-10},{-10,10}},
    rotation=90,
    origin={-44,90})));
Modelica.Blocks.Interfaces.RealInput eTau2 annotation (Placement(
    transformation(extent={{-148,46},{-108,86}}), iconTransformation(
    extent={{10,-10},{-10,10}},
    rotation=90,
    origin={50,90})));
annotation (Placement(transformation(extent={{-10,-10},{10,10}},
    rotation=-90,
    origin={-50,90}), iconTransformation(
    extent={{-10,-10},{10,10}},
    rotation=-90,
    origin={0,90})));
algorithm 
E:=1;
wji:=0.5*ones(10,6);
bj:=0.25*ones(10,1);
wkj:=0.75*ones(2,10);
bk:=0.6*ones(2,1);
delta_wij:=zeros(6,10);
delta_bjT:=zeros(1,10);
delta_wjk:=zeros(10,2);
delta_bkT:=zeros(1,2);

while E>0.01 loop
Input_trigger:=true;
y:=wkj*NeuralNetwork.Utilities.LogSig(wji*u+bj[:,1])+bk[:,1];
yj[:,1]:=NeuralNetwork.Utilities.LogSig(wji*u+bj[:,1]);
ek:=[eTau1,eTau2];
E:=0.5*(eTau1^2+eTau2^2);
if E>0.01 then
// delta_wij:=0.01*u*transpose(yj)*(ones(10,1)-yj)*ek*wkj+0.9*delta_wij;
  delta_bjT:=0.01*transpose(yj)*(ones(10,1)-yj)*ek*wkj + 0.9*delta_bjT;
  delta_wjk:=0.01*yj*ek + 0.9*delta_wjk;
  delta_bkT:=0.01*ek + 0.9*delta_bkT;
  wji:=wji+transpose(delta_wij);
  bj:=bj+transpose(delta_bjT);
  wkj:=wkj+transpose(delta_wjk);
  bk:=bk+transpose(delta_bkT);
else
  break;
end if;
end while;

annotation (Placement(transformation(extent={{-140,44},{-100,84}})),
          uses(Modelica(version="3.2")), Icon(graphics={Rectangle(
      extent={{-100,-100},{100,80}},
      lineColor={0,0,255},
      lineThickness=1), Text(
      extent={{-68,20},{78,-16}},
      lineColor={0,0,255},
      lineThickness=1,
      textString="Two-LayerNeural Network")}),
Diagram(graphics));
end NN_block; 

3 个答案:

答案 0 :(得分:1)

使用LogSig删除行后,我可能会让OpenModelica为您生成错误消息: [a.mo:59:3-59:71] Error: Incompatible argument types to operation matrix multiplication, left type: Real[6], right type: Real[1, 10]

[a.mo:59:3-59:71] Error: Cannot resolve type of expression 0.01 * u * transpose(yj). The operands have types Real[6], Real[1, 10] in component .

uyj'维度61,10

答案 1 :(得分:0)

查看代码,似乎有关等式右边的矩阵大小不匹配。

尝试将u定义为大小为6x1的2D矩阵。

答案 2 :(得分:0)

您是否在命令行中测试了此行?这可以通过在工作空间中创建模型中使用的变量,然后在命令行中运行注释掉的行来检查大小调整是否正确来完成。您可以在Dymola命令行中执行此操作,但我对OpenModelica不熟悉,无法判断您是否可以在那里执行相同的检查。