Tensorflow tf.dataset、多路径输入和每批加载图像的映射

Tensorflow tf.dataset、多路径输入和每批加载图像的映射,tensorflow,machine-learning,keras,neural-network,tensorflow-datasets,Tensorflow,Machine Learning,Keras,Neural Network,Tensorflow Datasets,我正在加载一个包含多个输入图像的数据集。输入图像路径应仅在批处理时解码,以便处理大型数据集 数据集是N图像路径输入和M浮点输出。每个输入的图像具有不同的分辨率 Data is ([img_input_1.png, img_input_2.png, ...], [0.65, 0.7, 0.8]) 该模型以符号模式使用Keras函数api 这是最近编辑的代码 from itertools import zip_longest def read_image(path, shape): tr

我正在加载一个包含多个输入图像的数据集。输入图像路径应仅在批处理时解码,以便处理大型数据集

数据集是N图像路径输入和M浮点输出。每个输入的图像具有不同的分辨率

Data is ([img_input_1.png, img_input_2.png, ...], [0.65, 0.7, 0.8])
该模型以符号模式使用Keras函数api

这是最近编辑的代码

from itertools import zip_longest

def read_image(path, shape):
    try:
        image = tf.io.read_file(path)
        image = tf.image.decode_png(image)
        image = tf.image.resize(image, [shape[1],shape[2]])
        image /= 255.0
        return image
    except:
        print('ERROR: preprocess_image: bad path', path)    

def load_image(x, y, shp):
    pout = [(k, x[k]) for k in x.keys()]
    l1   = tf.convert_to_tensor(list(x))
    l2   = tf.convert_to_tensor(list(x.values()))

    pl = tf.map_fn(
        lambda args: (read_image(args[0], shp), args[1]), [l1, l2], dtype=(tf.float32, tf.float32)
    )
    pl = {path: (pl[0][i], pl[1][i]) for i, path in enumerate(x)}
    return (pl,y)

def dataset_prep(json_data, seq, batch_size):
    # LOAD DATA FROM JSON
    x,y = json_parse_x_y(json_data[seq])
    xx  = [*zip_longest(*x)] # NOTE: goes from variable sized input to {'input_N':...}
    yy  = [*zip_longest(*y)]

    # GET SHAPES (hard coded atm)
    lns = [[len(xxx)] for xxx in xx]
    rzs = [[24,512,1],[96,512,1]] # TEMP TODO! grab grom [(v['h'],v['w'],v['c']) for v in xx]
    shp = [*zip_longest(*[lns,rzs])]
    shp = [list(s) for s in shp]
    shp = [[*itertools.chain.from_iterable(s)] for s in shp]

    xd  = dict([[ "input_{}".format(i+1),np.array(y)] for i,y in [*enumerate(xx)]])
    yd  = dict([["output_{}".format(i+1),np.array(y)] for i,y in [*enumerate(yy)]])

    ds  = tf.data.Dataset.from_tensor_slices((xd, yd))

    ds  = ds.shuffle(10000)
    ds  = ds.repeat()
    ds  = ds.map(map_func=lambda x,y: load_image(x, y, shp), num_parallel_calls=AUTOTUNE)
    ds  = ds.batch(batch_size) if batch_size else ds 
    ds  = ds.prefetch(AUTOTUNE) 
    return ds
这就是我得到的错误:

Traceback (most recent call last):
    File "/home/me/.local/bin/wavfeat", line 11, in <module>
        load_entry_point('wavfeat==0.1.0', 'console_scripts', 'wavfeat')()
    File "/home/me/.local/lib/python3.6/site-packages/wavfeat/__main__.py", line 91, in main
        analysis_batch_sql(obj)
    File "/home/me/.local/lib/python3.6/site-packages/wavfeat/analysis_run_csv.py", line 50, in analysis_batch_sql
        qy = [*map(lambda c: run_elm(c[0], c[1]), ch)]
    File "/home/me/.local/lib/python3.6/site-packages/wavfeat/analysis_run_csv.py", line 50, in <lambda>
        qy = [*map(lambda c: run_elm(c[0], c[1]), ch)]
    File "/home/me/.local/lib/python3.6/site-packages/wavfeat/analysis_run_csv.py", line 23, in run_elm
        out = fn(input, elm)
    File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_onset.py", line 196, in one_sec_onset_train
        return train(input, elm)
    File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_onset.py", line 182, in train
        ts = dataset_prep(jd, 'train', bc)
    File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_onset.py", line 123, in dataset_prep
        ds  = ds.map(map_func=lambda x,y: load_image(x, y, shp), num_parallel_calls=AUTOTUNE)
    File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 1146, in map
        self, map_func, num_parallel_calls, preserve_cardinality=True)
    File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 3264, in __init__
        use_legacy_function=use_legacy_function)
    File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 2591, in __init__
        self._function = wrapper_fn._get_concrete_function_internal()
    File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1366, in _get_concrete_function_internal
        *args, **kwargs)
    File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1360, in _get_concrete_function_internal_garbage_collected
        graph_function, _, _ = self._maybe_define_function(args, kwargs)
    File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1648, in _maybe_define_function
        graph_function = self._create_graph_function(args, kwargs)
    File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1541, in _create_graph_function
        capture_by_value=self._capture_by_value),
    File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/framework/func_graph.py", line 716, in func_graph_from_py_func
        func_outputs = python_func(*func_args, **func_kwargs)
    File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 2585, in wrapper_fn
        ret = _wrapper_helper(*args)
    File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 2530, in _wrapper_helper
        ret = func(*nested_args)
    File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_onset.py", line 123, in <lambda>
        ds  = ds.map(map_func=lambda x,y: load_image(x, y, shp), num_parallel_calls=AUTOTUNE)
    File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_data_loader.py", line 91, in load_image
        print("x['input_1'].values(): ", x['input_1'].values())
AttributeError: 'Tensor' object has no attribute 'values'
编辑2

尝试最新版本时,出现以下错误

Traceback (most recent call last):
  File "/home/me/.local/bin/wavfeat", line 11, in <module>
    load_entry_point('wavfeat==0.1.0', 'console_scripts', 'wavfeat')()
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/__main__.py", line 91, in main
    analysis_batch_sql(obj)
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/analysis_run_csv.py", line 50, in analysis_batch_sql
    qy = [*map(lambda c: run_elm(c[0], c[1]), ch)]
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/analysis_run_csv.py", line 50, in <lambda>
    qy = [*map(lambda c: run_elm(c[0], c[1]), ch)]
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/analysis_run_csv.py", line 23, in run_elm
    out = fn(input, elm)
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_onset.py", line 216, in one_sec_onset_train
    return train(input, elm)
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_onset.py", line 203, in train
    vs = validation_prep(jd, 'validation', bc)
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_onset.py", line 176, in validation_prep
    ds  = ds.map(map_func=load_and_preprocess_from_path_label, num_parallel_calls=AUTOTUNE)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 1146, in map
    self, map_func, num_parallel_calls, preserve_cardinality=True)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 3264, in __init__
    use_legacy_function=use_legacy_function)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 2591, in __init__
    self._function = wrapper_fn._get_concrete_function_internal()
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1366, in _get_concrete_function_internal
    *args, **kwargs)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1360, in _get_concrete_function_internal_garbage_collected
    graph_function, _, _ = self._maybe_define_function(args, kwargs)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1648, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1541, in _create_graph_function
    capture_by_value=self._capture_by_value),
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/framework/func_graph.py", line 716, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 2585, in wrapper_fn
    ret = _wrapper_helper(*args)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 2530, in _wrapper_helper
    ret = func(*nested_args)
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_data_loader.py", line 47, in load_and_preprocess_from_path_label
    pl   = dict([(pk, tf.map_fn(load_and_preprocess_image, po, dtype=tf.float32)) for pk,po in pout])
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_data_loader.py", line 47, in <listcomp>
    pl   = dict([(pk, tf.map_fn(load_and_preprocess_image, po, dtype=tf.float32)) for pk,po in pout])
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/ops/map_fn.py", line 214, in map_fn
    raise ValueError("elems must be a 1+ dimensional Tensor, not a scalar")
ValueError: elems must be a 1+ dimensional Tensor, not a scalar
回溯(最近一次呼叫最后一次):
文件“/home/me/.local/bin/wavfeat”,第11行,在
加载入口点('wavfeat==0.1.0','console\u scripts','wavfeat')()
文件“/home/me/.local/lib/python3.6/site packages/wavfeat/\uuuuuuu main\uuuuuuuuuu.py”,第91行,在main中
分析\批处理\ sql(obj)
文件“/home/me/.local/lib/python3.6/site packages/wavfeat/analysis\u run\u csv.py”,第50行,在analysis\u batch\u sql中
qy=[*map(lambda c:run_elm(c[0],c[1]),ch)]
文件“/home/me/.local/lib/python3.6/site packages/wavfeat/analysis\u run\u csv.py”,第50行,在
qy=[*map(lambda c:run_elm(c[0],c[1]),ch)]
文件“/home/me/.local/lib/python3.6/site packages/wavfeat/analysis\u run\u csv.py”,第23行,在run\u elm中
输出=fn(输入,elm)
文件“/home/me/.local/lib/python3.6/site packages/wavfeat/one_sec_start.py”,第216行,在one_sec_start_列中
返回列车(输入,elm)
文件“/home/me/.local/lib/python3.6/site packages/wavfeat/one_sec_start.py”,第203行,列车中
vs=验证准备(jd,“验证”,bc)
文件“/home/me/.local/lib/python3.6/site packages/wavfeat/one_sec_start.py”,第176行,在验证准备中
ds=ds.map(map\u func=load\u和\u preprocess\u来自\u path\u标签,num\u parallel\u calls=AUTOTUNE)
文件“/home/me/.local/lib/python3.6/site packages/tensorflow/python/data/ops/dataset_ops.py”,地图中的第1146行
self、map\u func、num\u parallel\u调用、preserve\u cardinality=True)
文件“/home/me/.local/lib/python3.6/site packages/tensorflow/python/data/ops/dataset_ops.py”,第3264行,在u init中__
使用旧功能=使用旧功能)
文件“/home/me/.local/lib/python3.6/site packages/tensorflow/python/data/ops/dataset_ops.py”,第2591行,在u init中__
self.\u function=wrapper\u fn.\u get\u concrete\u function\u internal()
文件“/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py”,第1366行,在内部获取具体函数
*args,**kwargs)
文件“/home/me/.local/lib/python3.6/site packages/tensorflow/python/eager/function.py”,第1360行,位于“获取”\u具体\u函数\u内部\u垃圾收集”
图函数,自我,可能定义函数(args,kwargs)
文件“/home/me/.local/lib/python3.6/site packages/tensorflow/python/eager/function.py”,第1648行,在函数定义中
graph\u function=self.\u create\u graph\u function(args,kwargs)
文件“/home/me/.local/lib/python3.6/site packages/tensorflow/python/eager/function.py”,第1541行,在创建图形函数中
按值捕获=自身。_按值捕获),
文件“/home/me/.local/lib/python3.6/site-packages/tensorflow/python/framework/func_-graph.py”,第716行,在func_-graph_中,从_-py_-func开始
func_outputs=python_func(*func_args,**func_kwargs)
文件“/home/me/.local/lib/python3.6/site packages/tensorflow/python/data/ops/dataset_ops.py”,第2585行,在wrapper_fn中
ret=\u包装器\u帮助器(*args)
文件“/home/me/.local/lib/python3.6/site packages/tensorflow/python/data/ops/dataset_ops.py”,第2530行,在_wrapper_helper中
ret=func(*嵌套参数)
文件“/home/me/.local/lib/python3.6/site packages/wavfeat/one_sec_data_loader.py”,第47行,从路径标签加载和预处理
pl=dict([(pk,tf.map\u fn(加载和预处理图像,po,dtype=tf.float32))用于pk,po在pout中])
文件“/home/me/.local/lib/python3.6/site packages/wavfeat/one_sec_data_loader.py”,第47行,在
pl=dict([(pk,tf.map\u fn(加载和预处理图像,po,dtype=tf.float32))用于pk,po在pout中])
文件“/home/me/.local/lib/python3.6/site packages/tensorflow/python/ops/map\u fn.py”,第214行,在map\u fn中
raise VALUERROR(“元素必须是1+维张量,而不是标量”)
ValueError:元素必须是1+维张量,而不是标量
加载项:不使用dict结构 这是一个完整的代码(除了定义
json\u parse\u x\u y
和声明
AUTOTUNE
)来实现您在不使用dict结构的情况下尝试的功能

