Python 为什么我会得到;收到的标签值为6,超出了[0,1]的有效范围,“即使我使用的是稀疏的”u category“u crossentrpy?

Python 为什么我会得到;收到的标签值为6,超出了[0,1]的有效范围,“即使我使用的是稀疏的”u category“u crossentrpy?,python,tensorflow,keras,deep-learning,classification,Python,Tensorflow,Keras,Deep Learning,Classification,因此,我尝试使用7个面部表情制作一个情感分类器。我知道为了使用整数标签而不是0和1,需要使用稀疏的分类交叉熵,并且需要将外层激活设置为softmax,但它并没有按照预期工作 我正在使用这里的数据集 代码 将熊猫作为pd导入 将numpy作为np导入 从PIL导入图像 随机输入 将matplotlib.pyplot作为plt导入 从keras.models导入顺序 从keras.optimizers导入RMSprop 从keras.layers导入Conv1D、maxpoolg1d 从keras.

因此,我尝试使用7个面部表情制作一个情感分类器。我知道为了使用整数标签而不是0和1,需要使用稀疏的分类交叉熵,并且需要将外层激活设置为softmax,但它并没有按照预期工作

我正在使用这里的数据集

代码
将熊猫作为pd导入
将numpy作为np导入
从PIL导入图像
随机输入
将matplotlib.pyplot作为plt导入
从keras.models导入顺序
从keras.optimizers导入RMSprop
从keras.layers导入Conv1D、maxpoolg1d
从keras.layers导入激活、脱落、变平、致密
情绪={0:愤怒,1:厌恶,2:恐惧,3:快乐,
4:'悲伤',5:'惊喜',6:'中立'}
df=pd.read\u csv('fer.csv'))
面=测向值[0:500,1]
faces=faces.tolist()
emos=df.值[0:500,0]
对于范围内的i(透镜(面)):
面[i]=[int(x)表示面[i]中的x]。拆分()
emos[i]=int(emos[i])
面=np.数组(面)
面=np。展开尺寸(面,轴=2)
模型=顺序()
添加(Conv1D(16,3,padding='same',input_shape=(2304,1),activation='relu'))
添加(Conv1D(16,3,padding='same',activation='relu'))
添加(最大池1d(池大小=2))
添加(Conv1D(32,3,padding='same',activation='relu'))
添加(Conv1D(32,3,padding='same',activation='relu'))
添加(最大池1d(池大小=2))
添加(Conv1D(64,3,padding='same',activation='relu'))
添加(Conv1D(64,3,padding='same',activation='relu'))
添加(最大池1d(池大小=2))
添加(Conv1D(128,3,padding='same',activation='relu'))
添加(Conv1D(256,3,padding='same',activation='relu'))
添加(最大池1d(池大小=2))
model.add(展平())
添加(密集(128,activation='relu'))
模型。添加(辍学率(0.5))
添加(密集(128,activation='relu'))
模型。添加(辍学率(0.5))
model.add(密集(1,activation='softmax'))
model.compile(loss='sparse\u categorical\u crossentropy',
优化器='adam',
指标=[‘准确度’])
模型拟合(面、表情、年代=10,批量大小=8)
model.save_权重('model.h5'))
错误
W tensorflow/core/framework/op_kernel.cc:1401]op_REQUIRES在sparse_xent_op失败。cc:90:无效参数:收到的标签值6超出了[0,1]的有效范围。标签值:6 0 2 4 6 0 3
回溯(最近一次呼叫最后一次):
文件“feclassizer.py”,第56行,在
模型拟合(面、表情、年代=10,批量大小=8)
文件“C:\Users\nrj10\Anaconda3\lib\site packages\keras\engine\training.py”,第1039行,在fit中
验证步骤=验证步骤)
文件“C:\Users\nrj10\Anaconda3\lib\site packages\keras\engine\training\u arrays.py”,第199行,在fit\u循环中
outs=f(ins\U批量)
文件“C:\Users\nrj10\Anaconda3\lib\site packages\keras\backend\tensorflow\u backend.py”,第2715行,在调用中__
返回自调用(输入)
文件“C:\Users\nrj10\Anaconda3\lib\site packages\keras\backend\tensorflow\u backend.py”,第2675行,在调用中
fetched=self.\u可调用\u fn(*array\u vals)
文件“C:\Users\nrj10\Anaconda3\lib\site packages\tensorflow\python\client\session.py”,第1439行,在调用中__
运行_元数据_ptr)
文件“C:\Users\nrj10\Anaconda3\lib\site packages\tensorflow\python\framework\errors\u impl.py”,第528行,在退出中__
c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors\u impl.InvalidArgumentError:收到的标签值为6,超出了[0,1]的有效范围。标签值:6 0 2 4 6 0 3
[{{node loss/densite_3_loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits}}]
如果有N个类(N>2),则无论是否使用稀疏标签,最后一层都需要有N个神经元:

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

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

最后一层应该有类或类别的数量

在本例中,因为有7个类

emotion = {0 : 'Angry', 1 : 'Disgust',2 : 'Fear',3 : 'Happy',
       4 : 'Sad',5 : 'Surprise',6 : 'Neutral'}
最后一层应更改为

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

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

我错误地认为稠密(n)用于输出n个值。这就澄清了这一点。谢谢:)
model.add(Dense(7, activation='softmax'))