vkantor / MIPT_Data_Mining_In_Action_2016

"Data Mining in Action Course", Moscow Institute of Physics and Technologies
209 stars 175 forks source link

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

Open KirillMouraviev opened 7 years ago

KirillMouraviev commented 7 years ago

Я использую сверточную нейросеть со следующей архитектурой: 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%, а как исправил - перестало меняться). Не подскажете, с чем это может быть связано?

KirillMouraviev commented 7 years ago

Ссылка на ноутбук с кодом: https://github.com/KirillMouraviev/Data-Mining-in-action/blob/master/hw4/cifar.ipynb

MarkPotanin commented 7 years ago

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

senya-ashukha commented 7 years ago

Привет, фильтр сайз 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)
KirillMouraviev commented 7 years ago

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

KirillMouraviev commented 7 years ago

С любыми параметрами сети происходит примерно такое: 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 %

KirillMouraviev commented 7 years ago

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

KirillMouraviev commented 7 years ago

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

MarkPotanin commented 7 years ago

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

bitlater commented 7 years ago

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

KirillMouraviev commented 7 years ago

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

Dnekhaev commented 7 years ago

Столкнулся с той же проблемой. На виртуальной машине поднята 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". Были у кого-то похожие проблемы?