Rad*_*duS 5 neural-network deep-learning keras
有人可以帮我理解这个问题.
我必须训练一个神经网络,它应该输出200个相互独立的类别,这些类别中的每一个都是从0到1的百分比.对我而言,这似乎是一个binary_crossentropy问题,但我在互联网上看到的每个例子都使用binary_crossentropy单个输出.由于我的输出应该是200,如果我申请binary_crossentropy,这是正确的吗?
这是我的想法,是一个正确的方法还是我应该改变它?
inputs = Input(shape=(input_shape,))
hidden = Dense(2048, activation='relu')(inputs)
hidden = Dense(2048, activation='relu')(hidden)
output = Dense(200, name='output_cat', activation='sigmoid')(hidden)
model = Model(inputs=inputs, outputs=[output])
loss_map = {'output_cat': 'binary_crossentropy'}
model.compile(loss=loss_map, optimizer="sgd", metrics=['mae', 'accuracy'])
Run Code Online (Sandbox Code Playgroud)
要使用Keras优化多个独立的二进制分类问题(而不是可以使用categorical_crossentropy的多类别问题),您可以执行以下操作(此处我以2个独立的二进制输出为例,但您可以根据需要进行扩展) :
inputs = Input(shape=(input_shape,))
hidden = Dense(2048, activation='relu')(inputs)
hidden = Dense(2048, activation='relu')(hidden)
output = Dense(units = 2, activation='sigmoid')(hidden )
Run Code Online (Sandbox Code Playgroud)
在这里,您使用Keras的Lambda图层分割输出:
output_1 = Lambda(lambda x: x[...,:1])(output)
output_2 = Lambda(lambda x: x[...,1:])(output)
adad = optimizers.Adadelta()
Run Code Online (Sandbox Code Playgroud)
您的模型输出将成为不同独立输出的列表
model = Model(inputs, [output_1, output_2])
Run Code Online (Sandbox Code Playgroud)
您可以在列表中为每个输出使用一个损失函数编译模型.(事实上,如果你只提供一种损失功能,我相信它会独立地应用于所有输出)
model.compile(optimizer=adad, loss=['binary_crossentropy','binary_crossentropy'])
Run Code Online (Sandbox Code Playgroud)
我知道这是一个老问题,但我相信接受的答案是不正确的,最高票的答案是可行的但不是最佳的。原发帖人的方法是解决这个问题的正确方法。他的输出是从 0 到 1 的 200 个独立概率,所以他的输出层应该是一个具有 200 个神经元和一个 sigmoid 激活层的密集层。这不是 categorical_crossentropy 问题,因为它不是 200 个相互排斥的类别。此外,当使用单个密集层时,没有理由使用 lambda 层分割输出。原海报的方法是正确的。这是使用 Keras 界面执行此操作的另一种方法。
model = Sequential()
model.add(Dense(2048, input_dim=n_input, activation='relu'))
model.add(Dense(2048, input_dim=n_input, activation='relu'))
model.add(Dense(200, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
bla*_*tor -2
对于多类别分类问题,您应该使用categorical_crossentropy而不是binary_crossentropy。这样,当您的模型对输入进行分类时,它将给出所有 200 个类别之间的概率离散度。接收最高概率的类别将是该特定输入的输出。
当你打电话的时候你可以看到这个model.predict()。例如,如果您仅对一个输入调用此函数并打印结果,您将看到 200 个百分比的结果(总和为 1)。我们希望这 200 个百分比中的一个比其他百分比高得多,这表明该模型认为很有可能这是该特定输入的正确输出(类别)。
该视频可能有助于澄清预测片段。打印预测大约从 3:17 开始,但要获得完整的上下文,您需要从头开始。
| 归档时间: |
|
| 查看次数: |
3064 次 |
| 最近记录: |