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

Запустите свою среду IDE, если вы еще не сделали этого, и продолжайте читать.

СОХРАНЕНИЕ МОДЕЛЕЙ

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

Keras сохраняет модели в формате .h5, поэтому, если вы пропустили установку h5py в первом опубликованном мною руководстве, пожалуйста, запустите

pip3 install h5py

Нам также понадобится matplotlib для визуализации нашего изображения, поэтому запустите

pip3 install matplotlib

Вот код для первого урока

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD

(train_x, train_y) , (test_x, test_y) = mnist.load_data()
#train_x = train_x.astype('float32') / 255
#test_x = test_x.astype('float32') / 255
print(train_x.shape)
print(train_y.shape)
print(test_x.shape)
print(test_y.shape)
train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)
train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)
model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))
model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)
accuracy = model.evaluate(x=test_x,y=test_y,batch_size=32)
print("Accuracy: ",accuracy[1])

Чтобы сохранить модель, просто добавьте ниже после model.fit ()

model.save("mnist-model.h5")

ВЫВОД

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

В своем коде закомментируйте

model.fit

и вместо этого замените следующим

model.load_weights("mnistmodel.h5")

Теперь наш код выглядит так

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
(train_x, train_y) , (test_x, test_y) = mnist.load_data()
#train_x = train_x.astype('float32') / 255
#test_x = test_x.astype('float32') / 255
print(train_x.shape)
print(train_y.shape)
print(test_x.shape)
print(test_y.shape)
train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)
train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)
model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))
model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnist-model.h5")
#model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)
#model.save("mnistmodel.h5")
accuracy = model.evaluate(x=test_x,y=test_y,batch_size=32)
print("Accuracy: ",accuracy[1])

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

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

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

img = test_x[130]
test_img = img.reshape((1,784))
img_class = model.predict_classes(test_img)
prediction = img_class[0]
classname = img_class[0]
print("Class: ",classname)

Здесь мы просто выбираем случайное изображение, в данном случае с индексом 130 из тестового набора, мы создаем плоскую копию, которая меняет форму на

(1,784)

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

Закомментируйте model.evaluate в коде, добавьте вышеуказанное и запустите.

Ваш результат должен быть таким:

Class: 6

Теперь, когда у нас есть прогноз, мы используем matplotlib для отображения изображения и его прогнозируемого класса.

img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

Операция изменения формы здесь необходима, чтобы позволить matplotlib отображать изображение

Ваш обновленный код должен быть таким

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
import matplotlib.pyplot as plt

(train_x, train_y) , (test_x, test_y) = mnist.load_data()
train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)
train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)
model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))
model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnistmodel.h5")
img = test_x[130]
test_img = img.reshape((1,784))
img_class = model.predict_classes(test_img)
prediction = img_class[0]
classname = img_class[0]
print("Class: ",classname)
img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

Запустите это, и ваш результат должен быть таким

ВОТ И ВСЕ! Абсолютно просто, мы построили базовую систему распознавания цифр.

Я рекомендую вам попробовать разные индексы тестовых изображений и посмотреть, каков будет результат.

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

Запустите код ниже

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
import matplotlib.pyplot as plt
from keras.preprocessing import image

(train_x, train_y) , (test_x, test_y) = mnist.load_data()
train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)
train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)
model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))
model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnistmodel.h5")
img = image.load_img(path="testimage.png",grayscale=True,target_size=(28,28,1))
img = image.img_to_array(img)
test_img = img.reshape((1,784))
img_class = model.predict_classes(test_img)
prediction = img_class[0]
classname = img_class[0]
print("Class: ",classname)
img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

Вы можете заметить здесь несколько новых вещей. Сначала мы импортировали изображение из keras.preprocessing.

Далее мы добавили

img = image.load_img(path="testimage.png",grayscale=True,target_size=(28,28,1))
img = image.img_to_array(img)

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

Затем мы преобразовали изображение в массив пикселей, вот и все.

Запустите его и проверьте результат самостоятельно, будет ли прогноз 3 или нет.

Любые вопросы или комментарии следует оставлять в поле для комментариев ниже, вы также можете связаться со мной в твиттере через @johnolafenwa.

Если вам нравится этот урок, хлопайте в ладоши.

Следующий пост будет об использовании сверточных нейронных сетей, что повысит нашу точность до 99% !!! Просто оставайся на связи.