Загрузить файл .mat в набор данных tenorflow2 - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть папка .mat файлов, которая содержит стек 3D-изображений, и я хотел бы загрузить их в набор данных. Я использую функцию py_function в tenorflow-gpu-2 для анализа данных:

def load(image_file):
    def _load_mat(image_file):


        mat_contents = h5py.File(image_file,'r')
        image = mat_contents['thumb_stack']
        w = image.shape[1]

        w = w // 2

        real_data = image[:, :w,:]
        input_data = image[:, w:,:]

        input_data=input_data.transpose(2,1,0)
        real_data=real_data.transpose(2,1,0)

        return real_data, input_data, np.asarray(w)




    output=tf.py_function(_load_mat,[image_file],[tf.float32,tf.float32,tf.int64])


    real_image=output[0]
    input_image=output[1]


    input_image = tf.cast(input_image, tf.float32)
    real_image = tf.cast(real_image, tf.float32)

    input_image=tf.reshape(input_image,[IMG_WIDTH,IMG_HEIGHT,IMG_STACK])
    real_image=tf.reshape(real_image,[IMG_WIDTH,IMG_HEIGHT,IMG_STACK])


    return input_image, real_image
def load_image_test(image_file):
  input_image, real_image = load(image_file)

  return input_image, real_image
test_dataset = tf.data.Dataset.list_files(PATH+'/*.mat')
test_dataset = test_dataset.map(load_image_test)

Но, когда я тренируюсь модель или просто проверяю один вход, чтобы увидеть, работает ли функция загрузки.

#file=sio.loadmat(mat_fname_test)
mat_contents = mat73.loadmat(file)

Она продолжает получать ошибку:

InvalidArgumentError: {{function_node __inference_Dataset_map_load_image_test_171}} TypeError: expected str, bytes or os.PathLike object, not tensorflow.python.framework.ops.EagerTensor
Traceback (most recent call last):

  File "/home/hzhuge/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_core/python/ops/script_ops.py", line 219, in __call__
    return func(device, token, args)

  File "/home/hzhuge/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_core/python/ops/script_ops.py", line 113, in __call__
    ret = self._func(*args)

  File "/tmp/tmp4nn7yu7f.py", line 20, in _load_mat
    mat_contents = ag__.converted_call(h5py.File, _load_mat_scope.callopts, (image_file, 'r'), None, _load_mat_scope)

  File "/home/hzhuge/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_core/python/autograph/impl/api.py", line 422, in converted_call
    return _call_unconverted(f, args, kwargs, options)

  File "/home/hzhuge/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_core/python/autograph/impl/api.py", line 332, in _call_unconverted
    return f(*args)

  File "/home/hzhuge/.local/lib/python3.7/site-packages/h5py/_hl/files.py", line 385, in __init__
    name = filename_encode(name)

  File "/home/hzhuge/.local/lib/python3.7/site-packages/h5py/_hl/compat.py", line 111, in filename_encode
    filename = fspath(filename)

TypeError: expected str, bytes or os.PathLike object, not tensorflow.python.framework.ops.EagerTensor


     [[{{node EagerPyFunc}}]] [Op:IteratorGetNextSync]

Как я могу это исправить и правильно загрузить файлы .mat в набор данных с tenorsflow2? Я искал все вопросы (например, ссылку ниже), связанные с этим, но до сих пор нет правильного ответа. Как читать .mat формат файла в tenorflow? https://github.com/tensorflow/tensorflow/issues/34921 PS scipy.io.loadmat не может загрузить файл 7.3-mat, поэтому я использовал h5py, они должны быть одинаковыми вещь.

...