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

1

Я делаю Стэнфордский 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 а не запускать их по отдельности? Я не ищу хорошие показатели обучения.

Теги:
machine-learning
oop
neural-network

3 ответа

0

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

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

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

0

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

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

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

0

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

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

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

  • 0
    Это именно то, что я хочу знать, как мне выполнить их в цикле for ? Я знаю, что уровень обучения низкий, но сейчас это не моя проблема.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню