Ошибка API данных: не удается преобразовать символьный тензор (truediv: 0) в массив numpy

У меня 45000 изображений размером 224 * 224, хранящихся в виде массива numpy. Этот массив, называемый source_arr, имеет форму 45000,224,224 и умещается в памяти.

Я хочу разделить этот массив на тренировку, тестирование и проверку массива и предварительную обработку (нормализовать и преобразовать шкалу серого в 3 канала RGB) с помощью tf.data API.

Я написал функцию предварительной обработки, например:

def pre_process(x):
     #Zero centering the scaled dataset
     x_norm = (x-mean_Rot_MIP)/Var_Rot_MIP
     #Stack 3 channels
     x_norm_3ch= np.stack((x_norm, x_norm, x_norm),axis=0)
     print('Rotn MIP 3ch dim:', x_norm_3ch.shape) # (3, 224, 224)
     #converting  channel 1st to channel last move axis 1 to 3
     x_norm_3ch = moveaxis(x_norm_3ch, 0,2) 
     print('Rotn MIP ch last dim: ',x_norm_3ch.shape)  # (224, 224, 3)   
     return x_norm_3ch

X_train_cases_idx.idx содержит индекс изображений из source_arr, которые являются частью обучающих данных.

Я прочитал соответствующие обучающие изображения из source_arr в объекте набора данных, например:

X_train = tf.data.Dataset.from_tensor_slices([source_arr[i] for i in X_train_cases_idx.idx])

Затем я применяю функцию pre_process к обучающим изображениям, например X_train = X_train.map(pre_process).

но я получаю следующую ошибку

Traceback (most recent call last):

  File "<ipython-input-37-69aa131a6944>", line 1, in <module>
    X_train = X_train.map(pre_process)

  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\data\ops\dataset_ops.py", line 1695, in map
    return MapDataset(self, map_func, preserve_cardinality=True)

  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\data\ops\dataset_ops.py", line 4045, in __init__
    use_legacy_function=use_legacy_function)

  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\data\ops\dataset_ops.py", line 3371, in __init__
    self._function = wrapper_fn.get_concrete_function()

  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\eager\function.py", line 2939, in get_concrete_function
    *args, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\eager\function.py", line 2906, in _get_concrete_function_garbage_collected
    graph_function, args, kwargs = self._maybe_define_function(args, kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\eager\function.py", line 3213, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\eager\function.py", line 3075, in _create_graph_function
    capture_by_value=self._capture_by_value),

  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\func_graph.py", line 986, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\data\ops\dataset_ops.py", line 3364, in wrapper_fn
    ret = _wrapper_helper(*args)

  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\data\ops\dataset_ops.py", line 3299, in _wrapper_helper
    ret = autograph.tf_convert(func, ag_ctx)(*nested_args)

  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\autograph\impl\api.py", line 258, in wrapper
    raise e.ag_error_metadata.to_exception(e)

NotImplementedError: in user code:

    <ipython-input-2-746b4230fbd1>:58 pre_process  *
        x_norm_3ch= np.stack((x_norm, x_norm, x_norm),axis=1)
    <__array_function__ internals>:6 stack  **
        
    C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\shape_base.py:419 stack
        arrays = [asanyarray(arr) for arr in arrays]
    C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\shape_base.py:419 <listcomp>
        arrays = [asanyarray(arr) for arr in arrays]
    C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\_asarray.py:138 asanyarray
        return array(a, dtype, copy=False, order=order, subok=True)
    C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py:848 __array__
        " a NumPy call, which is not supported".format(self.name))

    NotImplementedError: Cannot convert a symbolic Tensor (truediv:0) to a numpy array. This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported

Что я делаю не так и как это исправить? Я использую Tensorflow 2.0 с python 3.7 в Windows 10


person Divya Choudhary    schedule 17.08.2020    source источник


Ответы (1)


Как указано в сообщении об ошибке, вы пытаетесь использовать функции NumPy для работы с тензорами TensorFlow. Вместо этого вы должны использовать операции TensorFlow. Это эквивалентно тому, что вы пытались сделать:

def pre_process(x):
     x_norm = (x - mean_Rot_MIP) / Var_Rot_MIP
     # Stacking along the last dimension to avoid having to move channel axis
     x_norm_3ch = tf.stack((x_norm, x_norm, x_norm), axis=-1)
     return x_norm_3ch
person jdehesa    schedule 17.08.2020
comment
Спасибо, проблема решена. У всех ли функций Numpy есть прямой аналог TensorFlow? - person Divya Choudhary; 17.08.2020
comment
@DivyaChoudhary По большей части да. Есть несколько из них, у которых нет точного аналога, но редко можно найти что-то, что нелегко перевести (хотя и не всегда так эффективно, например np.isin). Другое дело, что с NumPy вы можете перебирать массивы, использовать условные выражения и т. Д., В то время как с TF, если в режиме графика (т.е. в @tf.function) вы не можете (или не обычным способом), и вам нужно использовать _ 3_ или _ 4_. - person jdehesa; 17.08.2020