У меня есть папка .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, они должны быть одинаковыми вещь.