Начальное значение numpy массив перед запуском функции в python - PullRequest
0 голосов
/ 25 марта 2020

Я хочу поместить данные изображения в массив numpy, но каждый раз, когда я получаю ошибку ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 1 has 4 dimension(s), или я получаю, что мой массив является нуль-мерным, и это тоже неправильно. Как я должен инициализировать мою переменную перед функцией? Вот некоторый код:

from extra_keras_datasets import emnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Flatten
from tensorflow.python.keras.layers.convolutional import Conv2D
from tensorflow.python.keras.layers.convolutional import MaxPooling2D
from tensorflow.keras.optimizers import Adam
from tensorflow.python.keras.utils import np_utils
from PIL import Image
import numpy as np
import os

#to load the own images to the program and reshape their data so it's fitting the CNN.
def load_images_to_data(image_label, image_directory, features_data, label_data):
    list_of_files = os.listdir(image_directory)
    for file in list_of_files:
        image_file_name = os.path.join(image_directory, file)
        if ".png" in image_file_name:
            img = Image.open(image_file_name).convert("L")
            img = np.resize(img, (28,28,1))
            im2arr = np.array(img)
            im2arr = im2arr.reshape(1,28,28,1)
            features_data = np.append(features_data, im2arr, axis=0)
            label_data = np.append(label_data, [image_label], axis=0)
    return features_data, label_data

# load data
(X_train, y_train), (X_test, y_test) = emnist.load_data(type='letters')
X_test = np.empty((4,1), np.float32)
y_test = None

# Reshaping to format which CNN expects (batch, height, width, channels)
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], X_train.shape[2], 1).astype('float32')

X_test, y_test = load_images_to_data('a', 'Photos/1/a', X_test, y_test)

Я пробовал X_test = Нет, X_test = np.empty ((4,1), np.float32), X_test = np.empty ((1,4), np.float32), но это не сработает. Идея этой программы пришла от здесь , и я хочу протестировать мои собственные данные, а не тестовые данные из EMNIST.

1 Ответ

0 голосов
/ 25 марта 2020

Использование np.append в этой функции - плохая идея. (любое использование np.append плохо):

X_test = np.empty((4,1), np.float32)
def load_images_to_data(image_label, image_directory, features_data, label_data):
    list_of_files = os.listdir(image_directory)
    for file in list_of_files:
        image_file_name = os.path.join(image_directory, file)
        if ".png" in image_file_name:
            img = Image.open(image_file_name).convert("L")
            img = np.resize(img, (28,28,1))
            im2arr = np.array(img)
            im2arr = im2arr.reshape(1,28,28,1)
            features_data = np.append(features_data, im2arr, axis=0)
            label_data = np.append(label_data, [image_label], axis=0)
    return features_data, label_data

Как вы узнали, трудно получить начальное значение features_data правильно. И это медленно, создавая новый массив каждый вызов.

np.append(A,B, axis=0) просто делает np.concatenate([A,B], axis=0). Дайте ему весь список массивов, а не объединяйте их один за другим.

def load_images_to_data(image_label, image_directory):
    list_of_files = os.listdir(image_directory)
    alist = []; blist = []
    for file in list_of_files:
        image_file_name = os.path.join(image_directory, file)
        if ".png" in image_file_name:
            img = Image.open(image_file_name).convert("L")
            img = np.resize(img, (28,28,1))
            im2arr = np.array(img)
            im2arr = im2arr.reshape(1,28,28,1)
            alist.append(im2arr)
            blist.append([image_label]
    features_data = np.concatenate(alist, axis=0)
    label_data = np.concatenate(blist, axis=0)
    return features_data, label_data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...