Python 神经网络中的多变量输出|为什么Keras会产生负二元交叉熵?

Python 神经网络中的多变量输出|为什么Keras会产生负二元交叉熵?,python,tensorflow,keras,loss-function,Python,Tensorflow,Keras,Loss Function,我遇到一个学校项目的问题 我必须根据文本数据在测试集上预测一个人的年龄和性别。我的训练数据集有4个特征ID、关键字、年龄、性别 我创建了一个神经网络,请看下面的代码,但当拟合后者时,我的损失值是非常负的 你能告诉我如何缓解这个问题吗 import pandas as pd import numpy as np import plotly.express as px import matplotlib.pyplot as plt import seaborn as sns from sklearn

我遇到一个学校项目的问题

我必须根据文本数据在测试集上预测一个人的年龄和性别。我的训练数据集有4个特征ID、关键字、年龄、性别

我创建了一个神经网络,请看下面的代码,但当拟合后者时,我的损失值是非常负的

你能告诉我如何缓解这个问题吗

import pandas as pd
import numpy as np
import plotly.express as px
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split

#Load the datasets
chunk_train = pd.read_csv('/Users/romeoleon/Downloads/train.csv',chunksize=10**6)
data_train = pd.concat(chunk_train)

#Map the values for sex columns
data_train.sex = data_train.sex.map({'M':0,'F':1})

#Remove the rows with missing data
print('Missing rows represent {} percent of the dataframe'.format(data_train['keywords'].isna().sum()/len(data_train.keywords)*100))

#Drop the missing values
data_train.dropna(inplace=True)

#Plot the distribution of numerical variables
sns.histplot(data_train.age,bins=85)
plt.show()
sns.countplot(x='sex',data=data_train)
plt.show()

#Prepare the data to feed it to the NN
import numpy as np
from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

x_train, x_test, y_train, y_test = train_test_split(data_train['keywords'],data_train[["age","sex"]],test_size=0.2)

#Choose parameters
vocab_size = 1000
maxlen = 300
batch_size = 32
embedding_dims = 100
hidden_dims = 5
filters = 250
kernel_size = 3
epochs = 10

#Tokenize the words
tokenizer = Tokenizer(num_words=vocab_size)

tokenizer.fit_on_texts(x_train)

X_train = tokenizer.texts_to_matrix(x_train)
X_test = tokenizer.texts_to_matrix(x_test)

#Pad sequencing : Ensure all sequences have the same length
from tensorflow.keras.preprocessing import sequence
X_train = sequence.pad_sequences(X_train, maxlen=maxlen)
X_test = sequence.pad_sequences(X_test, maxlen=maxlen)

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, MaxPooling1D
from tensorflow.keras.layers import Embedding, LSTM
from tensorflow.keras.layers import Conv1D, Flatten

#Create the model
model = Sequential()
model.add(Embedding(vocab_size, embedding_dims, input_length=maxlen, trainable=True))

model.add(Dropout(0.5))
model.add(Conv1D(filters,
                 kernel_size,
                 padding='valid',
                 activation='relu'))
#model.add(MaxPooling1D(pool_size=4))
model.add(Flatten())
model.add(Dense(hidden_dims, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='sigmoid'))

# Compile neural model
model.compile(loss='binary_crossentropy', # Cross-entropy
                optimizer='adam', # Root Mean Square Propagation
                metrics=['accuracy']) # Accuracy performance metric

model.summary()

#Fit the model
model.fit(X_train, y_train,
          batch_size=batch_size,
          epochs=1,
          validation_data=(X_test, y_test), verbose=1)
您可以在下面找到我的培训数据集结构的屏幕截图:


当使用“二进制交叉熵”作为损失函数时,输出端的稠密应该只有1个单位,而不是2个单位。1个单元有2个状态,即1或0 使用此选项:

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

当使用“二进制交叉熵”作为损失函数时,输出端的稠密应该只有1个单位,而不是2个单位。1个单元有2个状态,即1或0 使用此选项:

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

嘿,谢谢你的回答!我有两个y_train变量,因此,当我试图用一个密集输出层来拟合我的模型时,我有以下错误消息:ValueError:logits和Label必须具有相同的形状None,1 vs None,2如果要预测一个人的年龄和性别,那么网络应该有两个输出;一个是年龄连续值,另一个是性别分类。这可以通过函数式API实现@Roméoleoni如果您想要有多个输出,“顺序”方法可能不合适。相反,“model”方法可以在这个多输出任务中正常工作:model=modelnitputs=inputs,outputs=[predictions1,predictions2]@RoméoLEONHey,感谢您的回答!我有两个y_train变量,因此,当我试图用一个密集输出层来拟合我的模型时,我有以下错误消息:ValueError:logits和Label必须具有相同的形状None,1 vs None,2如果要预测一个人的年龄和性别,那么网络应该有两个输出;一个是年龄连续值,另一个是性别分类。这可以通过函数式API实现@Roméoleoni如果您想要有多个输出,“顺序”方法可能不合适。相反,“model”方法可以在这个多输出任务中正常工作:model=modelnitputs=inputs,outputs=[predictions1,predictions2]@RoméoLEON