我使用以下代码将电影评论分为三类(负数为-1,中性数为0和1为正数)。但是,对于三类分类问题,最后一层中只有一个输出神经元是真的吗?
import tensorflow as tf
import numpy as np
import pandas as pd
import numpy as K
csvfilename_train = 'train(cleaned).csv'
csvfilename_test = 'test(cleaned).csv'
# Read .csv files as pandas dataframes
df_train = pd.read_csv(csvfilename_train)
df_test = pd.read_csv(csvfilename_test)
train_sentences = df_train['Comment'].values
test_sentences = df_test['Comment'].values
# Extract labels from dataframes
train_labels = df_train['Sentiment'].values
test_labels = df_test['Sentiment'].values
vocab_size = 10000
embedding_dim = 16
max_length = 30
trunc_type = 'post'
oov_tok = '<OOV>'
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
tokenizer = Tokenizer(num_words = vocab_size, oov_token = oov_tok)
tokenizer.fit_on_texts(train_sentences)
word_index = tokenizer.word_index
sequences = tokenizer.texts_to_sequences(train_sentences)
padded = pad_sequences(sequences, maxlen = max_length, truncating = trunc_type)
test_sequences = tokenizer.texts_to_sequences(test_sentences)
test_padded = pad_sequences(test_sequences, maxlen = max_length)
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length = max_length),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(6, activation = 'relu'),
tf.keras.layers.Dense(1, activation = 'sigmoid'),
])
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
num_epochs = 10
model.fit(padded, train_labels, epochs = num_epochs, validation_data = (test_padded, test_labels))
当我改变tf.keras.layers.Dense(1, activation = 'sigmoid')
到tf.keras.layers.Dense(2, activation = 'sigmoid')
它给了我下面的错误:
---> 10 model.fit(padded, train_labels, epochs = num_epochs, validation_data = (test_padded,test_labels))
ValueError: logits and labels must have the same shape ((None, 2) vs (None, 1))
如果要在3个类别之间进行分类,则应该有3个神经元。
另外,'softmax'
假设所有观测值仅在一个类中,则应将激活用于最后一层。
接下来,'sparse_categorical_crossentropy'
由于您的输入不是一键编码的,因此应该使用。像这样[0,0,1], [0,1,0], [1,0,0]
的目标是可选的,您也可以选择[1, 2, 0, 1, 2, 1, 0]
。
最后,您的目标应该是,[0, 1, 2]
而不是,[-1, 0, 1]
所以我建议您在标签上加1。
test_labels = df_test['Sentiment'].values + 1
如果标签[-1, 0, 1]
不是,则会发生这种情况[0, 1, 2]
:
import tensorflow as tf
sparse_entropy = tf.losses.SparseCategoricalCrossentropy()
a = tf.convert_to_tensor([[-1., 0., 1.]]) #+ 1
b = tf.convert_to_tensor([[.4, .2, .4], [.1, .7, .2], [.8, .1, .1]])
sparse_entropy(a, b)
nan
如果取消注释+1
,它将标签转换为[0, 1, 2]
,则可以使用:
<tf.Tensor: shape=(), dtype=float32, numpy=1.1918503>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句