CNN要输出2的百分比class

CNN to output percentage of 2 class

我是争论的初学者。我有这个问题:我必须 class 确定视频每一帧中 2 class 的百分比。 我创建了一个包含大约 500 张图像(每张 250 张 class)的小型数据集,以及一个包含这些层的 CNN:

model = tf.models.Sequential()
model.add(tf.layers.Conv2D(32, kernel_size=(3, 3), activation='relu',input_shape=(224,224,3)))
model.add(tf.layers.MaxPooling2D((2, 2)))
model.add(tf.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(tf.layers.MaxPooling2D((2, 2)))
model.add(tf.layers.Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(tf.layers.MaxPooling2D((2, 2)))
model.add(tf.layers.Conv2D(256, kernel_size=(3, 3), activation='relu'))
model.add(tf.layers.MaxPooling2D((2, 2)))
model.add(tf.layers.Flatten())
model.add(tf.layers.Dense(512, activation='relu'))
model.add(tf.layers.Dropout(0.2))
model.add(tf.layers.Dense(2,activation='sigmoid'))
model.summary()
model.compile(loss='binary_crossentropy', optimizer=tf.optimizers.Adam(learning_rate=0.00001), metrics=['accuracy'])

1)问题使用binary_crossentropy + sigmoidbinary_crossentropy + softmax?

2)那么使用transfer learning/fine tuning 还是像这样从头构建CNN更好?

3)我将 ImageDataGenerator 用于 DataAugmentation 因为数据集很小,对吗?

4) 我可以将哪些值用于 batch_size、steps_per_epochs、learning_rate...我注意到模型精度在 val_accuracy 时早早达到 1.0,并且在预测中没有 return 每个 class 的正确百分比,而是 return 值,例如 [9.999e-1 4.444e-5]

  1. 因为你的是二进制 classification,所以选择 sigmoid。 Softmax 用于 multi-class (>2).
  2. 使用迁移学习总是更好。使用 VGG16、ResNet、Inception 等。
  3. 是的,在小数据集的情况下,数据扩充有很大帮助。
  4. 你需要在最后一层使用一个神经元而不是 2 个。因为在一个神经元中,如果值大于 0.5,它将被视为 class 1,否则为 0。如果你想坚持两个神经元,然后,为了得到你的答案,你应该采用 np.argmax 的预测,在你给出的例子中,pred = [9.999e-1 4.444e-5],预测的 class 是 0,因为 pred[ 0] > pred[1].