Keras Feature Extraction - ожидалось, что input_1 будет иметь 4 измерения, но получит массив с формой (1, 46) - PullRequest
0 голосов
/ 15 января 2019

У меня проблема с Keras при извлечении функций изображения. Я уже добавляю 4d слой с этим кодом

# Add a fourth dimension (since Keras expects a list of images)
image_array = np.expand_dims(image_array, axis=0)

Но все равно выдает ошибку.

Это мой фактический код:

from pathlib import Path
import numpy as np
import joblib
from keras.preprocessing import image
from keras.applications import vgg16
import os.path

# Path to folders with training data
img_db = Path("database") / "train"

images = []
labels = []

# Load all the not-dog images
for file in img_db.glob("*/*.jpg"):

    file = str(file)

    # split path with filename
    pathname, filename = os.path.split(file)
    person = pathname.split("\\")[-1]

    print("Processing file: {}".format(file))

    # Load the image from disk
    img = image.load_img(file)

    # Convert the image to a numpy array
    image_array = image.img_to_array(img)

    # Add a fourth dimension (since Keras expects a list of images)
    # image_array = np.expand_dims(image_array, axis=0)

    # Add the image to the list of images
    images.append(image_array)

    # For each 'not dog' image, the expected value should be 0
    labels.append(person)

# Create a single numpy array with all the images we loaded
x_train = np.array(images)

# Also convert the labels to a numpy array
y_train = np.array(labels)

# Normalize image data to 0-to-1 range
x_train = vgg16.preprocess_input(x_train)

input_shape = (250, 250, 3)
# Load a pre-trained neural network to use as a feature extractor
pretrained_nn = vgg16.VGG16(weights='imagenet', include_top=False, input_shape=input_shape)

# Extract features for each image (all in one pass)
features_x = pretrained_nn.predict(x_train)

# Save the array of extracted features to a file
joblib.dump(features_x, "x_train.dat")

# Save the matching array of expected values to a file
joblib.dump(y_train, "y_train.dat")

Error

Traceback (последний вызов был последним): файл "C: /Users/w024029h/PycharmProjects/keras_pretrained/pretrained_vgg16.py", строка 57, в features_x = pretrained_nn.predict (x_train) Файл "C: \ Users \ w024029h \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ training.py", строка 1817, в прогнозе check_batch_axis = False) Файл "C: \ Users \ w024029h \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ keras \ engine \ training.py", строка 113 в _standardize_input_data 'with shape' + str (data_shape)) ValueError: Ошибка при проверке: ожидалось, что input_1 будет иметь 4 измерения, но получит массив с shape (1, 46)

1 Ответ

0 голосов
/ 15 января 2019

После добавления дополнительного измерения image_array будет иметь форму, аналогичную (1, 3, 250, 250) или (1, 250, 250, 3) (в зависимости от вашего бэкенда, учитывая 3-канальные изображения).

Когда вы выполните images.append(image_array), он добавит этот 4d-массив в список массивов numpy. На практике этот список будет 5-мерным массивом, но когда вы преобразуете его обратно в пустой массив, у numpy не будет способа узнать, какую желаемую форму / количество измерений вы хотите.

Вы можете использовать np.vstack() ( doc ) для укладки каждого отдельного 4d-массива по первой оси.

Измените эти строки в вашем коде:

# Create a single numpy array with all the images we loaded
x_train = np.array(images)

Для:

x_train = np.vstack(images)
...