Python 使用model.fit with dataset作为类似超分辨率模型的输入时出错

Python 使用model.fit with dataset作为类似超分辨率模型的输入时出错,python,tensorflow,Python,Tensorflow,我有下面的TF2.30代码。该模型与图像超分辨率相似。我有两个用于培训的数据集作为输入,分别用于验证。我想使用model.fit处理这些数据集 import tensorflow as tf from tensorflow.keras.layers import Input, Conv2D, Add, Activation from tensorflow.keras.models import Model from tensorflow.keras import optimizers impor

我有下面的TF2.30代码。该模型与图像超分辨率相似。我有两个用于培训的数据集作为输入,分别用于验证。我想使用model.fit处理这些数据集

import tensorflow as tf
from tensorflow.keras.layers import Input, Conv2D, Add, Activation
from tensorflow.keras.models import Model
from tensorflow.keras import optimizers
import pathlib


def build_model():
    input_img = Input(shape=(48, 48, 1))
    model = Conv2D(64, (3, 3), padding='same', kernel_initializer='he_normal', activation='relu')(input_img)

    model = Conv2D(64, (3, 3), padding='same', kernel_initializer='he_normal', activation='relu')(model)
    model = Conv2D(64, (3, 3), padding='same', kernel_initializer='he_normal', activation='relu')(model)
    model = Conv2D(1, (3, 3), padding='same', kernel_initializer='he_normal')(model)
    res_img = model

    output_img = Add()([res_img, input_img])
    model = Model(inputs=input_img, outputs=output_img)
    return model


def load_image(image_path):
    image = tf.io.read_file(image_path)
    image = tf.io.decode_png(image, channels=1)
    image = tf.image.convert_image_dtype(image, dtype=tf.float32)
    image -= 0.5
    image /= 0.5

    return image

def configure_for_performance(ds, batch_size):
  ds = ds.cache()
  ds = ds.shuffle(buffer_size=1000)
  ds = ds.batch(batch_size)
  ds = ds.prefetch(buffer_size=AUTOTUNE)
  return ds


if __name__ == '__main__':

    config = tf.compat.v1.ConfigProto(gpu_options= tf.compat.v1.GPUOptions(per_process_gpu_memory_fraction=0.8))
    config.gpu_options.allow_growth = True
    session = tf.compat.v1.Session(config=config)
    tf.compat.v1.keras.backend.set_session(session)
    print('start training...')
    BATCH_SIZE = 64

    model = build_model()
    adam = optimizers.Adam(lr=1e-2)
    model.compile(adam, loss='mse')
    model.summary()

    print('start training....')

    data_orig =  tf.data.Dataset.list_files(str('C:\\SRColor2\\data\\div2k\\train\\orig\\*.png'), shuffle=False)
    data_pred = tf.data.Dataset.list_files(str('C:\\SRColor2\\data\\div2k\\train\\pred\\*.png'), shuffle=False)
    valid_orig = tf.data.Dataset.list_files(str('C:\\SRColor2\\data\\div2k\\valid\\orig\\*.png'), shuffle=False)
    valid_pred = tf.data.Dataset.list_files(str('C:\\SRColor2\\data\\div2k\\valid\\pred\\*.png'), shuffle=False)

    AUTOTUNE = tf.data.experimental.AUTOTUNE

    # Set `num_parallel_calls` so multiple images are loaded/processed in parallel.
    data_orig = data_orig.map(load_image, num_parallel_calls=AUTOTUNE)
    data_pred = data_pred.map(load_image, num_parallel_calls=AUTOTUNE)
    valid_orig = valid_orig.map(load_image, num_parallel_calls=AUTOTUNE)
    valid_pred = valid_pred.map(load_image, num_parallel_calls=AUTOTUNE)

    data_orig = configure_for_performance(data_orig, 64)
    data_pred = configure_for_performance(data_pred, 64)
    valid_orig = configure_for_performance(valid_orig, 64)
    valid_pred = configure_for_performance(valid_pred, 64)

    model.fit((data_pred, data_orig),
              epochs=40,
              batch_size=64,
              validation_data=(valid_pred, valid_orig))
    print('end training')

    print('training ended')
运行代码时出现以下错误:ValueError:
y
将数据集用作输入时不支持参数

  • 运行代码需要什么解决方案
  • 在我的例子中,我为每个图像生成了大小为48x48像素的补丁。图像分辨率高。如果要生成分辨率为(X,Y)的图像 (X//48)X(Y//8)块大小为$48x48$像素,那么数据集大小可以动态增加吗

  • 错误消息说明了一切。您可以尝试压缩数据集:

    data_orig = data_orig.map(load_image, num_parallel_calls=AUTOTUNE)
    data_pred = data_pred.map(load_image, num_parallel_calls=AUTOTUNE)
    
    data_ds = tf.data.Dataset.zip((data_orig, data_pred))
    
    data_ds = configure_for_performance(data_ds, 64)
    

    错误消息说明了一切。您可以尝试压缩数据集:

    data_orig = data_orig.map(load_image, num_parallel_calls=AUTOTUNE)
    data_pred = data_pred.map(load_image, num_parallel_calls=AUTOTUNE)
    
    data_ds = tf.data.Dataset.zip((data_orig, data_pred))
    
    data_ds = configure_for_performance(data_ds, 64)
    

    谢谢你的支持。另外,在做了必要的更改后,我发现运行时间比使用两个NumPy数组时要长。如何配置数据集以获得更高的性能?建议的解决方案有效。我说过,当使用从目录中读取文件的dataset变量时,运行时间会增加。我有什么解决方案来减少执行时间?我观察到,当所有数据都以numpy数组的形式加载到RAM内存中时,执行时间会缩短。你说在哪里?如果解决方案有效,就要接受它的投票。我唯一看到的提高速度的方法就是减少洗牌缓冲区的大小。谢谢你的支持。另外,在做了必要的更改后,我发现运行时间比使用两个NumPy数组时要长。如何配置数据集以获得更高的性能?建议的解决方案有效。我说过,当使用从目录中读取文件的dataset变量时,运行时间会增加。我有什么解决方案来减少执行时间?我观察到,当所有数据都以numpy数组的形式加载到RAM内存中时,执行时间会缩短。你说在哪里?如果解决方案有效,就要接受它的投票。我所看到的提高速度的唯一方法就是减少洗牌缓冲区的大小。