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)
输入 0 与层 conv2d_2 不兼容:预期 ndim=4,发现 ndim=3 我在张量流中收到此错误,这是什么意思,我该如何解决?
数据挖掘
张量流
美国有线电视新闻网
2021-09-23 01:39:53
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)
希望对读者有所帮助。
其它你可能感兴趣的问题