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

时间:2017-05-24 07:29:30

标签: 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

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

7 个答案:

答案 0 :(得分:24)

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

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

答案 1 :(得分:1)

稀疏分类交叉熵的特点

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

如果这是一个分类任务,您希望将输出数据的格式设置为0到x-1,则可以保持稀疏的分类交叉熵,但是您需要将输出层中的神经元数量设置为你有课程。另外,您也可以将输出编码为一热向量,并使用分类交叉熵损失函数代替稀疏的分类交叉熵。

如果不是分类任务,并且您希望像回归一样预测任意实数值,则分类交叉熵根本不是合适的损失函数。

答案 2 :(得分:1)

Cray和Shaili的答案是正确的! 我的结果范围从1到6, 和这行:

tf.keras.layers.Dense(6, activation = 'softmax') 

产生了该错误消息,指出事情不在范围内 [0,6)。我以为这是一个标签问题(所有值都存在于 培训和验证标签集?),并且正在鞭打它们。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

当我的标签类型为“ float”时,我遇到了这个问题,将其强制转换为“ int”,问题就解决了...

答案 5 :(得分:0)

错误在 [0,4) 范围内,您可以在类(标签)的数量上加一。 例如改变这个:

tab = table(y,x)

tab[2,]/colSums(tab)
        1         2         3         4         5         6         7         8 
0.5555556 0.7142857 0.3076923 0.5333333 0.5000000 0.5384615 0.3333333 0.6363636 
        9 
0.5384615

到:

layers.Dense(4)

**与 [0,1) 相同

答案 6 :(得分:0)

这个问题的另一个可能的答案是关于工作区。如果这不是其他答案所暗示的逻辑/稀疏/熵错误,请继续阅读:

如果您创建了一个工作空间来保存模型训练时的数据,如果您使用新样本重新训练数据,尤其是使用不同数量的文件夹并将文件夹用作数据,旧的工作空间数据可能会导致此错误分类标签。

示例:

我训练了我的原始集:

Original Sample Set

当我尝试重新训练新样本集时:

New Sample Set

我收到错误: Received a label value of 3 which is outside the valid range of [0, 3)

这可能是因为旧样本集的 4 个文件夹与新样本集的 3 个文件夹的缓存值导致了某种问题。我所知道的是,一旦我从我的工作区中清除了旧信息,并再次运行它,它就会运行完成。这是多次失败后的孤立更改,所以我确信它解决了问题。

免责声明:我正在使用 C# 和 ML.NET,但它仍在使用 TensorFlow,这是我们两个错误产生的地方,因此它绝对适用于该问题。