Для задачи классификации изображений рукописных цифр из набора данных MNIST используется полносвязная нейронная сеть. Датасет MNIST состоит из 60,000 обучающих и 10,000 тестовых изображений размером 28x28 пикселей, представляющих цифры от 0 до 9. Архитектура сети включает входной слой, преобразующий каждое изображение в одномерный массив длиной 784, один или несколько скрытых слоев с функцией активации ReLU для моделирования сложных зависимостей, и выходной слой с 10 нейронами, использующими функцию softmax для получения вероятностей классов.
Процесс обучения нейронной сети начинается с инициализации весов и смещений случайным образом. Входные данные проходят через сеть, и на выходном слое получаем предсказания. Затем рассчитывается функция потерь, определяющая разницу между предсказанными и истинными значениями. С помощью алгоритма обратного распространения ошибки вычисляются градиенты функции потерь по всем параметрам сети, и оптимизатор обновляет веса, чтобы уменьшить ошибку. Этот процесс повторяется для заданного числа эпох или до достижения желаемой точности.
Основные элементы модели включают полносвязные слои (Dense Layer), активационные функции (например, ReLU и softmax), функцию потерь (например, sparse_categorical_crossentropy) и оптимизатор (например, Adam). Полносвязные нейронные сети эффективны для задач классификации благодаря своей способности учиться на данных и выявлять сложные паттерны. В случае с MNIST, целью является обучение модели распознавать рукописные цифры, что достигается путем обучения на большом количестве примеров и корректировки весов нейронов для минимизации ошибки.
Код
```python
import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np
import matplotlib.pyplot as plt
# Загрузка и предобработка данных
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_images = train_images / 255.0
test_images = test_images / 255.0
train_images = train_images.reshape((60000, 28 * 28))
test_images = test_images.reshape((10000, 28 * 28))
# Создание модели
model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
model.add(layers.Dense(10, activation='softmax'))
# Компиляция модели
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# Обучение модели
model.fit(train_images, train_labels, epochs=5, batch_size=128)
# Оценка модели
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Точность на тестовых данных: {test_acc}")
# Использование модели для предсказаний
predictions = model.predict(test_images)
print(np.argmax(predictions[0]))
```
Дополнительные шаги для улучшения модели и анализа результатов
Визуализация результатов
Для лучшего понимания работы модели вы можете визуализировать предсказания модели для нескольких изображений из тестового набора данных. Это поможет понять, как хорошо модель распознает рукописные цифры.
```python
import matplotlib.pyplot as plt
# Визуализация нескольких изображений из тестового набора и предсказаний модели
def plot_image_predictions(images, labels, predictions, num_images=10):
plt.figure(figsize=(10, 10))
for i in range(num_images):
plt.subplot(5, 2, i + 1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(images[i].reshape(28, 28), cmap=plt.cm.binary)
plt.xlabel(f"True: {labels[i]}, Pred: {np.argmax(predictions[i])}")
plt.show()
plot_image_predictions(test_images, test_labels, predictions)
```
Изучение влияния различных параметров
Вы можете экспериментировать с различными параметрами модели, такими как количество нейронов в скрытых слоях, активационные функции и оптимизаторы, чтобы определить их влияние на производительность модели.
1. Изменение количества нейронов:
```python
# Скрытый слой с 256 нейронами
model = models.Sequential()
model.add(layers.Dense(256, activation='relu', input_shape=(28 * 28,)))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, batch_size=128)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Точность на тестовых данных с 256 нейронами: {test_acc}")
```
2. Использование другой функции активации:
```python
# Скрытый слой с функцией активации 'tanh'
model = models.Sequential()
model.add(layers.Dense(512,