1

我正在学习使用Keras设计卷积神经网络。我开发了一个使用VGG16作为基础的简单模型。我在数据集中有大约6类图像。这里是我的模型的代码和描述。在Keras的多分类中有多个预测?

model = models.Sequential() 
conv_base = VGG16(weights='imagenet' ,include_top=False, input_shape=(IMAGE_SIZE, IMAGE_SIZE, 3)) 
conv_base.trainable = False 
model.add(conv_base) 
model.add(layers.Flatten()) 
model.add(layers.Dense(256, activation='relu', kernel_regularizer=regularizers.l2(0.001))) 
model.add(layers.Dropout(0.5)) 
model.add(layers.Dense(6, activation='sigmoid')) 

1

下面是用于编译和拟合模型的代码:

model.compile(loss='categorical_crossentropy', 
     optimizer=optimizers.RMSprop(lr=1e-4), 
     metrics=['acc']) 
model.summary() 

callbacks = [ 
    EarlyStopping(monitor='acc', patience=1, mode='auto'), 
    ModelCheckpoint(monitor='val_loss', save_best_only=True, filepath=model_file_path) 
] 

history = model.fit_generator(
    train_generator, 
    steps_per_epoch=10, 
    epochs=EPOCHS, 
    validation_data=validation_generator, 
    callbacks = callbacks, 
    validation_steps=10) 

这里是一个新的图像

img = image.load_img(img_path, target_size=(IMAGE_SIZE, IMAGE_SIZE)) 
plt.figure(index) 
imgplot = plt.imshow(img) 

x = image.img_to_array(img) 
x = x.reshape((1,) + x.shape) 
prediction = model.predict(x)[0] 
# print(prediction) 

通常模型的预测的代码。 predict()方法预测多个类。

[0 1 1 0 0 0] 

我有几个问题

  1. 这是正常的多类分类模型来预测一个以上的输出?
  2. 如果预测不止一个班级,在培训时间内如何测量准确度?
  3. 如何修改神经网络,以便只预测一个类?

任何帮助表示赞赏。非常感谢!

回答

1

你不是在做多类分类,而是多标签。这是由于在输出层使用sigmoid激活引起的。要正确执行多类分类,请在输出处使用softmax激活,这将产生类上的概率分布。 如预期的那样,以最大概率(argmax)取类别将产生单个类别预测。

+0

谢谢你的解释。就是这样!你能解释一下Keras火车功能如何测量准确性吗?例如,在训练期间,假设模型预测[0,0.2,0.4,0.7,0.1,0]。凯拉斯是否会看第3课,准确度为0.7,并认为该模型的输出与真相相比较? – TMS

+0

这种方法不是库特定的。一般多类分类概率是使用n个输出类的softmax激活,将“pick”作为最高概率之一。所以对你而言,是的,第3课被认为是选定的课程。单个样本的准确度是二进制的,并根据您的输入进行平均。 @TMS。 – modesitt