神经网络分类:他们是否总是必须为每个训练数据分配一个标签
Neural network categorization: Do they always have to have one label per training data
在我见过的所有使用神经网络进行分类的例子中,它们都有以一个类别作为主要类别或每个输入数据的标签的训练数据。
你能提供具有多个标签的训练数据吗?例如:带有 "cat" 和 "mouse" 的图片。
我理解(可能是错误的)如果你在输出层使用 softmax for probability/prediction,它倾向于尝试和 select 一个(最大化辨别力)。我猜这会 hurt/prevent 学习和预测带有输入数据的多个标签。
是否有approach/architecture的神经网络在训练数据中有多个标签并进行了多个输出预测?或者已经是这样了,我错过了一些重要的理解。请说明。
大多数示例每个输入有一个 class,所以您没有遗漏任何内容。然而,可以进行多 class class 化,有时在文献中称为联合 class 化。
你建议使用 softmax 的天真实现会很困难,因为最后一层的输出必须加起来为 1,所以 class 越多,你就越难弄清楚网络是什么正想说。
您可以更改体系结构来实现您想要的。对于每个 class,你可以有一个二进制 softmax classifier,它从倒数第二层 分支出来,或者你可以使用一个 sigmoid,它不必加起来等于一个(甚至尽管每个神经元的输出都在 0 和 1 之间)。请注意,使用 sigmoid 可能会使训练更加困难。
或者,您可以为每个 class 训练多个网络,然后在最后将它们组合成一个 class 化系统。这取决于您设想的任务的复杂程度。
Is there any approach/architecture of NN where there are multiple labels in training data and multiple outputs predictions are made ?
答案是肯定的。为了简要回答您的问题,我在 Keras 的上下文中给出了一个示例,这是一个 high-level 神经网络库。
让我们考虑以下模型。我们想预测一条新闻标题在 Twitter 上会收到多少转推和点赞。模型的主要输入将是标题本身,作为一个单词序列,但为了让事情更有趣,我们的模型还将有一个辅助输入,接收额外的数据,例如标题发布的时间等。
from keras.layers import Input, Embedding, LSTM, Dense, merge
from keras.models import Model
# headline input: meant to receive sequences of 100 integers, between 1 and 10000.
# note that we can name any layer by passing it a "name" argument.
main_input = Input(shape=(100,), dtype='int32', name='main_input')
# this embedding layer will encode the input sequence
# into a sequence of dense 512-dimensional vectors.
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)
# a LSTM will transform the vector sequence into a single vector,
# containing information about the entire sequence
lstm_out = LSTM(32)(x)
auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)
auxiliary_input = Input(shape=(5,), name='aux_input')
x = merge([lstm_out, auxiliary_input], mode='concat')
# we stack a deep fully-connected network on top
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
# and finally we add the main logistic regression layer
main_output = Dense(1, activation='sigmoid', name='main_output')(x)
这定义了一个具有两个输入和两个输出的模型:
model = Model(input=[main_input, auxiliary_input], output=[main_output, auxiliary_output])
现在,让我们按如下方式编译和训练模型:
model.compile(optimizer='rmsprop',
loss={'main_output': 'binary_crossentropy', 'aux_output': 'binary_crossentropy'},
loss_weights={'main_output': 1., 'aux_output': 0.2})
# and trained it via:
model.fit({'main_input': headline_data, 'aux_input': additional_data},
{'main_output': labels, 'aux_output': labels},
nb_epoch=50, batch_size=32)
在我见过的所有使用神经网络进行分类的例子中,它们都有以一个类别作为主要类别或每个输入数据的标签的训练数据。
你能提供具有多个标签的训练数据吗?例如:带有 "cat" 和 "mouse" 的图片。
我理解(可能是错误的)如果你在输出层使用 softmax for probability/prediction,它倾向于尝试和 select 一个(最大化辨别力)。我猜这会 hurt/prevent 学习和预测带有输入数据的多个标签。
是否有approach/architecture的神经网络在训练数据中有多个标签并进行了多个输出预测?或者已经是这样了,我错过了一些重要的理解。请说明。
大多数示例每个输入有一个 class,所以您没有遗漏任何内容。然而,可以进行多 class class 化,有时在文献中称为联合 class 化。
你建议使用 softmax 的天真实现会很困难,因为最后一层的输出必须加起来为 1,所以 class 越多,你就越难弄清楚网络是什么正想说。
您可以更改体系结构来实现您想要的。对于每个 class,你可以有一个二进制 softmax classifier,它从倒数第二层 分支出来,或者你可以使用一个 sigmoid,它不必加起来等于一个(甚至尽管每个神经元的输出都在 0 和 1 之间)。请注意,使用 sigmoid 可能会使训练更加困难。
或者,您可以为每个 class 训练多个网络,然后在最后将它们组合成一个 class 化系统。这取决于您设想的任务的复杂程度。
Is there any approach/architecture of NN where there are multiple labels in training data and multiple outputs predictions are made ?
答案是肯定的。为了简要回答您的问题,我在 Keras 的上下文中给出了一个示例,这是一个 high-level 神经网络库。
让我们考虑以下模型。我们想预测一条新闻标题在 Twitter 上会收到多少转推和点赞。模型的主要输入将是标题本身,作为一个单词序列,但为了让事情更有趣,我们的模型还将有一个辅助输入,接收额外的数据,例如标题发布的时间等。
from keras.layers import Input, Embedding, LSTM, Dense, merge
from keras.models import Model
# headline input: meant to receive sequences of 100 integers, between 1 and 10000.
# note that we can name any layer by passing it a "name" argument.
main_input = Input(shape=(100,), dtype='int32', name='main_input')
# this embedding layer will encode the input sequence
# into a sequence of dense 512-dimensional vectors.
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)
# a LSTM will transform the vector sequence into a single vector,
# containing information about the entire sequence
lstm_out = LSTM(32)(x)
auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)
auxiliary_input = Input(shape=(5,), name='aux_input')
x = merge([lstm_out, auxiliary_input], mode='concat')
# we stack a deep fully-connected network on top
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
# and finally we add the main logistic regression layer
main_output = Dense(1, activation='sigmoid', name='main_output')(x)
这定义了一个具有两个输入和两个输出的模型:
model = Model(input=[main_input, auxiliary_input], output=[main_output, auxiliary_output])
现在,让我们按如下方式编译和训练模型:
model.compile(optimizer='rmsprop',
loss={'main_output': 'binary_crossentropy', 'aux_output': 'binary_crossentropy'},
loss_weights={'main_output': 1., 'aux_output': 0.2})
# and trained it via:
model.fit({'main_input': headline_data, 'aux_input': additional_data},
{'main_output': labels, 'aux_output': labels},
nb_epoch=50, batch_size=32)