Создание экземпляров Neural Net и обучение их различным скоростям обучения с использованием цикла for. Второй экземпляр вперед всегда застревает - PullRequest
0 голосов
/ 09 января 2019

Я делаю Стэнфордский CS231n. Пытаясь понять, почему происходит следующее. Вот код Данные имеют форму (49000, 32, 32, 3).

from cs231n.solver import Solver
from cs231n.classifiers.fc_net import FullyConnectedNet
from cs231n.data_utils import get_CIFAR10_data

data = get_CIFAR10_data()
for k, v in list(data.items()):
  print(('%s: ' % k, v.shape))

best_model = None
best_val_acc = -1
hidden_dims = [100, 100, 100, 100, 100]
reg= 0.0
std= 1e-2
learning_rates = [1e-4, 1e-5, 1e-6, 1e-7]
for lr in learning_rates:
    model = FullyConnectedNet(hidden_dims, reg= reg, weight_scale= std, normalization= None)
    solver = Solver(model, data, num_epochs = 10,
               batch_size = 200, update_rule= 'adam',
               lr_decay = 0.95,
               optim_config= {
                   'learning_rate': lr,
               },
               verbose = True, print_every= 1000)
    solver.train()
    val_acc = solver.check_accuracy(data['X_val'], data['y_val'])
    if val_acc > best_val_acc:
        best_val_acc = val_acc
        best_model = model
        best_lr = lr
    del model
    del solver
print("Best learning rate found to be: ", best_lr)

Проблема в том, что первый экземпляр, то есть lr = 1e-4 работает нормально, но со второго экземпляра выполнение кода происходит очень медленно.

Это не проблема скорости обучения, потому что я пробовал разные значения 'learning_rates', и learning_rates[0] всегда работает нормально, но очень медленно, со следующими learning_rates, независимо от того, какие фактические значения.

Я добавил несколько операторов print() в класс Solver(), чтобы попытаться отладить его. С lr[0] все идет номинально. Но, начиная с lr[1], каждое утверждение внутри Solver.train(), похоже, выполняется медленнее.

Моя гипотеза состоит в том, что, когда вторые экземпляры FullyConnectedNet() и Solver() входят в память, первые экземпляры все еще там вместе со всеми параметрами, и, возможно, это вызывает замедление выполнения кода. Я не уверен, как это проверить, хотя.

Редактировать: я хочу знать, как мне выполнить все модели в одном цикле for вместо того, чтобы запускать их по отдельности? Я не ищу хороших курсов обучения.

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Вы знакомы с тем, как работает Gradient Descent? Если вы представляете функцию стоимости как некоторый контур на трехмерном графике, градиентный спуск делает небольшие шаги к глобальному минимуму. Скорость обучения говорит о том, насколько велики эти шаги.

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

Я не знаком с библиотеками cs231n, если они не оптимизированы для параллельных вычислений, вы можете попробовать обучить разные модели в разных потоках? Это ускорит общее время выполнения, однако градиентный спуск для меньших скоростей обучения все равно займет время для выполнения, в зависимости от того, насколько велик ваш размер обучения, даже если вы используете мини-пакеты.

0 голосов
/ 10 января 2019

Я допустил ошибку в реализации класса FullyConnectedNet(). Вместо того, чтобы копировать список, я назначил его другому, а затем внес в него изменения, из-за которых 1st hidden layer достиг размера 3072`, что привело ко всему замедлению.

Такая основная ошибка. Но я выучил некоторые уроки.

Извините, что тратит время всех здесь.

0 голосов
/ 09 января 2019

Скорость обучения, используемая в learning_rates = [1e-4, 1e-5, 1e-6, 1e-7], чрезвычайно низка, не удивительно, что обучение занимает слишком много времени для обычного ПК. Значение learning_rate[0] само по себе намного ниже, чем значения, обычно используемые в различных руководствах, которые я проверял. (Например, у меня в руках сейчас книга Жерона «Практическое машинное обучение с Scikit-Learn» и «TensorFlow », и значение используемого показателя обучения обычно составляет 0,01)

Если вам нужно понять, как внедрить и обучить нейронную сеть, тогда вам не нужны эти конкретные значения, я предлагаю вам повысить скорость обучения (например: [1e-2, 1e-3, 1e-4]) и проверить, как это влияет на производительность модели.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...