Python 如何预处理keras.VGG19的图像?

Python 如何预处理keras.VGG19的图像?,python,tensorflow,keras,tf.keras,Python,Tensorflow,Keras,Tf.keras,我试图在RGB图像上训练keras VGG-19模型,当尝试前馈时,出现以下错误: ValueError: Input 0 of layer block1_conv1 is incompatible with the layer: expected ndim=4, found ndim=3. Full shape received: [224, 224, 3] 当将图像重塑为224、224、3、1以包括批次dim,然后如代码所示向前馈送时,会发生以下错误: ValueError: Dimens

我试图在RGB图像上训练keras VGG-19模型,当尝试前馈时,出现以下错误:

ValueError: Input 0 of layer block1_conv1 is incompatible with the layer: expected ndim=4, found ndim=3. Full shape received: [224, 224, 3]
当将图像重塑为224、224、3、1以包括批次dim,然后如代码所示向前馈送时,会发生以下错误:

ValueError: Dimensions must be equal, but are 1 and 3 for '{{node BiasAdd}} = BiasAdd[T=DT_FLOAT, data_format="NHWC"](strided_slice, Const)' with input shapes: [64,224,224,1], [3]
vgg初始化为:

vgg = tf.keras.applications.VGG19(
                            include_top=True,
                            weights=None,
                            input_tensor=None,
                            input_shape=[224, 224, 3],
                            pooling=None,
                            classes=1000,
                            classifier_activation="softmax"
                        )
培训职能:

@tf.function
def train_step(idx, sample, label):
  with tf.GradientTape() as tape:
    # preprocess for vgg-19
    sample = tf.image.resize(sample, (224, 224))
    sample = tf.keras.applications.vgg19.preprocess_input(sample * 255)

    predictions = vgg(sample, training=True)
    # mean squared error in prediction
    loss = tf.keras.losses.MSE(label, predictions)

  # apply gradients
  gradients = tape.gradient(loss, vgg.trainable_variables)
  optimizer.apply_gradients(zip(gradients, vgg.trainable_variables))

  # update metrics
  train_loss(loss)
  train_accuracy(vgg, predictions)

我想知道输入应该如何格式化,以便keras VGG-19实现能够接受它?

您必须取消一维排序,才能将形状转换为[1,224,224,3':


当将图像重塑为224、224、3、1以包括批次尺寸时,图像批次使用了错误的尺寸-这应该是x、224、224、3,其中x是批次中图像的数量

@tf.function
def train_step(idx, sample, label):
  with tf.GradientTape() as tape:
    # preprocess for vgg-19
    sample = tf.image.resize(sample, (224, 224))
    sample = tf.keras.applications.vgg19.preprocess_input(sample * 255)

    predictions = vgg(sample, training=True)
    # mean squared error in prediction
    loss = tf.keras.losses.MSE(label, predictions)

  # apply gradients
  gradients = tape.gradient(loss, vgg.trainable_variables)
  optimizer.apply_gradients(zip(gradients, vgg.trainable_variables))

  # update metrics
  train_loss(loss)
  train_accuracy(vgg, predictions)
for idx in tqdm(range(train_data.get_ds_size() // batch_size)):
    # train step
    batch = train_data.get_train_batch()
    for sample, label in zip(batch[0], batch[1]):
        sample = tf.reshape(sample, [1, *sample.shape])  # added the 1 here
        label = tf.reshape(label, [*label.shape, 1])
        train_step(idx, sample, label)