假设我想使用神经网络和 Keras 解决多标签问题。
输出通常采用 y=[0, 1, 0, 1, 0, 0] 的形式,并且可以轻松地使用二进制交叉熵和 sigmoid 来训练网络作为输出(例如,请参阅下面的代码)。
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(6, activation='relu')#Add 1 hidden layer
#with 6 neurons, with relu activation
model.add(Dense(6, activation='sigmoid'))#Here we specify that we have 6 outputs
#and we want outputs to be in [0,1]
model.compile(optimizer='Adam', loss='binary_crossentropy')
model.fit(xtrain, ytrain, batch_size=128)
当我在最后一行执行 fit 时,实现方面到底发生了什么?
网络是否更新多次次?计算 6 个输出中每一个输出的误差后,将其传播回去以升级权重?
它是否单独计算每个输出的误差,然后对网络进行一次整体更新?
编辑:Daniel Möller 回答后更新了问题
model.fit(xtrain, ytrain, batch_size=1)
如果批量大小为 1,我的问题可能会更清楚。
在每次迭代中,我们从训练集中选择 1 个示例并进行前馈。然后,我们计算每个输出的误差。在这种情况下,问题如下:
对于不在输出之间共享的权重(从隐藏层到输出的权重),它们是根据模型产生的误差进行更新的,该误差计算为所有输出上的误差之和,或者仅计算为 1具体输出?
模型权重是根据误差总和更新一次,还是模型根据所有输出上的个别误差更新多次?
最佳答案
对于所有效果,都应该被视为一个巨大的矩阵运算。
每批处理完毕后,它将更新网络。所以,既不是 1,也不是 2。
它:3 - 它作为矩阵运算一次性计算整个批处理的误差,然后对所有权重矩阵进行整体更新。但这将是多次更新,因为您将有多个大小为 128 的批处理。
Y 通常的形式是:
[
[1,0,0,1,0,0],
[1,0,0,1,0,0],
[0,0,0,1,1,0],
[1,0,1,1,0,0]
]
一批输出。
<小时/>无论它在内部执行循环还是执行矩阵计算所需的任何操作,它对我们来说都是不可见且无法访问的。
关于machine-learning - Keras 如何更新多标签学习中的权重(实现方面),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49070021/