Я использовал шаблон настраиваемого генератора изображений в keras, так что я могу использовать файлы hdf5 в качестве входных данных. Изначально код выдавал ошибку "shape", поэтому я включил from tensorflow.python.keras.utils.data_utils import Sequence
только после этого сообщения. Теперь я использую его в этой форме, как вы также можете видеть в моем блокноте colab:
from numpy.random import uniform, randint
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator
import numpy as np
from tensorflow.python.keras.utils.data_utils import Sequence
class CustomImagesGenerator(Sequence):
def __init__(self, x, zoom_range, shear_range, rescale, horizontal_flip, batch_size):
self.x = x
self.zoom_range = zoom_range
self.shear_range = shear_range
self.rescale = rescale
self.horizontal_flip = horizontal_flip
self.batch_size = batch_size
self.__img_gen = ImageDataGenerator()
self.__batch_index = 0
def __len__(self):
# steps_per_epoch, if unspecified, will use the len(generator) as a number of steps.
# hence this
return np.floor(self.x.shape[0]/self.batch_size)
# @property
# def shape(self):
# return self.x.shape
def next(self):
return self.__next__()
def __next__(self):
start = self.__batch_index*self.batch_size
stop = start + self.batch_size
self.__batch_index += 1
if stop > len(self.x):
raise StopIteration
transformed = np.array(self.x[start:stop]) # loads from hdf5
for i in range(len(transformed)):
zoom = uniform(self.zoom_range[0], self.zoom_range[1])
transformations = {
'zx': zoom,
'zy': zoom,
'shear': uniform(-self.shear_range, self.shear_range),
'flip_horizontal': self.horizontal_flip and bool(randint(0,2))
}
transformed[i] = self.__img_gen.apply_transform(transformed[i], transformations)
import pdb;pdb.set_trace()
return transformed * self.rescale
И я вызываю генератор с:
import h5py
import tables
in_hdf5_file = tables.open_file("gdrive/My Drive/Colab Notebooks/dataset.hdf5", mode='r')
images = in_hdf5_file.root.train_img
my_gen = CustomImagesGenerator(
images,
zoom_range=[0.8, 1],
batch_size=32,
shear_range=6,
rescale=1./255,
horizontal_flip=False
)
classifier.fit_generator(my_gen, steps_per_epoch=100, epochs=1, verbose=1)
Импорт Sequence
устранил ошибку "формы", но теперь я получаю сообщение об ошибке:
Исключение в потоке Thread-5: Traceback (последний вызов последним):
Файл «/usr/lib/python3.6/threading.py», строка 916, в файле _bootstrap_inner self.run () «/ usr / lib /python3.6/threading.py ", строка 864, в процессе выполнения self._target (* self._args, ** self._kwargs) Файл" /usr/local/lib/python3.6/dist-packages/tensorflow/python /keras/utils/data_utils.py ", строка 742, в _run sequence = list (range (len (self.sequence))) TypeError: объект 'numpy.float64' не может быть интерпретирован как целое число
Как я могу это решить? Я подозреваю, что это снова может быть конфликт в пакетах keras, и не знаю, как с этим справиться.
dtype
ваши данные? - person okawo   schedule 29.08.2019images
, если я сделаюprint(images.dtype)
, я получуdtype('uint8')
. Это как-то помогает? Спасибо - person NeStack   schedule 29.08.2019dtype
ваших изображений наnp.float32
илиnp.float64
. если ваши изображения np.arrays, вы можете сделать это:arr.astype(dtype)
- person okawo   schedule 01.09.2019dtype
на разные типы (float32, float64, int) при создании файла изображения hdf5, но это не изменило сообщение об ошибке, каждый раз, когда в нем говорится о проблеме с 'numpy.float64'. Поэтому я думаю, что между некоторыми пакетами python существует конфликт. Вы также можете взглянуть на мой скрипт, который создает файлы изображений hdf5, которые я вставил внизу своего блокнота colab (ссылка в сообщении) - person NeStack   schedule 01.09.2019classifier.add(InputLayer(input_shape=data_shape))
из вашей модели, похоже, что у вас есть 2 слоя с входными данными в вашей последовательной модели - person okawo   schedule 01.09.2019model.fit()
, а неmodel.fit_generator()
. также ваш класс генератора не может выводить обучающие данные, он может выводить только изображения, но для обучения вашей модели вам нужноx=images, y=labels
, плюс у вас уже есть ваши данные, сохраненные и обработанные, почему бы просто не использоватьfit()
с вашими данными, загруженными как есть с вашего hdf5 файл? - person okawo   schedule 01.09.2019