Input 0 of layer conv2d is incompatible with the layer: expected ndim=4, found ndim=2. Full shape r

转载: https://msd.misuland.com/pd/4146263742822220136

  • fashion数据集一共7万张28*28像素点的灰度值图片,其中6万张用于训练,1万张用于测试。一共10个分类,分别是T恤、裤子、靴子······
  • cifar10数据集一共6万张32*32像素点的红绿蓝三通道彩色图片,其中5万张用于训练,1万张用于测试。一共是10分类,分别是airplane、automobile、bird······

看下来两个数据集的主要区别在于一个是单通道的灰度值图片,一个是三通道的彩色图片。但是这个区别和报的错误有什么关系吗?作为小白,我们再认真看看报的错误,直白地理解下来,大概是说conv2d层(也就是卷积层)的输入和这一层不兼容,期望的维度是4,实际给的是3。

可是还是不太清楚和报的错误有什么关系? 我们看看fashion数据集的维度,采用如下命令,运行后结果是x_train.shpae (60000, 28, 28),发现是3个维度的

fashion = tf.keras.datasets.fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion.load_data()
print("x_train.shpae", x_train.shape)

再运行如下命令,来看看cifar10数据集的维度,运行后的结果是x_train.shpae (50000, 32, 32, 3),发现这个数据集是4个维度的。到这里似乎知道为什么同样的模型用于cifar10数据集训练不会报错,但是用于fashion数据集就会报错,原来两个数据集看似区别不大,但是维度却实实实在在的不一样。

cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print("x_train.shpae", x_train.shape)

到这里,我猜测卷积对于输入的维度是不是有要求的呢,3个维度的是不是不行呢?经过查询资料,发现确实如此。卷积计算要求输入的图片必须是4个维度的,第0个维度表示一次喂入几个batch,第1、2、3个维度分别表示输入图片的分辨率和通道数。这一部分详细且简单明了的解释可以参考下面的链接: 理解卷积网络的输入与输出形状(Keras实现)

现在情况越来越明朗,已经清楚知道错误的原因了:fashion数据集是3维的,不符合卷积的输入要求(4维),所以报Input 0 of layer conv2d is incompatible with the layer: expected ndim=4, found ndim=3. Full shape received: [None, 28, 28]。那怎么把fashion数据集变成4维的呢? 采用如下命令将3维的输入扩展维4维的输入,该命令简单明了的解释可以参考下方链接:

x_train = np.expand_dims(x_train, axis=3)
x_test = np.expand_dims(x_test, axis=3)

TensorFlow笔记–用expand_dim()来增加维度

 

你可能感兴趣的:(tensorflow_2.0,tensorflow)