tensorflow.keras 拟合期间 - 参数无效 输入重塑是一个具有 983040 个值的张量,但请求的形状具有 1966080

tensorflow.keras during fit - Invalid argument Input to reshape is a tensor with 983040 values, but the requested shape has 1966080

当我适合 tensorflow.keras.Model,如:

时,如何解决我遇到的这个错误
history_model_2 = model.fit(train_data.next_batch(),
                            validation_data=validation_data.next_batch(),
                            epochs=32)

这是我得到的错误:

InvalidArgumentError: 2 root error(s) found.
  (0) Invalid argument:  Input to reshape is a tensor with 983040 values, but the requested shape has 1966080
     [[node model_2/reshape/Reshape (defined at <ipython-input-82-15c7d8d22e71>:10) ]]
     [[model_2/ctc/Cast_3/_90]]
  (1) Invalid argument:  Input to reshape is a tensor with 983040 values, but the requested shape has 1966080
     [[node model_2/reshape/Reshape (defined at <ipython-input-82-15c7d8d22e71>:10) ]]
0 successful operations.
0 derived errors ignored. [Op:__inference_train_function_33412]

Function call stack:
train_function -> train_function

{{ 在我的 model.fit() 中,train_data.next_batch() 是一个为 xy 参数生成数据的生成器(我用过这个因为 model.fit_generator is being deprecated and this generator and almost complete code is partially inspired from this example from keras ocr examples on GitHub,我也从中使用了如下所示的 ctc 损失函数。)}}

这是我的完整模型:

from tensorflow.keras import layers
from tensorflow.keras import Model
from tensorflow.keras import backend as tf_keras_backend

def ctc_lambda_func(args):
    y_pred, labels, input_length, label_length = args
    # the 2 is critical here, since the first couple outputs of the RNN tend to be garbage:
    y_pred = y_pred[:, 2:, :]
    return tf_keras_backend.ctc_batch_cost(labels, y_pred, input_length, label_length)

# Make Network
input_data = layers.Input(name='the_input', shape=(128, 64, 1), dtype='float32')  # (None, 128, 64, 1)

# Convolution layer (VGG)
inner = layers.Conv2D(64, (3, 3), padding='same', name='conv1', kernel_initializer='he_normal', activation='relu')(input_data)  # (None, 128, 64, 64)
inner = layers.BatchNormalization()(inner)
inner = layers.Activation('relu')(inner)
inner = layers.MaxPooling2D(pool_size=(2, 2), name='max1')(inner)  # (None,64, 32, 64)

inner = layers.Conv2D(128, (3, 3), padding='same', name='conv2', kernel_initializer='he_normal', activation='relu')(inner)  # (None, 64, 32, 128)
inner = layers.BatchNormalization()(inner)
inner = layers.Activation('relu')(inner)
inner = layers.MaxPooling2D(pool_size=(2, 2), name='max2')(inner)  # (None, 32, 16, 128)

inner = layers.Conv2D(256, (3, 3), padding='same', name='conv3', kernel_initializer='he_normal', activation='relu')(inner)  # (None, 32, 16, 256)
inner = layers.BatchNormalization()(inner)
inner = layers.Activation('relu')(inner)
inner = layers.Conv2D(256, (3, 3), padding='same', name='conv4', kernel_initializer='he_normal', activation='relu')(inner)  # (None, 32, 16, 256)
inner = layers.BatchNormalization()(inner)
inner = layers.Activation('relu')(inner)
inner = layers.MaxPooling2D(pool_size=(1, 2), name='max3')(inner)  # (None, 32, 8, 256)

inner = layers.Conv2D(512, (3, 3), padding='same', name='conv5', kernel_initializer='he_normal', activation='relu')(inner)  # (None, 32, 8, 512)
inner = layers.BatchNormalization()(inner)
inner = layers.Activation('relu')(inner)
inner = layers.Conv2D(512, (3, 3), padding='same', name='conv6', activation='relu')(inner)  # (None, 32, 8, 512)
inner = layers.BatchNormalization()(inner)
inner = layers.Activation('relu')(inner)
inner = layers.MaxPooling2D(pool_size=(1, 2), name='max4')(inner)  # (None, 32, 4, 512)

inner = layers.Conv2D(512, (2, 2), padding='same', kernel_initializer='he_normal', name='con7', activation='relu')(inner)  # (None, 32, 4, 512)
before_reshape = layers.BatchNormalization()(inner)
inner = layers.Activation('relu')(inner)

# CNN to RNN
reshape_op = layers.Reshape(target_shape=((32, 2048)), name='reshape')(before_reshape)  # (None, 32, 2048)
dense_after_reshape = layers.Dense(64, activation='relu', kernel_initializer='he_normal', name='dense1')(reshape_op)  # (None, 32, 64)

# RNN layer
gru_1 = layers.GRU(256, return_sequences=True, kernel_initializer='he_normal', name='gru1')(dense_after_reshape)  # (None, 32, 512)
gru_1b = layers.GRU(256, return_sequences=True, go_backwards=True, kernel_initializer='he_normal', name='gru1_b')(dense_after_reshape)
reversed_gru_1b = layers.Lambda(lambda inputTensor: tf_keras_backend.reverse(inputTensor, axes=1)) (gru_1b)

gru1_merged = layers.add([gru_1, reversed_gru_1b])  # (None, 32, 512)
gru1_merged = layers.BatchNormalization()(gru1_merged)

gru_2 = layers.GRU(256, return_sequences=True, kernel_initializer='he_normal', name='gru2')(gru1_merged)
gru_2b = layers.GRU(256, return_sequences=True, go_backwards=True, kernel_initializer='he_normal', name='gru2_b')(gru1_merged)
reversed_gru_2b= layers.Lambda(lambda inputTensor: tf_keras_backend.reverse(inputTensor, axes=1)) (gru_2b)

gru2_merged = layers.concatenate([gru_2, reversed_gru_2b])  # (None, 32, 1024)
gru2_merged = layers.BatchNormalization()(gru2_merged)

# transforms RNN output to character activations:
y_pred = layers.Dense(num_classes, kernel_initializer='he_normal',name='dense2', activation='softmax')(gru2_merged) #(None, 32, 80)
y_pred = layers.Activation('softmax', name='softmax')(inner)

labels = layers.Input(name='the_labels', shape=[16], dtype='float32')
input_length = layers.Input(name='input_length', shape=[1], dtype='int64')
label_length = layers.Input(name='label_length', shape=[1], dtype='int64')

# loss function
loss_out = layers.Lambda(ctc_lambda_func, output_shape=(1,), name='ctc')(
    [y_pred, labels, input_length, label_length]
)

model = Model(inputs=[input_data, labels, input_length, label_length], outputs=loss_out)

编译它:

model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer = 'adam')

我也尝试过通过多种方式调试确保尺寸正确,但无济于事。

我该如何解决这个问题?或者我做错了什么导致了这个错误?

编辑 1: 这是模型摘要:
我的批量大小是 64。

我为预处理图像准备的生成器出现错误。它产生了 64,64 而不是 128,64 的图像。我很遗憾没有检查它。