我正在研究一个简单的cnn分类器,使用带有tensorflow背景的keras。
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)
,这对我没有任何意义。有什么建议吗?
稀疏范畴交叉熵的特性
损失函数稀疏分类交叉熵将分类器上下文中的最后一层解释为每个可能类的一组概率,输出值解释为类的个数。(这个Tensorflow/Keras documentation更详细一些)所以输出层中的x个神经元与0到x-1范围内的输出值进行比较;在输出层中只有一个神经元是一个没有意义的“一元”分类器。
如果这是一个分类任务,您希望以0到x-1的形式输出数据,那么您可以保持稀疏的分类交叉熵,但是您需要将输出层中的神经元数设置为您拥有的类数。或者,您可以将输出编码为一个热向量,并使用分类交叉熵损失函数,而不是稀疏的分类交叉熵。
如果它是而不是一个分类任务,并且你想像在回归中那样预测任意实值,那么分类交叉熵根本不是一个合适的损失函数。
Range [0, 1)
表示0到1之间的每个数字,不包括1。因此1不是[0,1]范围内的值。我不是百分之百确定,但问题可能是由于您选择了损失函数。对于二进制分类,
binary_crossentropy
应该是更好的选择。在最后一个致密层中,你使用了
model.add(Dense(1, activation='softmax'))
。这里1限制其值[0, 1)
将其形状更改为最大输出标签。例如,您的输出来自标签[0,7)
,然后使用model.add(Dense(7, activation='softmax'))
相关问题 更多 >
编程相关推荐