Size: a a a

Data Science Kazakhstan (DS/ML kz)

2020 April 25

MK

Minhyun Kim in Data Science Kazakhstan (DS/ML kz)
Stepan
Всем привет! Подскажите, пожалуйста. Вопрос про использование предобученных сетей, заморозку слоев и про обучение только части сети.

В задаче нужно находить точки на изображении. Использую resnet50 предобученную на ImageNet. Заменяю выход последнего слоя с 1000 классов на количество точек*2 (х и у координата)

import torchvision.models as models
...
model = models.resnet50(pretrained=True, )
model.fc = nn.Linear(model.fc.in_features, 2 * NUM_PTS, bias=True)

Для начала хотел попробовать обучить только последний fc слой

# freeze all layers
for param in model.parameters():
param.requires_grad = False

# train only head
model.fc.weight.requires_grad = True
model.fc.bias.requires_grad = True

Я рассчитывал, что обучение у такой сети будет гораздо быстрей, чем когда все слои разморожены. Но на мое удивление скорость осталась практически той же самой на эпоху 20 мин vs 17 минут

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

S

Stepan in Data Science Kazakhstan (DS/ML kz)
Спасибо!
на всякий случай скину еще оптимизатор, но там напутать сложно
optim.Adam([p for p in model.parameters() if p.requires_grad], lr=args.learning_rate, amsgrad=True)
источник

Е

Елес in Data Science Kazakhstan (DS/ML kz)
Ого
источник

S

Stepan in Data Science Kazakhstan (DS/ML kz)
я понимаю что forward остался прежним, но backward то должен был стать короче, меньше градиентов считать следовательно общее время на эпоху должно было бы сократиться
источник

Е

Елес in Data Science Kazakhstan (DS/ML kz)
Stepan
я понимаю что forward остался прежним, но backward то должен был стать короче, меньше градиентов считать следовательно общее время на эпоху должно было бы сократиться
Да
источник

MK

Minhyun Kim in Data Science Kazakhstan (DS/ML kz)
Stepan
Спасибо!
на всякий случай скину еще оптимизатор, но там напутать сложно
optim.Adam([p for p in model.parameters() if p.requires_grad], lr=args.learning_rate, amsgrad=True)
по сути, ты уже прописал
required_grad=False
поэтому можно в оптим закинуть тупо model.parameters()
источник

AB

Azamat Berdysh in Data Science Kazakhstan (DS/ML kz)
Stepan
я понимаю что forward остался прежним, но backward то должен был стать короче, меньше градиентов считать следовательно общее время на эпоху должно было бы сократиться
Оценка градиент в реверс мод автодифференцировании, при условии что ты уже высчитываешь форвард пас, очень дешёвая (O(1)). Более того при бакпропе, чтобы оценить градиенту для слоя, алгоритму необходимо оценить градиенты для всех последующих слоёв. Соответственно, чем ближе твой размороженный слой ко входу, тем меньше вычислений ты экономишь (для первого слоя не экономишь вообще ничего)
источник

S

Stepan in Data Science Kazakhstan (DS/ML kz)
Спасибо! Можно, пожалуйста, поподробней, почему для градиента нужны последующие слои? Или указать на что почитать, а то запутался. Вроде как идем от выхода сети к началу.
источник

S

Stepan in Data Science Kazakhstan (DS/ML kz)
Была идея, которая пока не подтвердилась на практике. Взяв предобученную сеть и заменив у нее последний слой, чтобы не гонять ошибку сразу по всей сети, я думал постепенно размораживать слои. Подучил первый слой, он теперь не создает такую огромную ошибку, потом разморозил второй, подучил их оба и т.д. но результаты такого обучения получились хуже чем когда просто учил всю сеть сразу целиком. Может просто совпадение и нужно больше опытов провести
источник
2020 April 26

IS

Iska Shaikh in Data Science Kazakhstan (DS/ML kz)
Stepan
Была идея, которая пока не подтвердилась на практике. Взяв предобученную сеть и заменив у нее последний слой, чтобы не гонять ошибку сразу по всей сети, я думал постепенно размораживать слои. Подучил первый слой, он теперь не создает такую огромную ошибку, потом разморозил второй, подучил их оба и т.д. но результаты такого обучения получились хуже чем когда просто учил всю сеть сразу целиком. Может просто совпадение и нужно больше опытов провести
когда настанет время когда я буду понимать вас😂
источник

A

Aykhan in Data Science Kazakhstan (DS/ML kz)
Stepan
Была идея, которая пока не подтвердилась на практике. Взяв предобученную сеть и заменив у нее последний слой, чтобы не гонять ошибку сразу по всей сети, я думал постепенно размораживать слои. Подучил первый слой, он теперь не создает такую огромную ошибку, потом разморозил второй, подучил их оба и т.д. но результаты такого обучения получились хуже чем когда просто учил всю сеть сразу целиком. Может просто совпадение и нужно больше опытов провести
О, я это на курсе нлп от Самсунга на Степике слышал
источник

S

Sneddy in Data Science Kazakhstan (DS/ML kz)
https://m.habr.com/ru/company/yandex/blog/498856/

Очень Продвинутый курс по разработке на python
источник

AB

Azamat Berdysh in Data Science Kazakhstan (DS/ML kz)
Stepan
Была идея, которая пока не подтвердилась на практике. Взяв предобученную сеть и заменив у нее последний слой, чтобы не гонять ошибку сразу по всей сети, я думал постепенно размораживать слои. Подучил первый слой, он теперь не создает такую огромную ошибку, потом разморозил второй, подучил их оба и т.д. но результаты такого обучения получились хуже чем когда просто учил всю сеть сразу целиком. Может просто совпадение и нужно больше опытов провести
На форвард пасе ты идешь от входа к выходу высчитывая значения каждого узла в твоём вычислительном графе. В след за этим, в бэквард пасе ты идёшь наоборот от выхода к входу и используешь уже посчитанные в форвард пасе значения узлов чтобы оценить пуллбэки (aka vector-Jacobian products).
Соответственно если ты тренируешь все слои, то он может апдейтить их всех за один форвард пас и один бэквард пас.
Тогда как если ты тренируешь слои по отдельности, то при тренировке каждого слоя ему надо пересчитывать заново форвард пас (который стоит столько же как и в первом случае) и бэквард пас (который для одного конкретного слоя дешевле, так как параметров меньше, но не на много, так как в первом случае ты высчитываешь градиенту для пэрент ноуда 1 раз и реюзаешь её для всех чайлд ноудов и поэтому стоимость амортизируется по всем чайлдам)
источник

AB

Azamat Berdysh in Data Science Kazakhstan (DS/ML kz)
Например, для обычного dense слоя x σ(Wx + b) имеем:
∂Loss/∂W = (∂Loss/∂σ)(∂σ/∂W)
∂Loss/∂b = (∂Loss/∂σ)(∂σ/∂b)
Если ты тренируешь W и b по отдельности, то для каждого из них он будет заново высчитывать узлы 1) y = Wx 2) z = y+b 3) u = σ(z) etc. в форвард пасе, а потом ещё в бэквард пасе для каждого из них будет заново пересчитывать ∂Loss/∂σ. Тогда как если ты тренируешь их вместе то он всё это посчитает только 1 раз
источник

A

Aykhan in Data Science Kazakhstan (DS/ML kz)
Кто нибудь пытался запустить pytorch lightning на tpu? У меня чет не получается
источник

A

Anel in Data Science Kazakhstan (DS/ML kz)
Iska Shaikh
когда настанет время когда я буду понимать вас😂
Я тоже мечтаю о таком дне 😂
источник

Е

Елес in Data Science Kazakhstan (DS/ML kz)
Anel
Я тоже мечтаю о таком дне 😂
о Дне? Днооооооо!
источник

D

Duman in Data Science Kazakhstan (DS/ML kz)
всем привет! Вопрос насчет R: как можно убрать scientific notation в rpart?

пробовал менять значение в options(scipen), также пробовал менять значение в digits на отрицательное, но plot все так же показывает числа именно так.

Мой код:
plot(dtree1, uniform=TRUE, main="Classification Tree for Churn")
text(dtree1, use.n=TRUE, all=TRUE, cex=.8)
источник

D

Darkhan in Data Science Kazakhstan (DS/ML kz)
Duman
всем привет! Вопрос насчет R: как можно убрать scientific notation в rpart?

пробовал менять значение в options(scipen), также пробовал менять значение в digits на отрицательное, но plot все так же показывает числа именно так.

Мой код:
plot(dtree1, uniform=TRUE, main="Classification Tree for Churn")
text(dtree1, use.n=TRUE, all=TRUE, cex=.8)
Scipen 999 не помог?
источник

D

Duman in Data Science Kazakhstan (DS/ML kz)
нет
источник