分类交叉熵和标签编码
Posted
技术标签:
【中文标题】分类交叉熵和标签编码【英文标题】:Categorical crossentropy and label encoding 【发布时间】:2018-09-03 05:43:26 【问题描述】:我正在尝试编写多类输出,类是 ['A','B','C','D','E','F','G']。
谁能详细说明下一个错误消息:
"ValueError: 您正在传递一个形状为 (79, 1) 的目标数组,而将其用作损失 categorical_crossentropy
。categorical_crossentropy
期望目标是形状(样本、类)的二进制矩阵(1 和 0)。如果您的目标是整数类,您可以通过以下方式将它们转换为预期的格式:
from keras.utils.np_utils import to_categorical
y_binary = to_categorical(y_int)
或者,您可以改用损失函数sparse_categorical_crossentropy
,它确实需要整数目标。”
我的代码:
# Part 1 - Data Preprocessing
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
dataa = pd.read_csv('test_out.csv')
XX = dataa.iloc[:, 0:4].values
yy = dataa.iloc[:, 4].values
# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_Y_1 = LabelEncoder()
yy = labelencoder_Y_1.fit_transform(yy)
# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(XX, yy, test_size = 0.2,
random_state = 0)
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
# Part 2 - Now let's make the ANN!
# Importing the Keras libraries and packages
import keras
from keras.models import Sequential
from keras.layers import Dense
# Initialising the ANN
classifier = Sequential()
# Adding the input layer and the first hidden layer
classifier.add(Dense(output_dim = 6, init = 'uniform', activation = 'relu',
input_dim = 4))
# Adding the second hidden layer
classifier.add(Dense(output_dim = 6, init = 'uniform', activation = 'relu'))
# Adding the output layer
classifier.add(Dense(output_dim = 1, init = 'uniform', activation =
'softmax'))
# Compiling the ANN
classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy',
metrics = ['accuracy'])
# Fitting the ANN to the Training set
classifier.fit(X_train, y_train, batch_size = 10, nb_epoch = 50)
# Part 3 - Making the predictions and evaluating the model
# Predicting the Test set results
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)
# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
【问题讨论】:
您是否尝试过错误消息告诉您要做的事情之一? 是你的目标类二进制文件吗? 【参考方案1】:我假设你要预测的目标类是二元的,即只有 2 个可能的值会出现
如果你的目标是二进制的,那么模型的最后一层应该用sigmoid
激活函数激活。此外,模型应该使用binary_crossentropy
或sparse_categorical_crossentropy
编译。
如果目标是多类的,即超过 2 个可能的值,您必须在 keras 的 to_categorical
的帮助下将目标转换为分类目标。然后你应该用categorical_crossentropy
编译你的模型,模型中的最后一层应该用softmax
激活函数激活。!!
【讨论】:
你有这方面的文件吗?【参考方案2】:问题在于你的这部分代码,
# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_Y_1 = LabelEncoder()
yy = labelencoder_Y_1.fit_transform(yy)
您忘记对yy
进行一次热编码,请注意LabelEncoder
仅将您的分类数据转换为数字一,即[A, B, C, D, E, F, G]
到[1, 2, 3, 4, 5, 6, 7]
。由于您想使用softmax
激活和categorical_crossentropy
,因此您必须对其进行一次热编码(我过于简化了,但这是要点)。
所以,应该是这样的,
# Encoding categorical data
from keras.utils import to_categorical
from sklearn.preprocessing import LabelEncoder
labelencoder_Y_1 = LabelEncoder()
yy = labelencoder_Y_1.fit_transform(yy)
yy = to_categorical(yy)
【讨论】:
以上是关于分类交叉熵和标签编码的主要内容,如果未能解决你的问题,请参考以下文章
通俗理解交叉熵和KL散度(包括标签平滑的pytorch实现)
通俗理解交叉熵和KL散度(包括标签平滑的pytorch实现)