vkantor/MIPT_Data_Mining_In_Action_2016

Веса нейросети почти не меняются в процессе обучения

KirillMouraviev opened this issue · 11 comments

Я использую сверточную нейросеть со следующей архитектурой:
input_layer = lasagne.layers.InputLayer(shape=(None, 3, 32, 32), input_var=input_X)
conv1 = lasagne.layers.Conv2DLayer(input_layer, num_filters = 16, filter_size = (10, 10))
pool1 = lasagne.layers.MaxPool2DLayer(conv1, pool_size = (2, 2))
dense1 = lasagne.layers.DenseLayer(pool1, num_units = 50, nonlinearity = sigmoid)
dense_output = lasagne.layers.DenseLayer(dense1, num_units = 10, nonlinearity=softmax)

Все функции для обучения скопированы с домашки 3 (mnist). Там свертка с примерно такой же архитектурой работает прекрасно (98.5-98.6%).

Когда ставлю ее обучаться на датасете cifar, loss меняется лишь в пределах 10^(-4), а качество на трейне и тесте не меняется за 100 эпох никак, оставаясь на уровне около 10%. Правильность передачи данных на вход нейросети проверял (когда передача была неправильной, качество скакало на уровне 10 +- 1%, а как исправил - перестало меняться). Не подскажете, с чем это может быть связано?

такая же проблема, нашел решение?

Привет, фильтр сайз 10 это плохо. Тем более всего один слой. Попробуй так

    input_x, target_y = T.tensor4("Input value"), T.vector("Target value", dtype='int32')

    net = layers.InputLayer(input_shape, input_x, name='Input')

    net = Conv(net, 32, 5, pad=2)
    net = layers.MaxPool2DLayer(net, 3, stride=2)

    net = Conv(net, 64, 5, pad=2)
    net = layers.MaxPool2DLayer(net, 3, stride=2)

    net = Conv(net, 128, 5, pad=2)
    net = layers.MaxPool2DLayer(net, 3, stride=2)

    net = Dence(net, 100, **kwargs)
    net = Dence(net, 100, **kwargs)
    net = Dence(net, 10,   nonlinearity=softmax, **kwargs)

То же самое. Кажется, я все-таки неправильно передаю данные

С любыми параметрами сети происходит примерно такое:
Epoch 1 of 100 took 19.773s
training loss (in-iteration): 2.310424
train accuracy: 9.98 %
validation accuracy: 10.00 %
Epoch 2 of 100 took 19.819s
training loss (in-iteration): 2.308803
train accuracy: 9.96 %
validation accuracy: 10.00 %
Epoch 3 of 100 took 19.749s
training loss (in-iteration): 2.307727
train accuracy: 9.97 %
validation accuracy: 10.00 %
Epoch 4 of 100 took 19.666s
training loss (in-iteration): 2.306727
train accuracy: 9.84 %
validation accuracy: 10.00 %
Epoch 5 of 100 took 19.694s
training loss (in-iteration): 2.305917
train accuracy: 9.80 %
validation accuracy: 10.00 %
Epoch 6 of 100 took 19.690s
training loss (in-iteration): 2.305282
train accuracy: 9.82 %
validation accuracy: 10.00 %
Epoch 7 of 100 took 19.694s
training loss (in-iteration): 2.304751
train accuracy: 9.81 %
validation accuracy: 10.00 %
Epoch 8 of 100 took 19.525s
training loss (in-iteration): 2.304332
train accuracy: 9.83 %
validation accuracy: 10.00 %
Epoch 9 of 100 took 19.479s
training loss (in-iteration): 2.304003
train accuracy: 9.88 %
validation accuracy: 10.00 %

Метод обновления весов adadelta работает! Он достигает accuracy 30-40% за 4-5 эпох (дальше пока не запускал). Всё остальное из lasagne.updates не увеличивает accuracy никак за десятки эпох

Кажется, cifar очень чувствителен к методу обучения и learning rate в отличии от mnist, на котором почти любая адекватная нейросеть показвыает over95%

adam и регуляризация l2 - 65

У меня такая же проблема, запускал вот этот ноутбук: https://github.com/jseppanen/cifar_lasagne/blob/master/cifar_lasagne.ipynb
Вроде accuracy растет стабильно, как в ноутбуке, но очень медленно, одна итерация на последней архитектуре занимает около 600-700 сек у меня на CPU...

Автор запускал данный ноутбук на GPU, и у него 88 с. работает. На GPU сверточные нейросети обучаются раз в 7 быстрее, чем на CPU, поэтому 600-700 секунд - нормальное время

Столкнулся с той же проблемой. На виртуальной машине поднята Ubuntu 16.04 (g++-5), с самого начала обучения training loss сразу мал (~2.30), а точность 10%, перепробовал все методы обновления, adadelta, о котором писали выше, не помогает. Не обучаются даже сети на denselayer (что очень странно: обучаются сети только без скрытых слоев, как только добавляю скрытый - тот же баг). Тот же ноутбук на Ubuntu Xerus 16.10 ругался на неустановленный g++ и категорически не запускался с последней его версией (g++-6). Гугл подсказал, что надо поставить g++-5. Как итог, работают dense layer (только без скрытых слоев), maxpool, не работают сверточные слои с ошибкой Method not found "perform". Были у кого-то похожие проблемы?