ValueError: невозможно преобразовать массив размером 7840000 в форму (60000,784) - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь классифицировать полутоновые изображения рукописных цифр (28 на 28 пикселей) по 10 категориям.

Я уже проверял подобные вопросы на этом сайте, но мне не удалось решить, почему я получаюошибка:

ValueError: невозможно преобразовать массив размером 7840000 в форму (60000,784)

Если вы можете помочь мне, как это исправить.

from keras.datasets import mnist
from keras import models
from keras import layers
from keras.utils import to_categorical

def load_dataset():
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()

    train_images = train_images.reshape((60000, 28 * 28))
    test_images = test_images.reshape((60000, 28 * 28))

    train_labels = to_categorical(train_labels)
    test_labels = to_categorical(test_labels)

    return train_images, train_labels, test_images, test_labels

def prep_pixels(train, test):
    train_images = train_images.astype('float32') / 255
    test_images = test_images.astype('float32') / 255

    return train_images, test_images



def define_model():
    network = models.Sequential()
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
    network.add(layers.Dense(10, activation='softmax'))

    return network

def compile(network):
    network.compile(optimizer='rmsprop',
                    loss='categorical_crossentropy',
                    metrics=['accuracy'])

def run():
    (train_images, train_labels), (test_images, test_labels) = load_dataset()

    train_images, test_images = prep_pixels(test_images, test_images)

    network = define_model()

    compiled_network = compile(network)

    compiled_network.fit(train_images, train_labels, epochs=5, batch_size=128)

run()

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Более надежная версия того, что порекомендовал Иоаннис:

train_images = train_images.reshape((train_images.shape[0], train_images.shape[1] * train_images.shape[2]))

. Это должно работать для наборов данных и изображений любого размера.

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

image_shape = (28, 28)

def load_dataset():
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()

    train_labels = to_categorical(train_labels)
    test_labels = to_categorical(test_labels)

def define_model():
    network = models.Sequential()
    network.add(layers.Flatten(input_shape=image_shape))
    network.add(layers.Dense(512, activation='relu'))
    network.add(layers.Dense(10, activation='softmax'))

Это должно иметь точно такой же эффект, за исключением того, что ваш набор данных останется в виде 2D-изображений для упрощенияанализ.

0 голосов
/ 31 октября 2019

Набор данных MNIST состоит из 60000 обучающих изображений и 10000 тестовых изображений. Изменить как:

test_images = test_images.reshape((10000, 28 * 28))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...