我的代码中每一层都显示期望一个数组形状,但接收到的却是与输入数组维度相同的形状
我在第一个最大池化层之后添加了注释,以提示错误。如果你查看错误,会发现它期望的是(16, 64, 64, 64),但接收到的却是(16, 128, 128, 1),这恰好是我的输入数组形状。
model = Sequential()model.add(Conv3D(64,3,activation= 'relu',padding='same',input_shape=(16, 128, 128 ,1)))model.add(MaxPooling3D(pool_size=(1,2,2),strides= (1, 2, 2)))#model.add(Conv3D(128,3,activation= 'relu',padding="same"))#model.add(MaxPooling3D(pool_size=(2,2,2),strides= (2, 2, 2)))#model.add(Conv3D(256,3,activation= 'relu',padding="same"))#model.add(Conv3D(256,3,activation= 'relu',padding="same"))#model.add(MaxPooling3D(pool_size=(2,2,2),strides= (2, 2, 2)))#model.add(Conv3D(512,3,activation= 'relu',padding="same"))#model.add(Conv3D(512,3,activation= 'relu',padding="same"))#model.add(MaxPooling3D(pool_size=(2,2,2),strides= (2, 2, 2)))#model.add(Conv3D(512,3,activation= 'relu',padding="same"))#model.add(Conv3D(512,3,activation= 'relu',padding="same"))#model.add(MaxPooling3D(pool_size=(2,2,2),strides= (2, 2, 2)))#model.add(Dense(output_dim= 4096,activation= 'linear' ))#model.add(Dense(output_dim= 4096,activation= 'softmax' ))
我接收到的错误是
str(data_shape))
ValueError: 检查目标时出错:期望max_pooling3d_4的形状为(16, 64, 64, 64),但得到的数组形状为(16, 128, 128, 1)
为什么会这样?感谢任何回应。
回答:
问题与输入形状无关,而是与你在训练模型时提供给模型的标签数组的形状有关。错误中明确指出了这一点:
检查目标时出错
这里的“目标”指的是模型的输出。在你的最小示例中,池化层的输出形状为(16, 64, 64, 64)
:
期望max_pooling3d_4的形状为(16, 64, 64, 64)
然而,你提供的输出形状为(16, 128, 128, 1)
:
但得到的数组形状为(16, 128, 128, 1)