Почему активация tanh работает лучше в Pytorch, чем в Keras?

Вопрос или проблема

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

Код Keras:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Lambda, BatchNormalization
from tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping

a_param = 0.5
activation_type="tanh"

custom_activation = create_activation_function(a_param, activation_type)

input_shape = (100, 100, 4)

model = Sequential()
model.add(tf.keras.layers.InputLayer(input_shape=input_shape))
model.add(Flatten())

model.add(Dense(784))
model.add(BatchNormalization())
model.add(Lambda(custom_activation))

model.add(Dense(30))
model.add(BatchNormalization())
model.add(Lambda(custom_activation))

model.add(Dense(10))
model.add(Lambda(custom_activation))

model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),
              loss="categorical_crossentropy",
              metrics=['accuracy'])

model.summary()

epochs = 30
batch_size = 128

lr_schedule = ReduceLROnPlateau(
    monitor="val_loss", factor=0.5, patience=3, min_lr=1e-6
)

early_stopping = EarlyStopping(
    monitor="val_loss", patience=3, restore_best_weights=True
)

history = model.fit(
    X_train, y_train,
    epochs=epochs,
    batch_size=batch_size,
    validation_data=(X_test, y_test),
    shuffle=True,
    callbacks=[lr_schedule, early_stopping]
)

Код Pytorch:

import torch
import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 100*100 изображения с 4 каналами (RGBA)
        self.fc1 = nn.Linear(100 * 100 * 4, 128)  # Входной слой для изображений 100x100 с 4 каналами
        self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(64, 10)

    def forward(self, x):
        # Изменение формы тензора в вектор длины 100 * 100 * 4
        x = x.view(-1, 100 * 100 * 4)
        x = torch.tanh(self.fc1(x))  # Использование tanh
        x = torch.tanh(self.fc2(x))
        x = self.fc3(x)
        return torch.tanh(x)  # Применение tanh на выходе

В то время как в Keras точность составляет около +/- 10%, в то время как в Pytorch – значительно выше – до 90%. Какова может быть причина этого? Я что-то сделал неправильно или это должно работать таким образом?

Ответ или решение

Почему активация tanh работает лучше в PyTorch, чем в Keras?

Когда вы работаете с нейронными сетями для распознавания написанных кириллических букв, выбор фреймворка и реализация моделей могут существенно повлиять на результаты. В вашем случае вы заметили, что активационная функция tanh работает гораздо лучше в PyTorch, чем в Keras. Давайте разберем несколько факторов, которые могут быть причиной такого поведения.

1. Инициализация весов

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

2. Структура и архитектура модели

Вы использовали различные архитектуры в Keras и PyTorch. В Keras вы добавляете слои с использованием BatchNormalization, который может накладывать ограничения на поведение активационных функций при изменении распределения вводимых данных. Это может привести к неоптимальному обучению, особенно если данные не нормализованы должным образом. В PyTorch вы создаете довольно простую последовательность слоев без специальных нормализаций, что может улучшить производительность активационной функции tanh.

3. Типы используемых активационных функций

В Keras вы создаете кастомную активационную функцию через Lambda, что может быть источником ошибок. PyTorch использует встроенные методы для активации, что позволяет избежать дополнительных накладных расходов на выполнение и минимизирует риск ошибок при написании пользовательского кода.

4. Обработка данных и обратное распространение ошибки

В Keras вы используете tf.keras.layers.InputLayer и другие уже предопределенные слои, которые могут влиять на то, как данные подаются в сеть. PyTorch предлагает более низкоуровневый контроль, позволяя вам непосредственно управлять формированием данных и обработкой ошибок. Это может привести к более точному обратному распространению градиента и лучше усваиваемым признакам.

5. Настройки обучения и гиперпараметры

В Keras вы используете состояние ReduceLROnPlateau и EarlyStopping, что может препятствовать максимально возможному улучшению модели, затрудняя обучение, если алгоритм останавливается на ранней стадии обучения. PyTorch, с другой стороны, использует более прямой подход к обучению, что может быть более эффективным для ваших данных.

6. Оптимизация и вычислительная нагрузка

PyTorch предоставляет более низкоуровневый доступ к вычислениям и позволяет более эффективно использовать доступные вычислительные ресурсы (например, GPU). Это может значительно сократить время обучения и улучшить качество модели, особенно при работе с большими объемами данных.

Заключение

Разница в результатах между Keras и PyTorch при использовании активации tanh может быть связана с рядом факторов, таких как инициализация весов, структура модели, способы обработки данных, настройки обучения и оптимизация. Чтобы улучшить результаты в Keras, рекомендую уделить внимание инициализации весов, нормализации данных и проверке кастомных активационных функций. Тем не менее, если PyTorch обеспечивает существенное улучшение точности, стоит продолжать его дальнейшее использование, учитывая, что каждый фреймворк имеет свои сильные и слабые стороны, и выбор зависит от специфики вашей задачи.

Оцените материал
Добавить комментарий

Капча загружается...