在动态优化课程网页(https://apmonitor.com/do/index.php/Main/TCLabB)的TCLab B的ANN示例中,是否在脚本中指定了每个图层的偏置节点?请让我知道哪些线代表偏置节点。如果没有必要,请说明原因。谢谢。
# -------------------------------------
# build neural network
# -------------------------------------
nin = 2 # inputs
n1 = 2 # hidden layer 1 (linear)
n2 = 2 # hidden layer 2 (nonlinear)
n3 = 2 # hidden layer 3 (linear)
nout = 2 # outputs
# Initialize gekko models
train = GEKKO()
dyn = GEKKO()
model = [train,dyn]
for m in model:
# use APOPT solver
m.options.SOLVER = 1
# input(s)
m.inpt = [m.Param() for i in range(nin)]
# layer 1 (linear)
m.w1 = m.Array(m.FV, (nout,nin,n1))
m.l1 = [[m.Intermediate(sum([m.w1[k,j,i]*m.inpt[j] \
for j in range(nin)])) for i in range(n1)] \
for k in range(nout)]
# layer 2 (tanh)
m.w2 = m.Array(m.FV, (nout,n1,n2))
m.l2 = [[m.Intermediate(sum([m.tanh(m.w2[k,j,i]*m.l1[k][j]) \
for j in range(n1)])) for i in range(n2)] \
for k in range(nout)]
# layer 3 (linear)
m.w3 = m.Array(m.FV, (nout,n2,n3))
m.l3 = [[m.Intermediate(sum([m.w3[k,j,i]*m.l2[k][j] \
for j in range(n2)])) for i in range(n3)] \
for k in range(nout)]
# outputs
m.outpt = [m.CV() for i in range(nout)]
m.Equations([m.outpt[k]==sum([m.l3[k][i] for i in range(n3)]) \
for k in range(nout)])
# flatten matrices
m.w1 = m.w1.flatten()
m.w2 = m.w2.flatten()
m.w3 = m.w3.flatten()
答案 0 :(得分:1)
以下是您可以考虑添加偏差节点的一些原因:
您可能不想添加偏差节点的某些原因:
它还可以帮助将输入和输出缩放到0到1之间,特别是如果输入的零等于输出的零。通过这种转换,您已经缩放了变量,以使偏差项为零,并且您正在尝试使用激活函数对从零开始的变化进行建模。此方法在动态建模中使用,您可以将方程式转换为“偏差变量”形式,将名义或稳态值设置为零。这些方程式跟踪与标称零起点的偏差。
以下是有关此主题的一些其他建议,分别是discussion 1和discussion 2。
您可以向Gekko模型添加偏差项,例如example 7 of the 18 Gekko tutorials中所示。偏差项为w2b。同样,您也可以为提到的问题添加它,尽管您可能只想在第一(输入)层尝试使用w1a和w1b。
for m in model:
# use APOPT solver
m.options.SOLVER = 1
# input(s)
m.inpt = [m.Param() for i in range(nin)]
# layer 1 (linear)
m.w1a = m.Array(m.FV, (nout,nin,n1))
m.w1b = m.Array(m.FV, (nout,nin,n1))
m.l1 = [[m.Intermediate(sum([m.w1a[k,j,i]*m.inpt[j] + m.w1b[k,j,i] \
for j in range(nin)])) for i in range(n1)] \
for k in range(nout)]
# layer 2 (tanh)
m.w2a = m.Array(m.FV, (nout,n1,n2))
m.w2b = m.Array(m.FV, (nout,n1,n2))
m.l2 = [[m.Intermediate(sum([m.tanh(m.w2a[k,j,i]*m.l1[k][j]) + m.w2b[k,j,i] \
for j in range(n1)])) for i in range(n2)] \
for k in range(nout)]
# layer 3 (linear)
m.w3a = m.Array(m.FV, (nout,n2,n3))
m.w3b = m.Array(m.FV, (nout,n2,n3))
m.l3 = [[m.Intermediate(sum([m.w3a[k,j,i]*m.l2[k][j] + m.w3b[k,j,i] \
for j in range(n2)])) for i in range(n3)] \
for k in range(nout)]
# outputs
m.outpt = [m.CV() for i in range(nout)]
m.Equations([m.outpt[k]==sum([m.l3[k][i] for i in range(n3)]) \
for k in range(nout)])
# flatten matrices
m.w1a = m.w1.flatten()
m.w2a = m.w2.flatten()
m.w3a = m.w3.flatten()
m.w1b = m.w1.flatten()
m.w2b = m.w2.flatten()
m.w3b = m.w3.flatten()