为什么我在使用sparse\u categorial_crossentrpy时仍得到“收到的标签值为6,超出了[0,1]的有效范围”?

2024-04-26 02:56:33 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我试图用这7种表情来做一个情感分类器。我知道,为了使用整数标签而不是0和1,我们需要使用稀疏的分类交叉熵,并且需要将外层激活设置为softmax,但它的结果并不像预期的那样。在

我使用这里的数据集https://www.kaggle.com/ashishpatel26/facial-expression-recognitionferchallenge

代码

import pandas as pd
import numpy as np
from PIL import Image
import random
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.optimizers import RMSprop
from keras.layers import Conv1D, MaxPooling1D
from keras.layers import Activation, Dropout, Flatten, Dense

emotion = {0 : 'Angry', 1 : 'Disgust',2 : 'Fear',3 : 'Happy',
           4 : 'Sad',5 : 'Surprise',6 : 'Neutral'}
df=pd.read_csv('fer.csv')
faces=df.values[0:500,1]
faces=faces.tolist()
emos=df.values[0:500,0]

for i in range(len(faces)):
    faces[i]=[int(x) for x in faces[i].split()]
    emos[i]=int(emos[i])

faces=np.array(faces)
faces=np.expand_dims(faces, axis=2)

model = Sequential()

model.add(Conv1D(16, 3, padding='same', input_shape=(2304,1), activation='relu'))
model.add(Conv1D(16, 3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))

model.add(Conv1D(32, 3, padding='same', activation='relu'))
model.add(Conv1D(32, 3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))

model.add(Conv1D(64, 3, padding='same', activation='relu'))
model.add(Conv1D(64, 3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))

model.add(Conv1D(128, 3, padding='same', activation='relu'))
model.add(Conv1D(256, 3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))

model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))

model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))

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

model.compile(loss='sparse_categorical_crossentropy',
            optimizer='adam',
            metrics=['accuracy'])

model.fit(faces,emos,epochs=10,batch_size=8)
model.save_weights('model.h5')

错误

^{pr2}$

Tags: fromimportaddsizemodelactivationkerasdense
1条回答
网友
1楼 · 发布于 2024-04-26 02:56:33

如果有N个类(N>;2),则无论是否使用稀疏标签,最后一个层都需要有N个神经元:

model.add(Dense(7, activation='softmax'))

不要忘记稀疏标签只是为了方便起见,您的模型仍然需要为每个类生成一个分数。在

相关问题 更多 >