使用模型训练进行多标签图像分类以进行多分类?

时间:2020-09-13 22:36:22

标签: tensorflow keras computer-vision conv-neural-network multilabel-classification

我目前正在通过这个kaggle项目进行工作,以对白细胞进行多图像分类(共有4类:嗜中性粒细胞,嗜酸性粒细胞,淋巴细胞和单核细胞)。

对一种类型的白细胞进行分类非常简单。我使用来自keras的CNN构建了模型。我想进一步解决这个问题,并尝试在多标签图像分类中实现该模型。

例如,如果我将此图像输入模型:https://webpath.med.utah.edu/jpeg5/HEME002.jpg 我希望我的模型输出白细胞的存在,在这种情况下,它应该输出“存在中性粒细胞和淋巴细胞”。

问题在于,该数据集中的所有图像都是具有单个白细胞的图像,而这正是模型的训练对象。从未见过图像中包含一个或多个白细胞。

我的问题是可以采用这种模型吗?如何将其外推到与一种类型的白细胞多的图像一起工作?

我将在此处使用此代码:

bnmomemtum=0.85
def fire(x, squeeze, expand):
  y  = Conv2D(filters=squeeze, kernel_size=1, activation='relu', padding='same')(x)
  y  = BatchNormalization(momentum=bnmomemtum)(y)
  y1 = Conv2D(filters=expand//2, kernel_size=1, activation='relu', padding='same')(y)
  y1 = BatchNormalization(momentum=bnmomemtum)(y1)
  y3 = Conv2D(filters=expand//2, kernel_size=3, activation='relu', padding='same')(y)
  y3 = BatchNormalization(momentum=bnmomemtum)(y3)
  return concatenate([y1, y3])

def fire_module(squeeze, expand):
  return lambda x: fire(x, squeeze, expand)

x = Input(shape=[IMG_SIZE, IMG_SIZE, 3])
y = BatchNormalization(center=True, scale=False)(x)
y = Activation('relu')(y)
y = Conv2D(kernel_size=5, filters=12, padding='same', use_bias=True, activation='relu')(x)
y = BatchNormalization(momentum=bnmomemtum)(y)

y = fire_module(12, 24)(y)
y = MaxPooling2D(pool_size=2)(y)

y = fire_module(24, 48)(y)
y = MaxPooling2D(pool_size=2)(y)

y = fire_module(32, 64)(y)
y = MaxPooling2D(pool_size=2)(y)

y = fire_module(24, 48)(y)
y = MaxPooling2D(pool_size=2)(y)

y = fire_module(18, 36)(y)
y = MaxPooling2D(pool_size=2)(y)

y = fire_module(12, 24)(y)

y = GlobalAveragePooling2D()(y)
y = Dense(NUM_CLASSES, activation='sigmoid')(y)
model = Model(x, y)
model.compile(optimizer=optimizers.RMSprop(lr=2e-5),
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.summary()

0 个答案:

没有答案