Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
KirillMouraviev opened this issue Nov 30, 2016 · 11 comments

Comments

@KirillMouraviev
Copy link

Я использую сверточную нейросеть со следующей архитектурой:
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
Copy link
Author

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

@MarkPotanin
Copy link

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

@senya-ashukha
Copy link
Collaborator

Привет, фильтр сайз 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
Copy link
Author

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

@KirillMouraviev
Copy link
Author

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

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

@KirillMouraviev
Copy link
Author

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

@MarkPotanin
Copy link

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

@bitlater
Copy link

bitlater commented Dec 3, 2016

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

@KirillMouraviev
Copy link
Author

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

@Dnekhaev
Copy link

Dnekhaev commented Dec 6, 2016

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants