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