Как изменить размеры изображения, чтобы оно также содержало количество изображений (т. Е. 1)? - PullRequest
0 голосов
/ 17 мая 2018

Я использую модель нейронной сети на некоторых изображениях.Первоначально, для обучения, я преобразовал все изображения в кадр данных pandas размером (# of images in the dataset) x r x g x b, где r, g, b - это значения цвета каждого изображения.Теперь, когда я пытаюсь протестировать модель на одном внешне загруженном изображении, он выдает ошибку измерения, поскольку размер изображения, очевидно, составляет всего r x g x b.Как добавить количество изображений в качестве измерения в это изображение?

РЕДАКТИРОВАТЬ: Вот код:

#load the data as a pandas data frame
import pandas as pd
dataset = pd.read_csv(os.path.join(data_path, 'data.csv'))

# split into input (X) and output (Y) variables
X = dataset.values[:,0]
Y = dataset.values[:,1]

# Load all the images and resize them into a single numpy array of consistent dimension
from scipy.misc import imresize
from scipy.misc import imread
import numpy as np

temp = []
for img_name in X:
    img_path = os.path.join(data_dir, 'Train', img_name)
    img = imread(img_path)
    img = imresize(img, (32, 32))
    img = img.astype('float32')
    temp.append(img)

X = np.stack(temp)

# Convert the data classes from words into a number format readable by the program
from sklearn.preprocessing import LabelEncoder
lb = LabelEncoder()
Y = lb.fit_transform(Y)
Y = keras.utils.np_utils.to_categorical(Y)

# Split the data into 67% for training and 33% for testing
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33)

### Define the neural network model
### Compile and train the model on the data
### Evaluate it

# Test it on an externally downloaded image
img = imread(os.path.join(image_folder, downloaded_image)).astype('float32')
plt.imshow(imresize(img, (128, 128)))

print('X_train shape: ', X_train.shape)
print('Downloaded image shape: ', img.shape)

Это возвращает:

X_train shape: (13338, 32, 32, 3)
Downloaded image shape: (448, 720, 3)

Я хочу, чтобы форма загруженного изображения была (1, 448, 720, 3), чтобы она соответствовала размерам формы X_train, потому что, когда я пытаюсь предсказать класс загруженного изображения,возвращает ошибку измерения:

pred = cnn_model.predict_classes(img)
print('Predicted:', lb.inverse_transform(pred))

Возвращает:

ValueError: Error when checking : expected conv2d_71_input to have 4 dimensions, but got array with shape (960, 640, 3)

1 Ответ

0 голосов
/ 17 мая 2018

Из вашего описания кажется, что вы на самом деле не хотите использовать количество изображений в качестве функции, а скорее как вес образца. Концептуально, вы, вероятно, хотите преобразовать

k x r x g x b

до

r x g x b
...         # repeat k times
r x g x b

, что, естественно, делало бы входные и выходные размеры одинаковыми, кстати. Если это слишком сильно увеличивает время обучения, а в вашей библиотеке есть весовой параметр выборки, вам следует рассмотреть возможность его использования.


Если вы хотите просто технически добавить измерение, вы можете использовать np.expand_dims:

>>> np.expand_dims(np.array([[1, 2, 3], [3, 4, 5]]), axis=0).shape
(1, 2, 3)

Однако я не могу сказать, что уверен, что это в основном то, что вы, что.

...