【发布时间】:2020-10-27 02:35:53
【问题描述】:
我有一个数据集,其中包含一张/两张/三张/...卡片的图像。 因为我总共有 52 张不同的卡片,所以我有 52 个类 -> 因此我的输出层中有 52 个神经元。
使用每张图像一张卡片训练网络非常适合 CNN。 一个标签看起来像这样:例如 [0,0,...,1,0,0]。 这是我完成这项任务的网络的最后一层:
model.add(layers.Dense(52, activation='softmax'))
optimizer = keras.optimizers.Adam(lr=0.00001)
model.compile(loss='categorical_crossentropy',metrics=['accuracy'],optimizer=optimizer)
为每张图片训练两张或更多卡片对我来说更具挑战性。
由于现在一张图像包含多张卡片,因此该图像的可能标签如下所示:[0,1,0,...,1,0,0]。
我将从相同的网络架构开始,但是:
我认为对于这个问题,我现在必须在最后一层使用 sigmoid 而不是 softmax(因为每个类都是独立的)。
对于损失,我会简单地使用类似mse = tf.keras.losses.MeanSquaredError()
至于准确性,我不确定。
model.add(layers.Dense(52, activation='sigmoid'))
adam = keras.optimizers.Adam(lr=0.00001)
model.compile(loss=mse ,metrics=['__?__'],optimizer=adam)
这些设置有什么问题?
我搜索了很多 - 但令人困惑的是,我没有找到一些有用的 cmets。人们总是给出一些使用 YOLO 的提示 - 但我不会检测对象 - 我只想分类:例如,图片中有一张红桃 A 和一张红桃王 - 它们在哪里并不重要。
还有一个困惑:我多次表示 CNN 只能对单类问题进行分类——这是真的吗?我希望不是 - 但如果是,为什么以及如何使用 keras 解决我的问题?
这是整个网络:
model = models.Sequential()
model.add(layers.Conv2D(32, (5, 5), activation='relu',input_shape=(500, 500, 3)))
model.add(BatchNormalization())
model.add(layers.MaxPooling2D((4, 4)))
model.add(layers.Conv2D(64, (5, 5), activation='relu'))
model.add(layers.MaxPooling2D((4, 4)))
model.add(BatchNormalization())
model.add(layers.Conv2D(64, (5, 5), activation='relu'))
model.add(layers.MaxPooling2D((3, 3)))
model.add(BatchNormalization())
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(52, activation='softmax'))
【问题讨论】:
标签: keras multiclass-classification