如何确定由Keras上的卷积神经网络预测的二进制类?

德克萨斯州

我正在建立一个CNN,以便对Keras进行情感分析。一切工作正常,模型已经过培训,可以投入生产。

但是,当我尝试使用该方法对新的未标记数据进行预测时,model.predict()它仅输出关联的概率。我尝试使用该方法,np.argmax()即使应为1,它始终输出0(在测试集上,我的模型达到了80%的精度)。

这是我的数据预处理代码:

# Pre-processing data
x = df[df.Sentiment != 3].Headlines
y = df[df.Sentiment != 3].Sentiment

# Splitting training, validation, testing dataset
x_train, x_validation_and_test, y_train, y_validation_and_test = train_test_split(x, y, test_size=.3,
                                                                                      random_state=SEED)
x_validation, x_test, y_validation, y_test = train_test_split(x_validation_and_test, y_validation_and_test,
                                                                  test_size=.5, random_state=SEED)

tokenizer = Tokenizer(num_words=NUM_WORDS)
tokenizer.fit_on_texts(x_train)

sequences = tokenizer.texts_to_sequences(x_train)
x_train_seq = pad_sequences(sequences, maxlen=MAXLEN)

sequences_val = tokenizer.texts_to_sequences(x_validation)
x_val_seq = pad_sequences(sequences_val, maxlen=MAXLEN)

sequences_test = tokenizer.texts_to_sequences(x_test)
x_test_seq = pad_sequences(sequences_test, maxlen=MAXLEN)

这是我的模型:

MAXLEN = 25
NUM_WORDS = 5000
VECTOR_DIMENSION = 100

tweet_input = Input(shape=(MAXLEN,), dtype='int32')

tweet_encoder = Embedding(NUM_WORDS, VECTOR_DIMENSION, input_length=MAXLEN)(tweet_input)

# Combinating n-gram to optimize results
bigram_branch = Conv1D(filters=100, kernel_size=2, padding='valid', activation="relu", strides=1)(tweet_encoder)
bigram_branch = GlobalMaxPooling1D()(bigram_branch)
trigram_branch = Conv1D(filters=100, kernel_size=3, padding='valid', activation="relu", strides=1)(tweet_encoder)
trigram_branch = GlobalMaxPooling1D()(trigram_branch)
fourgram_branch = Conv1D(filters=100, kernel_size=4, padding='valid', activation="relu", strides=1)(tweet_encoder)
fourgram_branch = GlobalMaxPooling1D()(fourgram_branch)
merged = concatenate([bigram_branch, trigram_branch, fourgram_branch], axis=1)

merged = Dense(256, activation="relu")(merged)
merged = Dropout(0.25)(merged)
output = Dense(1, activation="sigmoid")(merged)

optimizer = optimizers.adam(0.01)

model = Model(inputs=[tweet_input], outputs=[output])
model.compile(loss="binary_crossentropy", optimizer=optimizer, metrics=['accuracy'])
model.summary()

# Training the model
history = model.fit(x_train_seq, y_train, batch_size=32, epochs=5, validation_data=(x_val_seq, y_validation))

我还尝试将最后一个Dense层上的激活次数从1更改为2,但出现错误:

Error when checking target: expected dense_12 to have shape (2,) but got array with shape (1,)
今天

您正在执行二进制分类。因此,您拥有一个包含一个激活功能为的单元的密集层sigmoid乙状结肠功能输出范围为[0,1]的值,该值对应于给定样本属于肯定类别(即第一类别)的概率。低于0.5的所有内容都标记为零(即否定类别),高于0.5的所有内容都标记为1。因此,要查找预测的类,您可以执行以下操作:

preds = model.predict(data)
class_one = preds > 0.5

的真实元素class_one对应于标有1(即阳性类别)的样品。

奖励:要找到预测的准确性,您可以轻松地class_one与真实标签进行比较

acc = np.mean(class_one == true_labels)

请注意,我假设它true_labels由零和一组成。


此外,如果您的模型是使用Sequential类定义的,则可以轻松使用predict_classesmethod:

pred_labels = model.predict_classes(data)

但是,由于您正在使用Keras功能API来构建模型(在我看来,这样做非常好),因此无法使用predict_classes方法,因为该方法对于此类模型定义不明确。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用于实现卷积神经网络的Keras

神经网络总是预测相同的类

如何设计深度卷积神经网络?

如何确定在卷积神经网络层中使用的特征图的数量?

卷积神经网络-Keras-val_acc Keyerror'acc'

二进制Keras LSTM模型不输出二进制预测

卷积神经网络中的Keras形状误差

pytorch中的神经网络预测两个二进制变量

如何防止懒惰的卷积神经网络?

如何使用权重在Keras神经网络中手动预测数据

如何在keras中可视化卷积神经网络中间层的输出?

如何在DL4J中配置神经网络以产生多个二进制输出

如何修改PyTorch卷积神经网络以接受64 x 64图像并正确输出预测?

如何解释神经网络的预测

在卷积神经网络(张量流)中计算损失函数时如何获得预测?

如何确定Windows 10上的可执行二进制文件的体系结构

神经网络只能从二进制类预测一个类

如何改善神经网络的预测,分类

组合卷积神经网络

您如何确定用于图像分类的卷积神经网络的参数?

使用卷积神经网络作为二进制分类器

FF神经网络和二进制分类

对于使用神经网络的二进制分类,将使用多少个输出单位

如何预测分类中的二进制值

用于二进制经典化的 Tensorflow 神经网络;我如何使用占位符

卷积神经网络损失

卷积神经网络上的 PCA 实现

使用 TensorFlow 和 Keras 的卷积神经网络精度低

如何使用 Keras 从二进制图像分类模型中获取类?