我正在使用具有张量流背景的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)
。任何建议?
答案 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)
这个问题的另一个可能的答案是关于工作区。如果这不是其他答案所暗示的逻辑/稀疏/熵错误,请继续阅读:
如果您创建了一个工作空间来保存模型训练时的数据,如果您使用新样本重新训练数据,尤其是使用不同数量的文件夹并将文件夹用作数据,旧的工作空间数据可能会导致此错误分类标签。
我训练了我的原始集:
当我尝试重新训练新样本集时:
我收到错误:
Received a label value of 3 which is outside the valid range of [0, 3)
这可能是因为旧样本集的 4 个文件夹与新样本集的 3 个文件夹的缓存值导致了某种问题。我所知道的是,一旦我从我的工作区中清除了旧信息,并再次运行它,它就会运行完成。这是多次失败后的孤立更改,所以我确信它解决了问题。
免责声明:我正在使用 C# 和 ML.NET,但它仍在使用 TensorFlow,这是我们两个错误产生的地方,因此它绝对适用于该问题。