Форум программистов, компьютерный форум, киберфорум
Python: ИИ, нейросети, ML, агенты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
102 / 86 / 17
Регистрация: 01.04.2017
Сообщений: 795

Keras нейросеть mnist распознавание с картинки Error when checking input: expected dense_1_input to have 2 dimensions

12.08.2018, 21:09. Показов 2961. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер.

Есть обученная нейросеть по mnist-цифрам, сохранённая в файл.
Теперь пытаюсь загрузить её и распознать картинку с цифрой.
Выдаёт ошибку:
ValueError: Error when checking input: expected dense_1_input to have 2 dimensions, but got array with shape (1, 28, 28, 1)

Смотрел по этому видеокурсу:
Кликните здесь для просмотра всего текста


Код:

Обучение и сохранение нейросети:
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import numpy
from keras.datasets import mnist
from keras.datasets import cifar10
from keras.models import Sequential
from keras.layers import Dense, Flatten, Activation
from keras.layers import Dropout
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.utils import np_utils
from keras.optimizers import SGD
 
# Задаем seed для повторяемости результатов
numpy.random.seed(42)
 
# Загружаем данные
# x_train - данные с картинками, y_train- правильные ответы
(X_train, y_train), (X_test, y_test) = mnist.load_data()
 
# Преобразование размерности изображений
# 24*24=784 пиксела-одно изображение - кол-во входов
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)
# Нормализация данных
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
 
# Преобразуем метки в категории
Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)
 
# Создаем последовательную модель
model = Sequential()
 
# Добавляем уровни сети
model.add(Dense(800, input_dim=784, activation="relu", kernel_initializer="normal"))
 
model.add(Flatten())
 
model.add(Dense(10, activation="softmax", kernel_initializer="normal"))
 
# Компилируем модель
model.compile(loss="categorical_crossentropy", optimizer="SGD", metrics=["accuracy"])
 
print(model.summary())
 
# Обучаем сеть
# batch_size - кол-во элементов в выборке до изменения значений весов
# epochs - кол-во эпох
# verbose - печатать диагностическую информацию
# validation_split - часть выборки, которая используется в качестве проверочной выборки
model.fit(X_train, Y_train, batch_size=20, epochs=10, validation_split=0.2, verbose=2)
 
# Оцениваем качество обучения сети на тестовых данных
scores = model.evaluate(X_test, Y_test, verbose=0)
print("Точность работы на тестовых данных: %.2f%%" % (scores[1]*100))
 
# Оцениваем качество обучения сети на тестовых данных
scores = model.evaluate(X_test, Y_test, verbose=0)
print("Точность работы на тестовых данных: %.2f%%" % (scores[1]*100))
 
print("Сохраняем сеть")
# Сохраняем сеть для последующего использования
# Генерируем описание модели в формате json
model_json = model.to_json()
json_file = open("mnist_model.json", "w")
# Записываем архитектуру сети в файл
json_file.write(model_json)
json_file.close()
# Записываем данные о весах в файл
model.save_weights("mnist_model.h5")
print("Сохранение сети завершено")


Распознавание:
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.models import model_from_json
from keras.layers import Dense
from keras.utils import np_utils
from keras.datasets import cifar10
from keras.layers import Dense, Flatten, Activation
from keras.layers import Dropout
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.optimizers import SGD
from keras.preprocessing import image
import matplotlib.pyplot as plt
 
json_file = open("mnist_model.json", "r")
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("mnist_model.h5")
 
loaded_model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
 
img_path = "3.png"
img = image.load_img(img_path, target_size=(28,28), grayscale=True)
plt.imshow(img, cmap="gray")
plt.show()
 
# в mnist используется чёрный = 255, а белый 0, а не как обычно, поэтому требуется преобразовать изображение
x = image.img_to_array(img);
x = 255 - x;
x /= 255;
x = np.expand_dims(x, axis=0)
 
prediction = loaded_model.predict(x);
prediction = np_utils.categoricial_probas_to_classes(prediction)
print(prediction)


Каким образом нужно преобразовать массив? (Что за 1, 28, 28, 1 ? Откуда единицы?)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.08.2018, 21:09
Ответы с готовыми решениями:

