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