我测试了
make_dataset
的工作原理(参见下面的示例),因此如果遇到问题,应该是由于有关
load_张量的规范错误引起的

从itertools导入zip\u
导入tensorflow作为tf
#此外,必须定义'json_parse_x_y'
#并且必须声明'AUTOTUNE'(在我的示例中,我将其设置为2)
def读取图像(路径、形状):
“”“读取给定文件路径和张量形状的图像。
返回给定形状的浮点张量。
"""
尝试:
image=tf.io.read\u文件(路径)
image=tf.image.decode\u png(图像)
image=tf.image.resize(图像,[shape[1],shape[2]])
图像/=255.0
返回图像
除:
raise FileNotFoundError(“预处理\u映像:错误路径“%s”%”%path)
def load_图像(路径、形状):
“”“加载图像集合(与单个样本关联)。
路径:秩1字符串张量
形状:图像形状列表(与“路径”长度相同)
返回包含加载图像的浮点张量元组。
"""
返回元组((
读取图像(路径[i],形状[i])
适用于范围内的i(透镜(形状))
))
def load_张量(json_数据,序号):
“”“从json转储加载图像描述符。
返回包含以下内容的元组:
*包含映像路径列表的秩2张量(str)
*包含分辨率值的秩2张量(浮点)
*图像形状列表,长度与秩2相同
张量第二轴
"""
x、 y=json_parse_x_y(json_d
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 284, in _constant_impl
    allow_broadcast=allow_broadcast))
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/framework/tensor_util.py", line 455, in make_tensor_proto
    raise ValueError("None values not supported.")
ValueError: None values not supported.

Traceback (most recent call last):
  File "/home/me/.local/bin/wavfeat", line 11, in <module>
    load_entry_point('wavfeat==0.1.0', 'console_scripts', 'wavfeat')()
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/__main__.py", line 91, in main
    analysis_batch_sql(obj)
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/analysis_run_csv.py", line 50, in analysis_batch_sql
    qy = [*map(lambda c: run_elm(c[0], c[1]), ch)]
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/analysis_run_csv.py", line 50, in <lambda>
    qy = [*map(lambda c: run_elm(c[0], c[1]), ch)]
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/analysis_run_csv.py", line 23, in run_elm
    out = fn(input, elm)
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_onset.py", line 216, in one_sec_onset_train
    return train(input, elm)
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_onset.py", line 203, in train
    vs = validation_prep(jd, 'validation', bc)
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_onset.py", line 176, in validation_prep
    ds  = ds.map(map_func=load_and_preprocess_from_path_label, num_parallel_calls=AUTOTUNE)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 1146, in map
    self, map_func, num_parallel_calls, preserve_cardinality=True)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 3264, in __init__
    use_legacy_function=use_legacy_function)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 2591, in __init__
    self._function = wrapper_fn._get_concrete_function_internal()
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1366, in _get_concrete_function_internal
    *args, **kwargs)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1360, in _get_concrete_function_internal_garbage_collected
    graph_function, _, _ = self._maybe_define_function(args, kwargs)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1648, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1541, in _create_graph_function
    capture_by_value=self._capture_by_value),
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/framework/func_graph.py", line 716, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 2585, in wrapper_fn
    ret = _wrapper_helper(*args)
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 2530, in _wrapper_helper
    ret = func(*nested_args)
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_data_loader.py", line 47, in load_and_preprocess_from_path_label
    pl   = dict([(pk, tf.map_fn(load_and_preprocess_image, po, dtype=tf.float32)) for pk,po in pout])
  File "/home/me/.local/lib/python3.6/site-packages/wavfeat/one_sec_data_loader.py", line 47, in <listcomp>
    pl   = dict([(pk, tf.map_fn(load_and_preprocess_image, po, dtype=tf.float32)) for pk,po in pout])
  File "/home/me/.local/lib/python3.6/site-packages/tensorflow/python/ops/map_fn.py", line 214, in map_fn
    raise ValueError("elems must be a 1+ dimensional Tensor, not a scalar")
ValueError: elems must be a 1+ dimensional Tensor, not a scalar