输入结构和神经网络预测多个独立类的可能性

时间:2017-11-21 02:02:50

标签: tensorflow neural-network keras conv-neural-network feature-selection

对于我要解决的问题,以下情况属实:

  • 我试图预测属于12个类别的输入的概率。
  • 输入可能属于12个类别中的任何一个,这意味着所有12个输出(概率)都会很低。
  • 输出概率应该是独立的。也就是说,如果第1类的可能性为95%,则第2类的可能性可能> 5%等。换句话说,我不需要总概率加起来为1,因为某些类是相似的。要明确,在实践中,每个输入只能属于1个类。我所指的是概率。

我目前接近这个的方式如下:

  • 一个热门编码12个输出类
  • 损失函数:分类交叉熵
  • 最后一层:12个神经元和S形激活致密

问题

  1. 有一个模型来预测这12个类中每个类的成员资格是否有意义?或者,拥有独立模型更有意义,每个模型都预测一个类的概率?什么更好?
  2. 最好有13个班而不是12个班级,其中新班级表示输入不属于任何班级?
  3. 代码

    test_fraction = 0.2
    dropout_prob = 0.4
    activation_function = 'relu'
    loss_function = 'categorical_crossentropy'
    opt = Adam()
    verbose_level = 1
    num_targets = 12
    batch_size = 32
    epochs = 75
    
    X = np.array(keypoints)
    labels = np.array(labels)
    labels = np_utils.to_categorical(labels)
    X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=test_fraction, random_state=42)
    
    # model training
    model = Sequential()
    model.add(Dense(32, input_shape=(180,)))
    model.add(Dense(64, activation=activation_function))
    model.add(Dense(128, activation=activation_function))
    model.add(Dense(num_targets, activation='sigmoid'))
    model.summary()
    model.compile(loss=loss_function, optimizer=opt, metrics=['accuracy'])
    history = model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, verbose=verbose_level,
                        validation_data=(X_test, y_test))
    model.save('../models/model.h5')
    

2 个答案:

答案 0 :(得分:0)

这称为多标签分类,可以通过在模型中进行两处更改来轻松实现:

  • 在输出处使用sigmoid激活
  • 使用可以处理多标签分类的binary_crossentropy loss。

然后训练你的模型。

答案 1 :(得分:0)

开始正确

model.add(Dense(num_targets, activation='sigmoid'))

model.add(Dense(num_targets, activation='softmax'))

sigmoid activation用于二进制分类而非多类分类

要回答你的问题我会说

  1. 你不需要独立的模型(每个类别一个模型),一个模型对所有人都很好。每个类的一个模型可能从硬件资源的角度来看无利可图。
  2. 关于你的第二个问题,要有13个而不是12个课程,这取决于你正在处理的问题。如果你有这个第13课的数据,你可以训练你的模型,如果这是你想要做的。