python - GEKKO ANN 示例中的偏置节点

标签 python neural-network gekko

在动态优化类(class)网页(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 之间,特别是如果输入为零则等于输出为零。通过此转换,您已经缩放了变量,以便偏差项为零,并且您尝试使用激活函数对从零开始的变化进行建模。此方法用于动态建模,将方程转换为“偏差变量”形式,其中标称或稳态值设置为零。这些方程跟踪与标称零起点的偏差。

以下是关于此主题的一些其他建议 discussion 1discussion 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()

关于python - GEKKO ANN 示例中的偏置节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55736423/

相关文章:

python - 在 Google Colab 中运行 2 个 python 脚本

python - 使用QSignalMapper进行QGraphicsItem之间的通信

machine-learning - 使用神经网络进行音高检测

image-processing - 让神经网络输出高斯分布而不是单个值?

Python xml.dom.minidom 统一码

python - 使用Python的decimal.Decimal时删除无关的小数位

machine-learning - 在 CNN 中实现多 channel 数据的后向卷积

Python GEKKO ODE 意外结果

python - GEKKO MPC 示例中的默认目标函数

python - Gekko 优化以获得不同问题的评分