回溯:
ValueError: 层sequential的输入0与层不兼容:期望输入形状的轴-1的值为1,但接收到的输入形状为(None, 1, 300, 300)
import tensorflow as tffrom keras.models import Sequentialfrom keras.layers.core import Dense, Dropout, Activation, Flattenfrom keras.layers.convolutional import Convolution2D, MaxPooling2Dfrom keras.layers import Conv2D, MaxPool2Dfrom keras.optimizers import SGD,RMSprop,Adamfrom keras.utils import np_utilsimport numpy as npimport matplotlib.pyplot as pltimport matplotlibimport osimport theanofrom PIL import Imagefrom numpy import *from sklearn.utils import shufflefrom sklearn.model_selection import train_test_splitimg_rows, img_cols = 300, 300img_channels = 1path1 = "./images"path2 = "./resize"listing = os.listdir(path1)listing2 = list(listing)num_samples=size(listing)for i in range(len(listing)): if "jpg" in listing[i]: im = Image.open(path1 + '/' + listing[i]) img = im.resize((img_rows,img_cols)) gray = img.convert('L') gray.save(path2 +'/' + listing[i], "JPEG") elif "txt" in listing[i]: listing2.remove(listing[i])imlist = os.listdir(path2)im1 = array(Image.open(path2 + '/'+ imlist[0]))m,n = im1.shape[0:2]imnbr = len(imlist)immatrix = array([array(Image.open(path2 + '/'+ im2)).flatten() for im2 in imlist],'f') label=np.ones((num_samples,),dtype = int)label[0:1260]=0label[1260:2716]=1label[2716:]=2data,Label = shuffle(immatrix,label, random_state=2)train_data = [data,Label]img=immatrix[167].reshape(img_rows,img_cols)plt.imshow(img)plt.imshow(img,cmap='gray')print (train_data[0].shape)print (train_data[1].shape)batch_size = 32classes = 3epochs = 20filters = 32pool = 2conv = 3(X, y) = (train_data[0],train_data[1])X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=4)X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)X_train = X_train.astype('float32')X_test = X_test.astype('float32')X_train /= 255X_test /= 255print('X_train shape:', X_train.shape)print(X_train.shape[0], 'train samples')print(X_test.shape[0], 'test samples')Y_train = np_utils.to_categorical(y_train, classes)Y_test = np_utils.to_categorical(y_test, classes)i = 256plt.imshow(X_train[i, 0], interpolation='nearest')print("label : ", Y_train[i,:])model = Sequential()model.add(Convolution2D(filters, conv, conv, padding = 'valid', input_shape = (img_rows, img_cols, 1), data_format = "channels_last"))model.add(Activation('relu'))model.add(Convolution2D(filters, conv, conv, padding = 'valid'))model.add(Activation('relu'))model.add(Convolution2D(filters, conv, conv, padding = 'valid'))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size = (pool, pool), strides = pool, padding = "valid"))model.add(Dropout(0.5))model.add(Flatten())model.add(Dense(512))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(classes))model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=['accuracy'])print(model.summary())hist = model.fit(X_train, Y_train, batch_size = batch_size, epochs = epochs, verbose=1, validation_data=(X_test, Y_test))
我尝试了各种方法,例如ValueError: 层sequential的输入0与层不兼容:期望输入形状的轴-1的值为1,但我仍然面临同样的错误。请问有人有解决方案吗?
我知道问题出在这一行
model.add(Convolution2D(filters, conv, conv, padding = 'valid', input_shape = (img_rows, img_cols, 1), data_format = "channels_last"))
但我不太确定如何修复它。
谢谢!
回答:
这实际上是一个相当描述性/准确的错误消息。你提供的输入形状是(batch, img_rows, img_cols, 1),但它显然看到的图像形状是(batch, 1, 300, 300)。所以看起来你只是设置了一个维度错误。只要做类似于
train_data = tf.transpose(train_data, [0, 2, 3, 1])
你应该就可以解决问题了