python - 如何仅使用卷积层实现图像分类?
问题描述
我正在尝试制作一个基于滑动窗口输出预测的图像分类模型。做到这一点的唯一方法是将网络的输出层作为 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 左右。
解决方案
推荐阅读
- python - 收集满足给定条件的numpy数组元素的Pythonic方法
- reactjs - 为 Nextjs 应用程序创建用户和管理员仪表板开关的最佳方法是什么?
- javascript - 为什么我的 getter/setter 方法没有按预期工作 - 怀疑它与“this”有关
- javascript - Javascript基于多个字段过滤数据
- r - 当条件相同但输出不同时如何组合mutate?
- python - 'float' 对象没有属性 'something' 错误
- r - 获取特定组的列中空单元格的百分比
- javascript - 访问 JSON 数据时出现未捕获的类型错误
- python - 如何使用 pytest_mock 模拟从另一个类调用的类方法
- python-3.x - 将字符或单词移动到新行