【问题标题】:Length for attr 'output_shapes' of 0 must be at least minimum 1attr 'output_shapes' 的长度为 0 必须至少为 1
【发布时间】:2021-03-25 03:48:18
【问题描述】:

每当我尝试将字符串列表转换为 tf.Dataset 对象时,它都会向我输出此错误。

tensorflow.python.framework.errors_impl.InvalidArgumentError: Length for attr 'output_shapes' of 0 must be at least minimum 1
    ; NodeDef: {{node ParallelMapDatasetV2}}; Op<name=ParallelMapDatasetV2; signature=input_dataset:variant, other_arguments:, num_parallel_calls:int64 -> handle:variant; attr=f:func; attr=Targuments:list(type),min=0; attr=output_types:list(type),min=1; attr=output_shapes:list(shape),min=1; attr=use_inter_op_parallelism:bool,default=true; attr=deterministic:string,default="default"; attr=preserve_cardinality:bool,default=false> [Op:ParallelMapDatasetV2]

代码是:

just_train_filenames = tf.ragged.constant([batch[0] for batch in train_list])

tf_train_ds = tf.data.Dataset.from_generator(
    lambda: just_train_filenames,
    output_signature=(tf.Tensor(shape=(1, None), tf.string))
)

【问题讨论】:

    标签: python tensorflow machine-learning


    【解决方案1】:

    Dataset.map 函数也有同样的问题。 你的 lambda 函数需要有一个返回值。

    output_shapes 是本例中 lambda 函数的 output_shape,为 0,因为该函数没有返回值。

    在 from_generator 的情况下,lambda 需要返回一个具有迭代器的对象。

    来自 tensorflow 文档:https://www.tensorflow.org/api_docs/python/tf/data/Dataset#from_generator

    生成器参数必须是返回支持 iter() 协议的对象(例如生成器函数)的可调用对象。

    生成器生成的元素必须与给定的任一兼容 output_signature 参数或给定的 output_types 和(可选) output_shapes 参数,以指定者为准。

    【讨论】:

    • 感谢您的回答@ariel6653!所以我可以使用类似generator = (filename for filename in filenames_train_list) 然后files_ds = tf.data.Dataset.from_generator( lambda: generator, output_signature=( tf.TensorSpec(shape=(2,), dtype=tf.string) )) 的东西?
    • 我之前错过了,但应该是 generator = [filenames_train_list 中文件名的文件名]
    • 感谢尝试,还是不行:/
    猜你喜欢
    • 2022-08-21
    • 1970-01-01
    • 2021-10-12
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多