输入 0 与层 conv2d_2 不兼容:预期 ndim=4,发现 ndim=3 我在张量流中收到此错误,这是什么意思,我该如何解决?

数据挖掘 张量流 美国有线电视新闻网
2021-09-23 01:39:53
import pickle 


import keras

from keras.models import Sequential

from keras.layers import Dense, Dropout, Flatten, Activation

from keras.layers import Conv2D, MaxPooling2D

from keras.utils import to_categorical

import numpy as np

X = pickle.load(open('cancer_image_features.pickle','rb'))

y = pickle.load(open('cancer_image_lables.pickle','rb'))


X = X/255.0

y = to_categorical(y)

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=X.shape[1:]))

model.add(Conv2D(64, (3, 3), activation='relu'))

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, kernel_size=(3, 3),activation='relu'))

model.add(Conv2D(64, (3, 3), activation='relu'))

model.add(MaxPooling2D(pool_size=(2, 2)))



model.add(Activation("softmax"))          
model.add (Flatten())

model.add(Dense(3))

model.compile ( loss = 'binary_crossentropy', optimizer = 'adam' , metrics = ['accuracy'])

model.fit(X,y, batch_size = 512, epochs = 10,  validation_split= 0.3)
2个回答

错误很可能来自这一行:

model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=X.shape[1:]))

Input_shape 应该是 4dim 向量,如 keras 文档中所述:

输入形状

具有形状的 4D 张量: (batch, channels, rows, cols) 如果 data_format 是 "channels_first" 或具有形状的 4D 张量: (batch, rows, cols, channels) 如果 data_format 是 "channels_last"。

您可能必须重塑您的数据,如此处所述: https ://stackoverflow.com/q/43895750/8119313

X.shape我猜这里类似于 mnist 数据,(60000, 28, 28)意味着它没有额外的维度或说 24 位表示,即一些颜色字节。因此,each x in X具有 2D 形状,因此,X.shape[1:] -eq x.shape -eq (28, 28)您必须显式重塑 X 以包含Conv2D图层所需的额外尺寸。

根据代码,您似乎想使用“channel_last”配置,X_train 和 X_test 的重塑可能如下所示:

X = X.reshape(list(X.shape) + [1])    # (60000, 28, 28, 1)

对于“channel_first”,它将是:

X = X.reshape([X.shape[0], [1]] + list(X.shape[1:]))    # (60000, 1, 28, 28)

希望对读者有所帮助。