INVALID_ARGUMENT:预期维度在 [0, 0) 范围内,但得到 0 [[{{node ArgMax}}]] [[IteratorGetNext]]

问题描述 投票:0回答:0

我面临一个问题,即使用我自己的本地目录中的自己的数据(jpeg 图像)提要,在运行模型时出现此错误。

 (0) INVALID_ARGUMENT: Expected dimension in the range [0, 0), but got 0
     [[{{node ArgMax}}]]
     [[IteratorGetNext]]
     [[IteratorGetNext/_1965]]
  (1) INVALID_ARGUMENT: Expected dimension in the range [0, 0), but got 0
     [[{{node ArgMax}}]]
     [[IteratorGetNext]]

但是,如果我使用 tensorflow_datasets 作为输入来运行它,我能够让它运行起来完全没有问题。

我想知道这背后的原因是什么?

背景是,我正在 HPC 系统上运行它。

代码片段:

来自我自己的函数的输入函数:

    list_ds = tf.data.Dataset.list_files(str(data_dir+'/*/*'), shuffle=False)
    class_names = np.array(sorted([item.split('/')[-1] for item in glob.glob(data_dir + '/*')]))

    val_size = int(image_count * 0.2)

    def get_label(file_path):
        # Convert the path to a list of path components
        parts = tf.strings.split(file_path, os.path.sep)
        one_hot = parts[-2] == class_names
        one_hot=tf.cast(one_hot, tf.int32)
        return tf.argmax(one_hot)
        # return one_hot
         
    def decode_img(img):
        # Convert the compressed string to a 3D uint8 tensor
        img = tf.io.decode_jpeg(img, channels=3)
        img = tf.cast(img, tf.float32)
        img = (img/127.5) - 1
        # img = tf.keras.applications.mobilenet.preprocess_input(img)
        # Resize the image to the desired size
        return tf.image.resize(img, [image_param['img_height'], image_param["img_width"]])

    def process_path(file_path):
        label = get_label(file_path)
        # Load the raw data from the file as a string
        img = tf.io.read_file(file_path)
        img = decode_img(img)
        return img, label

    ds = ds.map(
        process_path, 
        # num_parallel_calls=num_parallel_calls
        # if num_parallel_calls > 0
        # else tf.data.experimental.AUTOTUNE,
        )
    ds = ds.batch(32, drop_remainder=True)
    ds = ds.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
    ds = ds.cache()
    return ds

使用TFDS的输入函数:

IMG_SIZE = 160  # All images will be resized to 160x160

def preprocess(image, label):
  image = tf.cast(image, tf.float32)
  image = (image/127.5) - 1
  image = tf.image.resize(image, (IMG_SIZE, IMG_SIZE))
  return image, label

def train_input_fn(batch_size):
  # data = tfds.load('cats_vs_dogs', as_supervised=True)
  data = tfds.load('stanford_dogs', 
                 as_supervised=True,
                 data_dir='dog_breed')
  train_data = data['train']
  train_data = train_data.map(preprocess).shuffle(500).batch(batch_size)
  return train_data

模型函数:

keras_mobilenet_v2 = tf.keras.applications.MobileNetV2(
    input_shape=(160, 160, 3), include_top=False)
keras_mobilenet_v2.trainable = False

estimator_model = tf.keras.Sequential([
    keras_mobilenet_v2,
    tf.keras.layers.GlobalAveragePooling2D(),
    tf.keras.layers.Dense(1)
])

# Compile the model
estimator_model.compile(
    optimizer=tf.keras.optimizers.legacy.Adam(),
    loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
    metrics=['accuracy'])

est_mobilenet_v2 = tf.keras.estimator.model_to_estimator(keras_model=estimator_model)

python tensorflow keras image-processing tensorflow-estimator
© www.soinside.com 2019 - 2024. All rights reserved.