根据我在线阅读的内容,我的任务是多标签分类,因为我有~40k图像,每个图像都有多个标签,每个图像可以同时声明多个标签。例如,IMAGE_1 - > [1 0 1 0 0 0 1 ... 1]是可能的。
我在最后一层使用softmax而在binary_crossentropy中使用了丢失函数。这是我的模特:
model = Sequential()
model.add(Conv2D(64, (5, 5), strides=(1,1), activation='relu', kernel_initializer='glorot_uniform', input_shape=(256, 256, 3)))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2)))
# Create the feature vector
model.add(Flatten())
model.add(Dense(1000, activation="relu", kernel_initializer="uniform"))
model.add(Dropout(0.5))
model.add(Dense(17, activation='softmax'))
然后编译:
sgd = SGD(lr=0.001, momentum=0.9)
model.compile(loss="binary_crossentropy", optimizer=sgd, metrics=["accuracy"])
并且训练(注意我这里只使用了1k图像以加快测试速度,但是我得到的结果与40k图像相同):
# Save model and stop if overfit
checkpoint = ModelCheckpoint("model.h5", monitor='val_loss', verbose=0, save_best_only=True, save_weights_only=True, mode='auto', period=1)
early_stop = EarlyStopping(monitor='val_loss', min_delta=0.005, patience=3, verbose=0, mode='auto')
callbacks_list = [checkpoint, early_stop]
history = model.fit(data, labels, validation_split=0.33, epochs=20, batch_size=100, callbacks=callbacks_list, verbose=1)
最后,我预测每个输入的输出:
CNN_output = model.predict(data)
我使用以下代码获得以下输出:
for h in range(len(data)):
output_file.write("ACTUAL: train_" + str(h) + ": " + "\n" + str(labels[h]) + "\n")
output_file.write("PREDICTION: train_" + str(h) + ": " + "\n" + str(CNN_output[h]) + "\n")
可以看出,对于任何输入,预测中的模式与[0 1 0 1 0 0 0 0 ...]相同,我不知道为什么会这样!
以下是每个时代的样子: Accuracy Vs Loss
可以看出,验证精度保持不变,这是我假设的上述问题的结果。 与精度相比,F_score也非常低,这似乎也是由于上述问题所致。
非常感谢任何帮助!
此致 利奥尔