Моя цель - взять предварительно обученную модель без двух последних полностью связанных слоев, чтобы построить новый собственный класс для CIFAR-10. Первая проблема, с которой я столкнулся, заключается в том, что VGG ожидает, по крайней мере, 48*48*3
тензор, в то время как набор данных CIFAR-10 поставляется с 32*32*3
изображениями. Я знаю, что ImageDataGenerator.flow_from_directory
поставляется со встроенным параметром target_size
, но я не могу использовать его здесь, потому что изображения уже находятся в памяти:
from keras.applications import VGG16
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
vgg_conv = VGG16(weights='imagenet', include_top=False, input_shape=(48, 48, 3)) # 48 its a minimum width
>> type(x_train) #we have numpy here
numpy.ndarray
Для преобразования изображений я использую skimage
(не знаю почему, но, похоже, это работает):
from skimage import transform
new_shape = (48,88,3)
x_train = np.asarray([transform.resize(image, new_shape) for image in x_train])
Далее мы передаем его генератору, чтобы иметь возможность кормить NN партиями. К сожалению, у него нет параметра target_size
, поэтому раньше я использовал resize
:
train_generator = datagen.flow(
x_train,
batch_size=batch_size,
shuffle=True)
Тогда я перебираю train_generator
без удачи:
for inputs_batch in train_generator:
features_batch = vgg_conv.predict(inputs_batch)
train_features[i * batch_size : (i + 1) * batch_size] = features_batch
i += 1
if i * batch_size >= nImages:
break
Это ошибка, которую я получаю:
ValueError Traceback (последний вызов был последним)
----> 2 features_batch = vgg_conv.predict (input_batch)
ValueError: Ошибка при проверке ввода: ожидалось, что input_4 будет иметь форму (48, 48, 3), но получил массив с формой (48, 88, 3)
Возможно, проблема связана с flow generator
, которая:
# Returns
An `Iterator` yielding tuples of `(x, y)`
where `x` is a numpy array of image data
(in the case of a single image input) or a list
of numpy arrays (in the case with
additional inputs) and `y` is a numpy array
of corresponding labels. If 'sample_weight' is not None,
the yielded tuples are of the form `(x, y, sample_weight)`.
If `y` is None, only the numpy array `x` is returned.
Итак, у меня есть 2 вопроса: что здесь не так и есть ли лучший способ изменить размер изображения, может быть, какой-то встроенный в функцию Keras?