首页 > 解决方案 > 如何仅使用卷积层实现图像分类?

问题描述

我正在尝试制作一个基于滑动窗口输出预测的图像分类模型。做到这一点的唯一方法是将网络的输出层作为 Conv2D 层。

这是我的模型架构:

inputs = Input((None, None, 3))

x = Conv2D(filters = 32, kernel_size = (3,3), strides = (1,1), kernel_initializer = 'he_normal', padding = 'same')(inputs)
x = BatchNormalization()(x)
x = LeakyReLU(0.2)(x)

x = Conv2D(filters = 32, kernel_size = (3,3), strides = (1,1), kernel_initializer = 'he_normal', padding = 'same')(x)
x = BatchNormalization()(x)
x = LeakyReLU(0.2)(x)

x = Conv2D(filters = 32, kernel_size = (3,3), strides = (1,1), kernel_initializer = 'he_normal', padding = 'same')(x)
x = BatchNormalization()(x)
x = LeakyReLU(0.2)(x)

x = Conv2D(filters = 32, kernel_size = (3,3), strides = (1,1), kernel_initializer = 'he_normal', padding = 'same')(x)
x = BatchNormalization()(x)
x = LeakyReLU(0.2)(x)

x = Conv2D(filters = 1, kernel_size = (3,3), strides = (1,1), kernel_initializer = 'he_normal', padding = 'same')(x)
x = LeakyReLU(0.2)(x)
x = Dropout(dropout)(x)

x = Conv2D(filters = 32, kernel_size = (1,1), strides = (1,1), kernel_initializer = 'he_normal', padding = 'same')(x)
x = LeakyReLU(0.2)(x)
x = Dropout(dropout)(x)

x = Conv2D(1, kernel_size = (128,128), strides = (1,1), kernel_initializer = 'he_normal')(x)
x = Activation('sigmoid')(x)

根据我的阅读,kernel_size 和步幅等于 (1,1) 的 Conv2D 层实际上是一个 Dense 层,但是这个模型不会收敛,而另一个具有 Dense 层的模型确实会收敛(如果你需要,我可以将原始架构添加到问题中)。

我已经完成了通常的内务处理——比如确保我的所有训练数据都在 0 和 1 之间标准化,但损失保持在 0.6 左右。

标签: pythontensorflowkeras

解决方案


推荐阅读