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

Импорт данных MNIST

База данных MNIST (модифицированная база данных Национальный институт стандартов и технологий) представляет собой большую базу данных рукописных цифр, которая обычно используется для обучения различных систем обработки изображений. База данных также широко используется для обучения и тестирования в области машинного обучения. Он был создан путем повторного смешивания образцов из оригинальных наборов данных NIST.

из keras.datasets импортировать mnist
импортировать numpy как np
импортировать matplotlib.pyplot как plt

(X_train, _), (X_test, _) = mnist.load_data()
all_data = np.concatenate((X_train, X_test))
all_data.shape

Визуализация данных

def print_first_9(data):
fig = plt.figure()
для i в диапазоне (9):
plt.subplot(3,3,i+1)
plt.tight_layout()
plt.imshow(data[i], interpolation='none')
plt.title("Digit: {}".format(i))
plt.xticks([])
plt.yticks([])

print_first_9(all_data[-9:])

Нормализовать данные

Идея метода нормализации заключается в подготовке данных перед применением моделей машинного обучения. Целью нормализации является приведение номинальных значений числовых столбцов данных к общему масштабу без искажения различий в диапазоне значений. Кроме того, нормализация данных между 0 и 1 помогает не распространять ошибки в модели.

(X_train_full, y_train_full), (X_test, y_test) = mnist.load_data()
X_train_full = X_train_full.astype(np.float32) / 255
X_test = X_test.astype(np.float32) / 255
X_train, X_valid = X_train_full[:-5000], X_train_full[-5000:]
y_train, y_valid = y_train_full[:-5000], y_train_full[-5000:]

Импортировать библиотеки и определять меру точности

Keras — это высокоуровневый API нейронных сетей, написанный на Python и способный работать поверх TensorFlow, CNTK или Theano. Он был разработан с акцентом на возможность быстрого экспериментирования.

импортировать tensorflow как tf
из tensorflow import keras

def rounded_accuracy(y_true, y_pred):
return keras.metrics.binary_accuracy(tf.round(y_true), tf.round(y_pred)
)

Автокодировщик

Автоэнкодер — это тип искусственной нейронной сети, используемый для обучения эффективному кодированию данных без присмотра. Целью автоэнкодера является изучение представления (кодирования) набора данных, как правило, для уменьшения размерности, путем обучения сети игнорировать шум сигнала. Наряду со стороной сокращения изучается сторона восстановления, где автоэнкодер пытается сгенерировать из сокращенного кодирования представление, максимально близкое к его исходному входу, отсюда и его название.

inputs = keras.Input(shape=[28,28])
encode = keras.layers.Flatten()(inputs)
encode = keras.layers.Dense(392, активация=” selu")(кодировать)
кодировать = keras.layers.Dense(196, активация="selu")(кодировать)
декодировать = keras.layers.Dense(392, активация="selu", input_shape =[196])(кодировать)
декодировать = keras.layers.Dense(784, активация = «сигмоид»)(декодировать)
выходы = keras.layers.Reshape([28, 28])( декодировать)
func_model = keras.Model(входы, выходы)

Компиляция и запуск функциональной модели

Здесь мы используем 6 эпох для обучения модели, чего должно быть достаточно для минимальной точности.

func_model.compile(loss=”binary_crossentropy”, optimizer=keras.optimizers.SGD(lr=1.5), metric=['rounded_accuracy'])

history = func_model.fit(X_train, X_train, эпохи=6,validation_data=[X_valid, X_valid])

Сюжет

Вот история запуска обученной модели на протяжении 6 эпох.

plt.plot(history.history[‘потеря’])

plt.plot(history.history[‘val_loss’])

Модель хорошо обучена, поскольку мы видим сходимость потерь и vall_loss.

Входные данные и связанные с ними выходные данные в модели

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

def plot_image(image):
plt.imshow(image, cmap="binary")
plt.axis("off")
def show_reconstructions(model, images=X_valid, n_images=10):
реконструкции = model.predict(images[:n_images])
fig = plt.figure(figsize=(n_images * 1,5, 3))
для image_index в диапазоне( n_images):
plt.subplot(2, n_images, 1 + image_index)
plot_image(images[image_index])
plt.subplot(2, n_images, 1 + n_images + image_index)
plot_image(реконструкции[image_index])
show_reconstructions(func_model)

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