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()吗
并检查输出之间是否存在任何差异。