收到的标签值为1,超出[0,1]的有效范围 - Python,Keras

Tah*_*que 22 python machine-learning keras

我正在使用具有张量流背景的keras的简单cnn分类器.

def cnnKeras(training_data, training_labels, test_data, test_labels, n_dim):
print("Initiating CNN")
seed = 8
numpy.random.seed(seed)
model = Sequential()
model.add(Convolution2D(64, 1, 1, init='glorot_uniform', border_mode='valid',
                        input_shape=(16, 1, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(1, 1)))
model.add(Convolution2D(32, 1, 1, init='glorot_uniform', activation='relu'))
model.add(MaxPooling2D(pool_size=(1, 1)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='softmax'))
# Compile model
model.compile(loss='sparse_categorical_crossentropy',
              optimizer='adam', metrics=['accuracy'])
model.fit(training_data, training_labels, validation_data=(
    test_data, test_labels), nb_epoch=30, batch_size=8, verbose=2)

scores = model.evaluate(test_data, test_labels, verbose=1)
print("Baseline Error: %.2f%%" % (100 - scores[1] * 100))
# model.save('trained_CNN.h5')
return None
Run Code Online (Sandbox Code Playgroud)

这是一个二进制分类问题,但我不断收到对我Received a label value of 1 which is outside the valid range of [0, 1)没有任何意义的消息.任何建议?

Mic*_*tti 38

Range [0, 1)表示0到1之间的每个数字,不包括 1.因此1不是[0,1]范围内的值.

我不是百分百肯定,但问题可能是由于您选择了损失功能.对于二进制分类,binary_crossentropy应该是更好的选择.


小智 20

在您使用的最后一个 Dense 层中model.add(Dense(1, activation='softmax'))。这里 1 限制它的值从[0, 1)改变它的形状到最大输出标签。例如,您的输出来自标签,[0,7)然后使用model.add(Dense(7, activation='softmax'))

  • 根据文档(https://keras.io/layers/core/),这里 1 是输出维度(等级)而不是输出范围。 (3认同)

Pet*_*ris 14

稀疏分类交叉熵的特点

损失函数 sparse_categorical_crossentropy 将分类器上下文中的最后一层解释为每个可能类别的一组概率,并将输出值解释为类别数量。(Tensorflow/Keras 文档有更详细的介绍。)因此,将输出层中的 x 个神经元与 0 到 x-1 范围内的输出值进行比较;并且在输出层只有一个神经元是一个没有意义的“一元”分类器。

如果是分类任务,希望输出0到x-1形式的数据,那么可以保持稀疏的分类交叉熵,但需要将输出层的神经元数设置为您拥有的类数. 或者,您可以将输出编码为 one-hot 向量,并使用分类交叉熵损失函数而不是稀疏分类交叉熵。

如果它不是分类任务,并且您想像在回归中那样预测任意实数值,那么分类交叉熵根本不是合适的损失函数。