训练cnn分类器将任何输入形状的图像分类为输入

时间:2020-08-23 09:10:47

标签: python tensorflow machine-learning keras deep-learning

我正在尝试训练具有两个类别的图像分类器,这是我的神经网络

model=Sequential()
model.add(tf.keras.layers.Conv2D(3,(3,3),activation="relu"))
model.add(tf.keras.layers.Conv2D(32,(3,3),activation="relu"))
model.add(tf.keras.layers.Conv2D(16,(3,3),activation="relu"))
model.add(tf.keras.layers.Conv2D(8,(3,3),activation="relu"))
model.add(Flatten())
model.add(Dense(2,activation="softmax"))

当所有图像都调整为特定大小时效果很好,但是我希望在删除展平层时不调整图像大小来训练它,我的模型可以输出任何尺寸的图像,而当我对其他图像使用展平层时大小,这是我第二次使用模型时出现错误。 让我知道有没有替代方法可以替代适用于任何输入形状的平板的扁平层

4 个答案:

答案 0 :(得分:1)

没有固定输入形状就不能训练CNN,这将产生不同的要素地图大小。您必须使用一个函数来重塑所有输入图像:

import cv2

def my_resize(img, shape=(32, 32, 1)):
  return cv2.resize(img, dsize=shape)

inputs = [...] # list of input images

outputs = list(map(my_resize, inputs))

答案 1 :(得分:1)

可以制作没有预先指定的输入形状的CNN。您需要用GlobalMaxPool2D替换Flatten。之所以可以这样做是因为与展平相反,GlobalMaxPool2D给出了输出的特征图大小的张量,而与每个特征图的输入形状无关。展平通过将2维转换为一维输出来冻结尺寸。每个特征图的形状取决于初始输入大小,但是特征图的数量在模型中确定。将输入形状指定为(无,无,通道),这将使模型知道该维度中的元素数量不是恒定的(就像批处理训练一样)。 答案似乎有些混乱,但总之,您必须执行以下操作:

  1. 将Flatten更改为GlobalMaxPool2D
  2. 将输入形状更改为(“无”,“无”,“通道”)-根据图像尺寸和通道数重复“无”。

答案 2 :(得分:1)

您只需将输入形状更改为(None, None)即可。确认为什么会这样:卷积层正在学习过滤器的参数,该过滤器的形状完全独立于输入矩阵的形状。但是,必须确保在不同形状的图像上训练模型,否则,学习的权重不能很好地推广到其他输入形状。通常,仅放大低分辨率图像是不够的。您需要各种形状的实际数据。但是,我认为缩小高分辨率数据应该可以正常工作。

答案 3 :(得分:-1)

这是不可能的。如果您添加一个简单的感知器,则必须使用权重对其进行初始化,并且它是完全随机的。实际上,您不能做您打算做的事情。因此,在将其发送到模型之前,应先调整其大小。