Сохранение функций Inception_Resnet_v2 в h5py - PullRequest
0 голосов
/ 20 октября 2018

В настоящее время я пытаюсь использовать несколько предварительно обученных сетей ImageNet в кератах для извлечения функций из изображений.Для этого я удаляю верхний слой сети, предварительно обрабатываю входные данные в соответствии с каждым из требований сети и затем сохраняю выходные данные в файле hdf5.Я использовал несколько других предварительно обученных сетей, использующих тот же самый подход и код (только переключение сети), и это, кажется, работает отлично.Тем не менее, сеть, которую я изо всех сил пытаюсь заставить работать, - «InceptionResNetV2».Я не верю, что у меня возникают какие-либо проблемы с сетью, только с сохранением - я приложил слегка упрощенную версию кода.Изменение модели в экстракторе функций и модели в предварительной обработке означает, что она отлично работает - для vgg16, vgg19, resnet, inception и т. Д. - все хорошо.

db = h5py.File(hdf5_path, mode="w")

featuresDB = db.create_dataset("features", shape=features_shape, dtype="float")

images = [cv2.imread(path, 1) for path in image_paths[start:end]]

images = inception_resnet_v2.preprocess_input(images)

features = feature_extractor.extract(images)

featuresDB[start:end] = features

Однако это приводит к следующей ошибке.Я пытался изменить d-тип данных, поступающих в featuresDB, на int, но это не имело никакого эффекта.Любые предложения приветствуются!

File "h5py/utils.pyx", line 101, in h5py.utils.convert_tuple
TypeError: an integer is required

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "Extract_Features.py", line 111, in <module>
    extract_features(image_paths, hdf5_path=args["features_db"], 
feature_extractor=feature_extractor)

File "Extract_Features.py", line 83, in extract_features
    featuresDB = db.create_dataset("features", shape=features_shape, dtype="float")

File "/home/will/tensorflow/lib/python3.5/site-packages/h5py/_hl/group.py", line 
106, in create_dataset
    dsid = dataset.make_new_dset(self, shape, dtype, data, **kwds)

File "/home/will/tensorflow/lib/python3.5/site-packages/h5py/_hl/dataset.py", line 137, in make_new_dset
    sid = h5s.create_simple(shape, maxshape)

File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper

File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper

File "h5py/h5s.pyx", line 95, in h5py.h5s.create_simple

File "h5py/utils.pyx", line 103, in h5py.utils.convert_tuple
TypeError: Can't convert element 1 (None) to hsize_t

1 Ответ

0 голосов
/ 21 октября 2018
In [201]: f = h5py.File('test.h5','w')

Я могу воссоздать вашу ошибку с этим выражением:

In [203]: ds = f.create_dataset('features', shape=(None,3), dtype=float)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
h5py/utils.pyx in h5py.utils.convert_tuple()

TypeError: an integer is required

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-203-a5733d841c5c> in <module>()
----> 1 ds = f.create_dataset('features', shape=(None,3), dtype=float)

~/.local/lib/python3.6/site-packages/h5py/_hl/group.py in create_dataset(self, name, shape, dtype, data, **kwds)
    104         """
    105         with phil:
--> 106             dsid = dataset.make_new_dset(self, shape, dtype, data, **kwds)
    107             dset = dataset.Dataset(dsid)
    108             if name is not None:

~/.local/lib/python3.6/site-packages/h5py/_hl/dataset.py in make_new_dset(parent, shape, dtype, data, chunks, compression, shuffle, fletcher32, maxshape, compression_opts, fillvalue, scaleoffset, track_times)
    135         sid = h5s.create(h5s.NULL)
    136     else:
--> 137         sid = h5s.create_simple(shape, maxshape)
    138 
    139 

h5py/_objects.pyx in h5py._objects.with_phil.wrapper()

h5py/_objects.pyx in h5py._objects.with_phil.wrapper()

h5py/h5s.pyx in h5py.h5s.create_simple()

h5py/utils.pyx in h5py.utils.convert_tuple()

TypeError: Can't convert element 0 (None) to hsize_t

A None нормально в параметре maxshape, но не shape - это для набора данных с изменяемым размером:

In [204]: ds = f.create_dataset('features', shape=(10,3), maxshape=(None,3), dty
     ...: pe=float)
In [205]: ds
Out[205]: <HDF5 dataset "features": shape (10, 3), type "<f8">
In [206]: ds.resize((20,3))
In [207]: ds
Out[207]: <HDF5 dataset "features": shape (20, 3), type "<f8">

Я не использовал keras, но из других вопросов SO и документации, None разрешен в его shape.None не допускается в numpy форме массива.

...