由于形状错误,Keras fit_generator()无法工作
我正在使用Keras和tensorflow后端运行MNIST预测。 我使用Keras fit作为批处理运行代码 然而,当我尝试使用fit_generator实现类似的代码时,我得到了一个错误。 代码如下:由于形状错误,Keras fit_generator()无法工作,keras,Keras,我正在使用Keras和tensorflow后端运行MNIST预测。 我使用Keras fit作为批处理运行代码 然而,当我尝试使用fit_generator实现类似的代码时,我得到了一个错误。 代码如下: (X_train, y_train), (X_test, y_test) = mnist.load_data() # separate data into train and validation from sklearn.model_selection import train_test_s
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# separate data into train and validation
from sklearn.model_selection import train_test_split
# Split the data
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=0.15, shuffle= True)
# number of training samples
N1 = X_train.shape[0] # training size
N2 = X_test.shape[0] # test size
N3 = X_valid.shape[0] # valid size
h = X_train.shape[1]
w = X_train.shape[2]
num_pixels = h*w
y_train = np_utils.to_categorical(y_train)
y_valid = np_utils.to_categorical(y_valid)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
def baseline_model():
# create model
model = Sequential()
model.add(Dense(num_pixels, input_dim=num_pixels, kernel_initializer='normal', activation='relu'))
model.add(Dense(num_classes, kernel_initializer='normal', activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
model = baseline_model()
batch_size = 200
epochs = 20
steps_per_epoch_tr = int(N1/ batch_size) # 51000/200
steps_per_epoch_val = int(N3/batch_size)
# reshape to be [samples][width][height][ channel] for ImageData Gnerator->datagen.flow
x_t = X_train.reshape(N1, w, h, 1).astype('float32')
x_v = X_valid.reshape(N3, w, h, 1).astype('float32')
# define data preparation
datagen = ImageDataGenerator(rescale=1./255) # scales x_t/x_v
train_gen = datagen.flow(x_t, y_train, batch_size=batch_size)
valid_gen = datagen.flow(x_v,y_valid, batch_size=batch_size)
model.fit_generator(train_gen,steps_per_epoch = steps_per_epoch_tr,validation_data = valid_gen,
validation_steps = steps_per_epoch_val,epochs=epochs)
这会产生一个错误:
这是由于预期的图像尺寸错误,但我不确定在哪里/如何修复此问题。非常感谢您的帮助。
谢谢
sedy在model.fit案例中,这行在输入用于训练之前将输入展平 x_batch=np.ex_batch,[-1,num_像素] 但在发电机的情况下,在将输入馈送到致密层之前,没有任何东西可以将其展平。密集层无法处理二维输入28 x 28。在模型中添加一个展平层应该可以实现如下所示的效果
def baseline_model():
# create model
model = Sequential()
model.add(Flatten(input_shape=(28,28,1)))
model.add(Dense(num_pixels, input_dim=num_pixels, kernel_initializer='normal', activation='relu'))
model.add(Dense(num_classes, kernel_initializer='normal', activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
谢谢,在看到你的评论之前,我已经在顶部添加了model.flatte,就像我们通常在conv2d->RELU->MAxpool操作结束时所做的那样,但是忘记了指定输入形状,因为它是第一层,所以必须指定输入形状,并且不断出现奇怪的错误。你的评论使我意识到我的错误,这是我本来就不应该犯的。另外,方法1和方法2之间是否存在预期的性能差异?我同意错误没有帮助,这类似于模型未编译。使用fit_generator有一个多处理选项。为了提高效率,发电机与模型并联运行。例如,这允许您在CPU上对图像进行实时数据增强,同时在GPU上对模型进行训练。
def baseline_model():
# create model
model = Sequential()
model.add(Flatten(input_shape=(28,28,1)))
model.add(Dense(num_pixels, input_dim=num_pixels, kernel_initializer='normal', activation='relu'))
model.add(Dense(num_classes, kernel_initializer='normal', activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model