Error when checking target: expected dense_2 to have shape (8,) but got array with shape (1,)
from keras.models import Sequential from keras.layers import Dense import numpy as np dataset = np.loadtxt("data.txt",...

error: expected '}' at end of input
Выдает error: expected '}' at end of input на последней, 78 строке. Полагаю ошибка есть не только в скобках. При возможности ответьте с...

MNIST распознавание знаков
учу с++ с opencv. Должна предоставить программу по решению судоку. У меня уже определяется поле, но при попытки работать с MNIST идёт...

3
0 / 0 / 0
Регистрация: 25.10.2018
Сообщений: 1
25.10.2018, 14:04
Удалось решить проблему? У меня такая же проблема - не пойму, где ошибка. Если удалось, напиши, плиз, как.
0
102 / 86 / 17
Регистрация: 01.04.2017
Сообщений: 795
25.10.2018, 16:09  [ТС]
Нет, находил подобные темы без решения.
Как я понял, там с выходом новой версии библиотеки что-то поменялось, метод или аргументы и всё...
0
0 / 0 / 0
Регистрация: 22.04.2023
Сообщений: 1
22.04.2023, 13:57
Пожалуй объясню эту простую тему для не самых умных и любопытных.
Начнём с того, что вы выбрали неправильный курс. Советую посмотреть этот плейлист.
Обучение нейросети на базе mnist - это 8-ой урок.




Для начала стоит понять на чём мы обучаем нейросеть.
Python
1
(X_train, y_train), (X_test, y_test) = mnist.load_data()
- строчка кода, где мы получаем данные из mnist
x_train и x_test представляют собой картинки, а y_train и y_test соответственно какая цифра изображена на картинке
мы будем рассматривать x_train.
Если приглядеться и немножко поэкспериментировать, то можно понять что x_train представляет собой массив ndarray с размерами (~60000, 28, 28). Первое число отвечает за кол-во изображений в базе, второе за длинну, третье за ширину.
Но мы ведь не можем работать с длинной и шириной, поэтому добавляем новую ось.
Python
1
x = np.expand_dims(x_test[n], axis=0)
так у нас и получается массив (~60000, 28, 28, 1), но каждой картинке будет соответствовать массив (28, 28, 1).
Когда вы пытаетесь прогнать через нейронку какие-то свои изображения, то вам нужно предоставить массив (кол-во фотографий, 28, 28, 1), не меньше 2ух
+В вашем примере вы используете устаревший тип сохранения с расширением .h5.
Пожалуй я могу считать, что достаточно понятно объяснил, и могу перейти к показу получившегося у меня кода
Код на создание, обучение и сохранение сети
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
 
import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist         # библиотека базы выборок Mnist
from tensorflow import keras
from keras.layers import Dense, Flatten
 
(x_train, y_train), (x_test, y_test) = mnist.load_data()
 
# стандартизация входных данных
x_train = x_train / 255
x_test = x_test / 255
 
y_train_cat = keras.utils.to_categorical(y_train, 10)
y_test_cat = keras.utils.to_categorical(y_test, 10)
 
# отображение первых 25 изображений из обучающей выборки
 
 
model = keras.Sequential([
    Flatten(input_shape=(28, 28, 1)),
    Dense(128, activation='relu'),
    Dense(10, activation='softmax')
])
 
print(model.summary())      # вывод структуры НС в консоль
 
model.compile(optimizer='adam',
             loss='categorical_crossentropy',
             metrics=['accuracy'])
 
 
model.fit(x_train, y_train_cat, batch_size=32, epochs=5, validation_split=0.2)
 
model.evaluate(x_test, y_test_cat)
 
n = 1
x = np.expand_dims(x_test[n], axis=0)
model.save('model1', True, True)

Код на распознование:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from PIL import Image
from matplotlib import pyplot as plt
import numpy as np
import keras
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
model = keras.models.load_model('model1')
def img(path, width, height):
    imag = Image.open(path)
    if ((width, height) != imag.size):
        imag = imag.resize((width, height))
    res = np.ndarray(shape=(28,28,1))
    for i in range(28):
        for z in range(28):
            pixelRGB = imag.getpixel((z, i))
            R, G, B = pixelRGB
            res[i, z] = (R + G + B) / 3
            if res[i, z] < 120:
                res[i, z] = 255
            else:
                res[i,z] = 0
    #plt.imshow(res, cmap=plt.cm.binary)
    #plt.show()
    return res
def mimg(*paths, y, width, height):
    mres = np.ndarray((len(paths[0]), 28, 28, 1))
    mned = np.ndarray((len(paths[0]), 1))
    a = 0
    for i in paths[0]:
        b = img(i, width, height)
        mres[a] = b
        mned[a, 0] = y[a]
        #plt.imshow(mres[a], cmap=plt.cm.binary)
        #plt.show()
        a += 1
    return mres, mned
result, resned = mimg(('image1.jpg', 'image7.jpg'), y = (1, 7), width = 28, height = 28)
result /= 255
resned = keras.utils.to_categorical(resned, 10)
prediction = model.predict(result)
print(prediction)
Изображения лучше всего нарисовать простым карандашом, на белом листе, и обрезать, так, чтобы цифра была примерно посередине. Нейросеть считает вывод правильным с наибольшим числом [3.8771900e-14 2.5934892e-09 2.9664185e-10 1.5729384e-08 5.3832637e-141.6004638e-14 3.6334893e-19 1.0000000e+00 2.9375428e-12 6.3182722e-13] нумерация идёт от 0 до 9, тут явно видно что наибольшее число у 7, значит это семь

Будут ещё вопросы пишите
Если что писал 13-ти летний мамкин программист, так что не обессудьте
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.04.2023, 13:57
Помогаю со студенческими работами здесь

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

Сверточная нейросеть keras
Благополучия присутствующим! Хочу обучить сверточную нейросеть на своих img Смотрел примеры, как сеть обучается на базе картинок MNIST...

Нейросеть на keras и tensorflow не запускается
Не получается запуститть проект(запускаю train.py, train_with_whole_dataset.py, train_and_show.py) постоянно ошибка: list assignment index...

"error: expected unqualified-id at end of input" на ровном месте
Собственно вот код - ничего сложного, пример элементарной вложенной косвенности: #include &lt;iostream&gt; using namespace std; ...

Value error: Input 0 is incompatible with layer lstm_1: expected ndim=3 found ndim=2
Всем привет! У меня есть такой код: from keras.layers import Dense from keras.layers import Dropout from keras.models import Model ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru