2024-02-29
Глубокое обучение (или deep learning) представляет собой подраздел машинного обучения, в котором используются искусственные нейронные сети с несколькими уровнями (или слоями) для анализа и извлечения признаков из данных. Основная идея заключается в том, что эти нейронные сети могут автоматически изучать представления данных с различных уровней абстракции.
Основные характеристики глубокого обучения:
Использование многослойных структур: Глубокие модели включают в себя множество слоев, каждый из которых обрабатывает данные на разных уровнях абстракции. Эти слои составляют структуру, которая позволяет изучать сложные зависимости в данных.
Обучение представлений: Вместо явного программирования для выполнения задач, глубокое обучение позволяет моделям автоматически извлекать признаки и представления из обучающих данных. Это особенно полезно при работе с большими объемами данных или в задачах, где трудно сформулировать четкие правила.
Использование обратного распространения ошибки: Обучение глубоких нейронных сетей обычно включает в себя процесс обратного распространения ошибки, который позволяет корректировать веса сети на основе разницы между предсказанными и фактическими результатами.
Глубокое обучение находит применение в различных областях, таких как компьютерное зрение, обработка естественного языка, распознавание речи, медицинская диагностика, игры и другие. В последние годы глубокое обучение стало одним из ключевых компонентов развития искусственного интеллекта.
История глубокого обучения включает несколько ключевых этапов, приводящих к его развитию и широкому применению. Ниже представлен обзор исторического контекста и этапов развития глубокого обучения:
Основные концепции и терминология в глубоком обучении включают в себя ряд ключевых понятий. Вот некоторые из них:
Эти термины и концепции являются основой для понимания принципов глубокого обучения и его применения в различных областях.
Структура и принцип работы искусственного нейрона в нейронных сетях могут быть абстрагированы от биологического нейрона, но все же отражают базовые принципы передачи информации в биологических системах. Вот основные компоненты и принципы работы искусственного нейрона:
Искусственный нейрон, таким образом, является базовым строительным блоком искусственных нейронных сетей, а их совокупность создает мощные модели для обработки и анализа данных.
Архитектура нейронных сетей может быть разнообразной и зависит от конкретной задачи, которую они должны решать. Вот некоторые основные типы нейронных сетей и их архитектуры:
Это лишь несколько примеров типов нейронных сетей, и существует множество вариаций и комбинаций этих архитектур для решения различных задач. Выбор конкретной архитектуры зависит от характера данных и требований задачи.
Обратное распространение ошибки (Backpropagation) — это ключевой алгоритм обучения нейронных сетей. Он используется для коррекции весов нейронов сети с целью минимизации ошибки между прогнозами модели и фактическими данными. Процесс обучения включает в себя несколько этапов:
Функция активации: Градиент функции потерь по весам вычисляется с учетом выбранной функции активации. Эта нелинейность позволяет сети моделировать сложные зависимости в данных.
Регуляризация: Для предотвращения переобучения может использоваться регуляризация, такая как L1 или L2 регуляризация, которые добавляют штрафы за большие веса.
Стохастический градиентный спуск (SGD): Вместо использования всех данных для каждого обновления весов, SGD использует случайные подмножества данных (батчи), что ускоряет процесс обучения.
Обратное распространение ошибки является эффективным методом обучения нейронных сетей и лежит в основе большинства современных архитектур глубокого обучения.
Многослойный перцептрон (MLP) представляет собой класс искусственных нейронных сетей, состоящих из трех типов слоев: входного слоя, одного или нескольких скрытых слоев и выходного слоя. Это одна из наиболее распространенных архитектур в области глубокого обучения. Вот основные характеристики MLP:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# Создание модели MLP
model = Sequential()
model.add(Dense(units=128, activation='relu', input_dim=feature_dim)) # Скрытый слой
model.add(Dense(units=64, activation='relu')) # Дополнительный скрытый слой
model.add(Dense(units=output_dim, activation='softmax')) # Выходной слой
# Компиляция модели
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
Архитектура: Количество слоев и количество нейронов в каждом слое являются гиперпараметрами, которые подбираются в зависимости от задачи.
Обучение: Для обучения MLP часто требуется большой объем данных. Нормализация данных и выбор подходящих гиперпараметров играют важную роль.
Функции активации: Выбор подходящей функции активации влияет на способность модели обучаться сложным зависимостям в данных.
MLP является основой для многих более сложных архитектур нейронных сетей, и его успешно применяют в различных областях, таких как классификация, регрессия и обработка изображений.
Сверточные нейронные сети (Convolutional Neural Networks, CNN) представляют собой тип нейронных сетей, специально разработанный для обработки структурированных сеток данных, таких как изображения. CNN обладают способностью извлекать иерархии признаков из входных данных, что делает их мощным инструментом для задач компьютерного зрения. Вот основные характеристики CNN:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
# Создание модели CNN
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(width, height, channels)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(units=128, activation='relu'))
model.add(Dense(units=output_dim, activation='softmax'))
# Компиляция модели
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
Перенос обучения (Transfer Learning): Предобученные модели CNN, такие как VGG, ResNet и Inception, могут быть использованы для передачи обучения на новые задачи.
Аугментация данных (Data Augmentation): Увеличение разнообразия тренировочного набора путем применения случайных трансформаций (вращение, отражение и т. д.) помогает улучшить обобщение модели.
Сверточные нейронные сети в других областях: CNN также применяются в обработке естественного языка (NLP) и других задачах.
CNN эффективно применяются в решении задач распознавания образов, классификации изображений, детекции объектов и других задачах компьютерного зрения.
Рекуррентные нейронные сети (RNN) представляют собой класс нейронных сетей, разработанных для работы с последовательными данными, где важно учитывать контекст и зависимости между элементами последовательности. Основная особенность RNN заключается в использовании обратных связей, которые позволяют информации передаваться от предыдущих шагов последовательности к следующим. Вот основные характеристики RNN:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import SimpleRNN, Dense
# Создание модели RNN
model = Sequential()
model.add(SimpleRNN(units=64, activation='relu', input_shape=(timesteps, features)))
model.add(Dense(units=output_dim, activation='softmax'))
# Компиляция модели
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
Проблема затухающего градиента (Vanishing Gradient Problem): В RNN при обучении на длинных последовательностях может произойти затухание градиента, что затрудняет обучение на дальних временных шагах. Это приводит к тому, что модель забывает информацию из прошлого.
Долгая краткосрочная память (Long Short-Term Memory - LSTM) и Управляемые Рекуррентные Блоки (Gated Recurrent Unit - GRU): Для решения проблемы затухающего градиента были разработаны более сложные архитектуры, такие как LSTM и GRU, которые способны лучше сохранять и управлять памятью.
Bidirectional RNN: RNN, способные обрабатывать последовательности в обоих направлениях, что может быть полезным, например, для предсказания следующего слова в предложении.
RNN предоставляют эффективные инструменты для работы с последовательными данными, и их различные вариации решают проблемы, возникающие при обучении на длинных последовательностях.
Глубокие нейронные сети широко применяются в различных областях благодаря своей способности автоматически извлекать сложные зависимости из данных. Вот несколько областей, в которых глубокие сети демонстрируют выдающиеся результаты:
Глубокие нейронные сети продемонстрировали впечатляющие результаты во многих областях, и их применение продолжает расширяться. Эффективность глубокого обучения обеспечивает новые возможности в решении сложных задач в различных сферах человеческой деятельности.
Выбор функции потерь (loss function) и оптимизатора (optimizer) зависит от конкретной задачи, типа данных и структуры модели. Вот несколько распространенных сценариев:
binary_crossentropy
.hinge
или squared_hinge
.categorical_crossentropy
или sparse_categorical_crossentropy
(если метки классов представлены целыми числами).kullback_leibler_divergence
.mean_squared_error
или mean_absolute_error
.binary_crossentropy
или categorical_crossentropy
(в зависимости от числа классов).mean_squared_logarithmic_error
.SGD
(стохастический градиентный спуск).Adam
, Adagrad
, RMSprop
.Adam
часто используется по умолчанию, так как обычно демонстрирует хорошую производительность в широком спектре задач.LearningRateScheduler
.SGD(momentum=0.9, nesterov=True)
.Adam
или RMSprop
совместно с Batch Normalization может ускорить сходимость.Выбор функции потерь и оптимизатора — это процесс экспериментирования и настройки, и оптимальные значения могут зависеть от конкретной задачи, данных и архитектуры модели.
Регуляризация в глубоком обучении представляет собой набор техник, направленных на предотвращение переобучения модели. Переобучение возникает, когда модель слишком хорошо адаптируется к обучающим данным, включая шум и случайные особенности, что снижает ее обобщающую способность на новых данных. Вот несколько основных методов регуляризации:
Применение этих методов в зависимости от характеристик задачи и данных помогает создавать более устойчивые и обобщающие модели, способные лучше справляться с новыми данными.
Процесс обучения нейронных сетей обычно включает в себя использование трех основных наборов данных: тренировочного, валидационного и тестового. Каждый из этих наборов выполняет свою роль в процессе обучения и оценке модели. Вот их функции и особенности:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
# Разделение данных
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=42)
# Создание модели
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim
=input_dim))
model.add(Dense(units=output_dim, activation='softmax'))
# Компиляция модели
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# Обучение модели
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_val, y_val))
# Оценка модели на тестовом наборе
test_loss, test_acc = model.evaluate(X_test, y_test)
Это базовый пример, и конфигурация может варьироваться в зависимости от конкретной задачи.
Автоэнкодеры (Autoencoders):
1. Определение:
2. Структура:
Энкодер (Encoder): Преобразует входные данные в код.
Код (Code): Компактное представление входных данных.
Декодер (Decoder): Восстанавливает оригинальные данные из кода.
3. Применения:
Сжатие данных: Используются для сжатия и восстановления данных, что может быть полезным в задачах сжатия и передачи данных.
Генерация данных: Могут также использоваться для генерации новых данных, подобных тем, что были в обучающем наборе.
4. Виды автоэнкодеров:
Denoising Autoencoders: Обучаются восстанавливать данные из зашумленных версий самих себя.
Variational Autoencoders (VAE): Генерируют новые сэмплы, а не просто восстанавливают входные данные. Они основаны на байесовском подходе к генерации данных.
Генеративные модели:
1. Определение:
2. Применения:
Генерация изображений: Создание новых изображений, не входящих в обучающий набор.
Генерация текста: Формирование текстовых данных, таких как стихи, рецензии, и т. д.
Создание музыки и изображений: Генерация музыки и изображений с использованием определенных шаблонов.
3. Примеры генеративных моделей:
Генеративные сети (Generative Adversarial Networks - GANs): Состоят из генератора и дискриминатора, которые конкурируют друг с другом. Генератор создает данные, а дискриминатор пытается отличить реальные данные от сгенерированных.
Вариационные автоэнкодеры (Variational Autoencoders - VAE): Кроме обучения компактного представления, они также предоставляют статистический способ генерации новых данных.
4. Применения генеративных моделей:
Создание Deepfakes: Искусственно созданные видео и аудио с использованием генеративных моделей.
Аугментация данных: Генерация дополнительных данных для обучения моделей в медицине, компьютерном зрении и других областях.
Генеративные модели, такие как GANs и VAEs, предоставляют инструменты для создания новых данных, что является мощным подходом в машинном обучении и искусственном интеллекте. Autoencoders, с другой стороны, могут быть использованы как основной компонент для изучения компактных представлений данных.
Перенос обучения (Transfer Learning):
1. Определение:
2. Принципы переноса обучения:
Предварительное обучение: Модель предварительно обучается на большом объеме данных и широко применяется к задачам, где доступны ограниченные данные.
Файнтюнинг: После предварительного обучения модель может быть дообучена (файнтюнинг) на относительно небольшом объеме данных, специфичных для целевой задачи.
3. Применения:
Классификация изображений: Модель, обученная на большом наборе данных, может быть использована для классификации новых изображений в схожих классах.
Обработка естественного языка (NLP): Перенос обучения применяется в задачах обработки текстов, таких как определение тональности или классификация тем.
4. Преимущества:
Уменьшение объема данных: Позволяет использовать знания, полученные на одной задаче, для улучшения обучения на другой задаче, даже если данных для второй задачи недостаточно.
Эффективное использование вычислительных ресурсов: Экономит вычислительные ресурсы, так как требует менее объемных данных для обучения.
Трансферное обучение (Domain Adaptation):
1. Определение:
2. Принципы трансферного обучения:
Исследование структур: - Если структура данных в задачах похожа, то перенос обучения может быть эффективным.
Исследование признаков: - Перенос обучения может также использоваться для передачи знаний о признаках от одной задачи к другой.
3. Применения:
4. Преимущества:
Адаптация к новым данным: Позволяет модели быстро адаптироваться к новым данным, что может быть особенно полезным в изменяющихся условиях.
Преодоление различий в доменах: Позволяет обученной модели эффективно справляться с различиями в структуре и признаках между доменами.
Оба термина, “перенос обучения” и “трансферное обучение”, в разных источниках могут использоваться как синонимы, и их значения могут перекрываться. Оба подхода важны в области машинного обучения и глубокого обучения для эффективного использования знаний в различных контекстах и условиях.
Обработка естественного языка (NLP) представляет собой область исследований и приложений в области искусственного интеллекта, которая фокусируется на взаимодействии между компьютерами и естественным языком. В последние годы NLP переживает значительный рост и инновации благодаря прорывам в глубоком обучении и обработке больших данных. Вот некоторые из последних достижений в области NLP:
BERT (Bidirectional Encoder Representations from Transformers): Представляет собой трансформаторную модель, которая обучается на больших объемах текста и может эффективно понимать контекст и взаимосвязь между словами в предложении. BERT побил рекорды во многих задачах NLP.
GPT-3 (Generative Pre-trained Transformer 3): Это одна из самых крупных и мощных моделей трансформатора. Она способна генерировать чрезвычайно качественный текст и обладает удивительными способностями к обучению без учителя.
T5 (Text-To-Text Transfer Transformer): Модель, представленная Google, подходит для широкого спектра NLP-задач, формулируя и решая их в виде преобразования текста.
XLNet: Комбинация идеи авторегрессии из GPT и идеи перестановки из BERT. Эта модель демонстрирует выдающиеся результаты в задачах вопросно-ответного формата.
UniLM (Unified Language Model): Модель, разработанная Microsoft, которая обучается на различных задачах NLP одновременно. Это позволяет модели обладать обширными языковыми знаниями и применять их в различных контекстах.
ERNIE (Enhanced Representation through kNowledge Integration): Модель, разработанная Baidu, которая внедряет знания в обучение модели, позволяя ей лучше понимать семантику и контекст.
ULMFiT (Universal Language Model Fine-tuning): Модель, разработанная OpenAI, которая позволяет эффективно дообучать языковые модели на специфических доменах с использованием ограниченных размеченных данных.
ELMo (Embeddings from Language Models): Использует предварительно обученные языковые модели для создания более богатых эмбеддингов слов, учитывающих семантические и контекстные особенности.
CLIP (Contrastive Language-Image Pre-training): Разработана OpenAI, модель CLIP способна понимать связь между текстовой и визуальной информацией, что делает ее многомодальной.
DALL-E: Также от OpenAI, модель DALL-E способна генерировать уникальные изображения на основе текстового описания.
Эти достижения подчеркивают значительный прогресс в области обработки естественного языка и предоставляют мощные инструменты для решения различных задач, таких как вопросно-ответный формат, обработка текста и генерация контента. Однако, стоит отметить, что такие мощные модели требуют больших вычислительных ресурсов и данных для обучения.
Искусственный интеллект, в том числе методы глубокого обучения, применяется в различных областях для решения разнообразных задач. Вот краткий обзор нескольких областей применения:
Эти области представляют лишь небольшую часть того, как искусственный интеллект и глубокое обучение применяются в современном мире. Развитие технологий в этих областях продолжает ускоряться, открывая новые возможности для решения сложных задач.
Текущие методы искусственного интеллекта и глубокого обучения обладают значительными достижениями, но также сопровождаются рядом ограничений и вызовов. Некоторые из ключевых ограничений включают в себя:
Работа в области искусственного интеллекта активно ведется над преодолением этих ограничений, и исследователи стремятся сделать модели более надежными, интерпретируемыми и приспособленными к реальным проблемам.
С развитием технологий искусственного интеллекта и глубокого обучения возникают разнообразные этические вопросы и проблемы безопасности, которые нужно учитывать при разработке и использовании подобных технологий. Некоторые из ключевых этических аспектов и проблем безопасности включают в себя:
Сбор и хранение данных: Использование больших объемов данных для обучения моделей может включать в себя личную информацию. Как обеспечить конфиденциальность данных в процессе их сбора и хранения?
Деконфиденциализация: Возможность сочетания различных источников данных для деконфиденциализации анонимных данных и идентификации личной информации.
Биас в данных: Если обучающие данные содержат биасы, то и модель может передавать эти биасы в своих решениях. Как обеспечить справедливость и устранить предвзятость?
Обеспечение разнообразия в данных: Развитие методов и технологий, направленных на создание более разнообразных и сбалансированных обучающих наборов.
Черный ящик: Многие глубокие модели считаются “черными ящиками” — труднопонимаемыми. Как обеспечить интерпретируемость моделей, особенно в чувствительных областях, таких как медицина и правосудие?
Объяснение решений: Необходимость создания методов и подходов для объяснения, почему модель принимает определенные решения, особенно в критических сферах.
Атаки на модели: Возможность проведения атак, таких как внедрение шума в данные для искажения результатов или атаки на параметры модели.
Ответственность за модели: Как организации и индивиды могут быть ответственны за нежелательные последствия, вызванные использованием их моделей?
Нежелательные последствия: Применение технологий искусственного интеллекта может иметь нежелательные социальные, экономические и культурные последствия.
Справедливое распределение выгод: Как обеспечить, чтобы выгоды от технологий ИИ распределялись справедливо и равномерно?
Манипуляция данными: Возможность манипулировать входными данными для введения в заблуждение моделей.
Атаки на системы обучения: Защита от атак, направленных на подрыв систем обучения, включая внедрение зловредного кода или атаки на серверы.
Автономные оружейные системы: Этика применения искусственного интеллекта в военных технологиях и решение вопросов, связанных с автономными оружейными системами.
Риски безопасности: Возможные риски безопасности, связанные с использованием автономных технологий, таких как автономные автомобили.
Эти этические вопросы и проблемы безопасности требуют широкого обсуждения и разработки соответствующих стандартов и правил. Многие организации и исследовательские группы работают над созданием нормативных рамок и этических принципов для разработки и использования искусственного интеллекта.
Развитие технологий в области автоматизации, автономных систем и искусственного интеллекта предоставляет множество перспектив и вносит существенные изменения в различные сферы человеческой деятельности. Ниже приведены некоторые ключевые тенденции в этих областях:
Эти тенденции отражают широкий спектр возможностей и вызовов, связанных с автоматизацией, автономными системами и искусственным интеллектом в современном мире. Они направлены на создание более эффективных, инновационных и устойчивых решений для различных областей человеческой деятельности.
TensorFlow и PyTorch - две из наиболее популярных библиотек для глубокого обучения. Они предоставляют удобные интерфейсы для создания, обучения и развертывания нейронных сетей. Вот краткое описание каждой из них:
Основные особенности:
Преимущества:
Пример кода:
import tensorflow as tf
# Определение простой нейронной сети
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
# Компиляция и обучение модели
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_data, train_labels, epochs=5)
Основные особенности:
Преимущества:
Пример кода:
import torch
import torch.nn as nn
import torch.optim as optim
# Определение простой нейронной сети
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
# Инициализация модели, функции потерь и оптимизатора
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# Обучение модели
for epoch in range(5):
for data, target in train_loader:
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
Обе библиотеки обладают обширными возможностями и хорошей документацией. Выбор между TensorFlow и PyTorch может зависеть от ваших предпочтений в стиле программирования и конкретных требований вашего проекта.
Давайте рассмотрим простые примеры кода для построения и обучения нейронных сетей с использованием библиотек TensorFlow и PyTorch. В обоих примерах будет создана небольшая нейронная сеть для задачи классификации на основе известного набора данных MNIST (изображения рукописных цифр).
import tensorflow as tf
from tensorflow.keras import layers, models
# Загрузка данных MNIST
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
# Нормализация данных и изменение формы для подачи в нейронную сеть
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
# Преобразование меток в формат one-hot
train_labels = tf.keras.utils.to_categorical(train_labels)
test_labels = tf.keras.utils.to_categorical(test_labels)
# Определение архитектуры нейронной сети
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
# Компиляция модели
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# Обучение модели
model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_split=0.2)
# Оценка модели на тестовых данных
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Точность на тестовых данных: {test_acc}")
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
from torchvision.datasets import MNIST
from torch.utils.data import DataLoader, random_split
# Загрузка данных MNIST
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
mnist_dataset = MNIST(root='./data', train=True, download=True, transform=transform)
train_size = int(0.8 * len(mnist_dataset))
train_data, val_data = random_split(mnist_dataset, [train_size, len(mnist_dataset) - train_size])
# Создание загрузчиков данных
train_loader = DataLoader(train_data, batch_size=64, shuffle=True)
val_loader = DataLoader(val_data, batch_size=64, shuffle=False)
# Определение архитектуры нейронной сети
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(28 * 28, 64)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(64, 10)
def forward(self, x):
x = x.view(-1, 28 * 28)
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
# Инициализация модели, функции потерь и оптимизатора
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# Обучение модели
for epoch in range(5):
model.train()
for data, target in train_loader:
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
# Оценка модели на валидационных данных
model.eval()
correct = 0
total = 0
with torch.no_grad():
for data, target in val_loader:
output = model(data)
_, predicted = torch.max(output.data, 1)
total += target.size(0)
correct += (predicted == target).sum().item()
print(f"Точность на валидационных данных: {correct / total}")