由于形状错误,Keras 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

我正在使用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_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