我正在学习斯坦福大学的CS231n课程。试图理解为什么会发生以下情况。这是代码。数据的形状为(49000, 32, 32, 3)。
from cs231n.solver import Solverfrom cs231n.classifiers.fc_net import FullyConnectedNetfrom cs231n.data_utils import get_CIFAR10_datadata = get_CIFAR10_data()for k, v in list(data.items()): print(('%s: ' % k, v.shape))best_model = Nonebest_val_acc = -1hidden_dims = [100, 100, 100, 100, 100]reg= 0.0std= 1e-2learning_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 solverprint("Best learning rate found to be: ", best_lr)
问题在于第一个实例,即lr = 1e-4
运行正常,但从第二个实例开始,代码执行变得非常慢。
这不是学习率的问题,因为我尝试了不同的'learning_rates'
值,learning_rates[0]
总是正常进行,但无论实际值是什么,后续的learning_rates
都变得非常慢。
我在Solver()
类中添加了一些print()
语句来尝试调试它。使用lr[0]
时,一切正常进行。但从lr[1]
开始,Solver.train()
内的每个语句似乎都执行得更慢了。
我的猜想是,当第二个FullyConnectedNet()
和Solver()
实例进入内存时,第一个实例和所有参数仍然存在,这可能导致代码执行变慢。我不确定如何测试这一点。
编辑:我想知道如何在一个for
循环中执行所有模型,而不是一个接一个地分别运行它们?我不是在寻找好的学习率。
回答:
我在FullyConnectedNet()
类的实现中犯了一个错误。我没有复制一个列表,而是将其赋值给另一个,然后对其进行了更改,导致第一个隐藏层
的大小变为3072,进而导致了所有减速。
这么基本的错误。但我学到了一些教训。
对不起浪费了大家的时间。