Tensorflow CNN二元分类中sigmoid激活函数的任意阈值?

Tensorflow CNN二元分类中sigmoid激活函数的任意阈值?,tensorflow,machine-learning,keras,neural-network,nlp,Tensorflow,Machine Learning,Keras,Neural Network,Nlp,我使用gensimDoc2Vec和CNN在Tensorflow 2.2.0中对评论情绪进行分类-0或1: model = tf.keras.Sequential([ tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=maxlen, embeddings_initialize

我使用
gensim
Doc2Vec和CNN在
Tensorflow 2.2.0
中对评论情绪进行分类-
0
1

model = tf.keras.Sequential([
      tf.keras.layers.Embedding(vocab_size, embedding_dim, 
                                input_length=maxlen, 
                                embeddings_initializer=Constant(embedding), trainable=False),
      tf.keras.layers.Conv1D(128, 5, activation='relu'),
      tf.keras.layers.GlobalMaxPooling1D(),
      tf.keras.layers.Dense(10, activation='relu'),
      tf.keras.layers.Dense(1, activation='sigmoid')
    ])

model.compile(loss='binary_crossentropy',
              optimizer=tf.keras.optimizers.Adam(1e-4),
              metrics=['accuracy'])

history = model.fit(X_train, y_train,
                    epochs=8,
                    validation_split=0.3,
                    batch_size=10)
# Example sigmoid outputs for new test reviews:
good_review_1: 0.000052
good_review_2: 0.000098

bad_review_1: 0.112334
bad_review_2: 0.214934
然后我进行预测,并使用
np.round()将我的乙状结肠概率转换为
0
1

我得到了很好的结果(~96%的准确率),表明
0.5
的阈值按预期工作

然而,当我试图对一组新数据进行预测时,该模型似乎能将坏评论与好评论区分开来,但范围约为
0.0

model = tf.keras.Sequential([
      tf.keras.layers.Embedding(vocab_size, embedding_dim, 
                                input_length=maxlen, 
                                embeddings_initializer=Constant(embedding), trainable=False),
      tf.keras.layers.Conv1D(128, 5, activation='relu'),
      tf.keras.layers.GlobalMaxPooling1D(),
      tf.keras.layers.Dense(10, activation='relu'),
      tf.keras.layers.Dense(1, activation='sigmoid')
    ])

model.compile(loss='binary_crossentropy',
              optimizer=tf.keras.optimizers.Adam(1e-4),
              metrics=['accuracy'])

history = model.fit(X_train, y_train,
                    epochs=8,
                    validation_split=0.3,
                    batch_size=10)
# Example sigmoid outputs for new test reviews:
good_review_1: 0.000052
good_review_2: 0.000098

bad_review_1: 0.112334
bad_review_2: 0.214934
请注意,该模型在训练过程中从未见过
X_测试
,它能够很好地预测。只有当我引入一组新的审阅文本字符串时,我才会遇到错误的预测。对于新的评论,我在调用
model.predict()
之前所做的唯一预处理就是通过用于模型培训的相同标记器将它们输入:

s = 'This is a sample bad review.'
tokenizer.texts_to_sequences(pd.Series(s))
s = pad_sequences(s, maxlen=maxlen, padding='pre', truncating='pre')

model.predict(s)
我一直试图弄明白这个难题,但进展甚微。我撞上了,这表明

某些sigmoid函数将其设置为0,而某些函数将其设置为不同的“阈值”


但这仍然不能解释为什么我的模型能够预测
X_测试
数据集的
np.round()
0.5
阈值(该模型从未学习过),然后无法在相同的
0.5
阈值下预测新数据集…

你能尝试一下
model.predict(X_测试).round()吗
并检查输出之间是否存在任何差异。