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

Ultra Mega Network #93

Open
1 task
bonlime opened this issue Aug 5, 2020 · 10 comments
Open
1 task

Ultra Mega Network #93

bonlime opened this issue Aug 5, 2020 · 10 comments

Comments

@bonlime
Copy link
Owner

bonlime commented Aug 5, 2020

Каждый уважающий себя рисерчер должен в какой-то момент придумать свою собственную сетку. Вот и у меня есть такое желание. я много насмотрелся и думаю что могу сделать лучше объеденив разные идеи под одну крышу.

Плюс я надеюсь сделать из этого магистерский диплом.

Базовые сети и идеи:

  • ResNet - классика. Базовый блок BasicBlock или BottleNeck. Первый гораздо быстрее, но заметно хуже работает. интересно почему? кажется, что дело исключительно в глубине сетки
  • DarkNet - в отличие от ResNet уменьшение размерности происходит между блоками, таким образом не нужно нигде отдельно уменьшать residual
  • TResNet - первые блоки BasicBlock, последующие BottleNeck. из важных изменений - attention после 2й свертки в BottleNeck, а не после 3й как в SE-net и ему подобных.
  • Neural Architecture Design for GPU-Efficient Networks - решают те же задачи что и TResNet- хотят быстрый инференс на GPU, а не на мобилках. тоже получают что инференс ни от flops ни от кол-ва параметров не зависит. изучают три блока xx-block (по сути basic), bottleneck (BL) и inverted bottleneck с depthwise convs. очень интересные графики latency в зависимости от feature size, на которых есть явный излом, который видимо случается когда начинает ядер на карте не хватать (?). Из экспериментов видно, что BL/DW эффективней на GPU когда матрицы низкоранговые. учат несколько разных сеток, строят для них собственные числа, получают что в первых стадиях ранк выше, а потом быстро падает, т.е. нужно использовать XX в первых стадиях и BL/DW в последующих. Предлагают несколько очень общих вариантов MasterNet. сами выбирают X, X, B, D, D, но говорят что и X, X, D, D тоже работает не плохо. руками придумывают вот такую сетку: blocks: C,X,X,D,D,C. depth: 1,1,4,8,6,1. width: 32,48,64,160,320,1280. stride: 2,2,2,2,2,1. Acc@1: 77.5%. потом запускают NAS и оптимизируют. получают два интересных вывода: NAS постоянно выбирает 3x3 свертки и bottle_ratio=3 для DW, хотя в EffNet используют 6. (т.е. видимо 6 много и можно меньше?)
    Лучшие архитектуры для разных режимов показаны ниже.
    image мысли после прочтения - надо попрбовать делать как они и менять блоки в конце на блоки с groups, не обязательно даже DW.
    Авторы учили свою normal модель на разрешении 192. Провалидировал веса: 79.96@192, 80.7@224 (!), 81@256. выглядит очень мощно

еще чуваки явно умеют тренить сетки, потому что такое качетство без офигенного пайплайна не получить никак. половина их секрета в этом. но что чуваки не увидели, так это то, что у них 21М параметров из которых больше половины приходится на expand и squeeze свертки, потому что у них количество каналов сильно больше чем в mobilenet или effnet. будет ли оно работать лучше, если поставить туда побольше Separable Convs вместо Inverted? кажется что да, но на деле хрен его знает.

  • Rethinking Bottleneck Structure for Efficient Mobile Network Design - модифицируют блоки в mobilenet и смотрят где лучше ставить residual. получают, что лучше работает с skip connection между широкими слоями, а не узкими. предлагают новый bottleneck block - sandglass block: input -> DW 3x3 -> reduction Conv1x1 -> expansion Conv1x1 -> DW 3x3 + input. Дополнительно предлагают ввести параметер Identity tensor multiplier, который по сути делает то же самое что partial residual, т.е. skip прокидывается только от части фич. в их экспериметах значение 0.5 не ухудшает accuracy, но даёт ~5% буст к скорости. в конце отмечают, что в их блоке 2 DW свертки, а в Inverted Residual только одна, поэтому сравниваются с модификацией Mblnv2 с двумя DW свертками. это докидывает, но все равно работает хуже чем вариант авторов.

  • CSPNet - (Cross Stage Partial Networks) - Модифицирует Residual, вместо него вход делится на две части, одна копируется, а другая проходит через блок, потом они конкатенируются и проходят еще свертку 1x1 чтобы перемешаться. уменьшет количесто параметров и FLOPS без ухудшения качества. Предыдущая статья тех же авторов Enriching variety of layer-wise learning information by gradient combination paper - в которой они предлагают partial ResNet - это когда skip connection только на половину блоков. утверждают что позволяет избавиться от лишних градиентов. Есть интересные картинки про градиенты, которые я пока не понял :(

  • Hybrid Composition with IdleBlock: More Efficient Networks for Image Recognition - делают точно то же самое что в CSP Net но для мобильных сеток, называют свой блок Idle. из интересных идей - менять не все слои, а чередовать обычные слои и Idle. обращают внимание на то, что вообще говоря важно какая из частей feaure map остается idle (первая или вторая aka L или R). предлагают две версии L-Idle и R-idle. если стакать только один тип, то receptive field на части фичемап растет, а на части не растет. а если чередовать, то растет одинаково. работает лучше, если ставить только один тип (как в CSP в общем)

  • Res2Net - предлагают модифицировать BottleNeck иерархическими фичами. При том же количестве параметров стабильно лучше работает, докидывает как на classification так и на downstream задачах.

  • Attention blocks - нужно выбрать и какой использовать (пока лучше всех выглядит ECA) и где его расположить. upd. 12.09.20. склоняюсь к варианту SE-Var3 из статьи про ECA (см. ниже)

  • ReXNet: Diminishing Representational Bottleneck on Convolutional Neural Network - смотрят на дизайн сетки с точки зрения рангов матриц и показывают, что 1) модные активации типа swish лучше сохраняют ранг 2) сжатие каналов уменьшает model capacity 3) expand layers (где outchannels > in channels) лучше сохраняют ранг. предлагают вставлять их как можно больше. Посмотрев их код можно вынести еще пару идей. 4) Они используют Partial Residual, когда если количество output каналов больше чем input, то add только к первым каналам. 5) они увеличивают количество каналов не каждый stage, а каждый блок (!). на чуть-чуть. таким образом получая бОльшее количество expand layers 6) используют голову как в MobileNet когда на выходе сетки не очень много слоёв (~360), потом conv1x1 360x2500 -> bn -> swish -> AvgPool -> Dropout -> Linear. Возможные улучшения для этой сетки - не использовать Inverted Bottlenecks, а просто линейно наращивать количество каналов, используя group convs вместо depthwise

upd. 27.01.2021
ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design - прочитал известную статью про ShuffletNet часто видел её до этого, но не читал. предлагают design principles для построения быстрых сеток: 1) Equal channel width minimizes memory access cost - лучше чтобы количество входных и выходных каналов совпадало. reduction conv1x1 - не очень 2) Excessive group convolution increases MAC - group conv медленные, лучше их не использовать 3) Network fragmentation reduces degree of parallelism - много бранчей или много сверток внутри блока уменьшают скорость по сравнению с одной большой сверткой (при одинаковых FLOPs) 4) Element-wise operations are non-negligible -всякие ReLU и суммы тоже важно учитывать

Предлагают вот такую архитектуру. Очень похоже на CSP выше. пару замечаний 1) "the three successive elementwise operations, “Concat”, “Channel Shuffle” and “Channel Split”, are merged into a single element-wise operation" - ?? не понимаю про что они 2) нет ReLU после DW свертки 3) есть доп. conv1x1 перед GAP 4) их вариант downsampling мне не нравится, я бы воткнул тупо BlurPool и всё
image

в целом интересная статья, которая в очередной раз подтверждает известные мне мысли

upd. 01.06.21 - авторы сильно обновили статью про ReXNet, чуть переделав свои выводы. модные активации лучше вставлять после сверток которые увеличивают количество каналов, после DW можно оставить ReLU, а после первой conv1x1 нужно swish (aka silu). если вдобавок сделать увеличение фильтров линейным, даже без изменения dimension rate в inverted bottleneck, сетка станет сильно лучше.

Дополнительные идеи:

  • Adjoint-Network - дистилляция прямо во время обучения. говорят что это одновременно помогает большой сетке хорошо обучиться. но у них очень слабые бейлайны, которые они улучшают. (73% для resnet50). возможно идею можно улучшить, если выкидывать меньше не первых слоях и больше на последних. но я не очень в теме sota distillation, так что возможно есть идеи лучше.

Все эксперименты будут проводиться на уменьшенной версии Imagenet (128х128) для более быстрых итераций (один эксперимент в таком сетапе занимает
План экспериментов:

Spoiler Template
To be added
  1. Darknet53. Моя версия плохо учится, остановил процесс после ~40 эпох

  1. Vanilla ResNet50 -> 2 GPUs + smooth
Vanilla Resnet
Epoch 85/90. training: 2504it [13:46,  3.03it/s, Acc@1=84.299, Acc@5=94.812, Loss=1.6742]
Epoch 85/90. validating: 101it [00:20,  4.82it/s, Acc@1=79.392, Acc@5=94.716, Loss=1.7683]
[08-08 12:50:18] - Train loss: 1.6732 | Acc@1: 84.3233 | Acc@5: 94.8197
[08-08 12:50:18] - Val   loss: 1.9336 | Acc@1: 75.6580 | Acc@5: 92.6180
[08-08 12:50:18] - Epoch 85: best loss improved from 1.9355 to 1.9336
[08-08 12:50:18] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [13:46,  3.03it/s, Acc@1=84.544, Acc@5=94.888, Loss=1.6655]
Epoch 86/90. validating: 101it [00:20,  4.93it/s, Acc@1=72.024, Acc@5=90.464, Loss=2.0965]
[08-08 13:04:25] - Train loss: 1.6659 | Acc@1: 84.5328 | Acc@5: 94.8969
[08-08 13:04:25] - Val   loss: 1.9314 | Acc@1: 75.7660 | Acc@5: 92.6420
[08-08 13:04:25] - Epoch 86: best loss improved from 1.9336 to 1.9314
[08-08 13:04:26] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [13:46,  3.03it/s, Acc@1=84.599, Acc@5=94.965, Loss=1.6629]
Epoch 87/90. validating: 101it [00:20,  4.82it/s, Acc@1=79.528, Acc@5=94.752, Loss=1.7644]
[08-08 13:18:33] - Train loss: 1.6629 | Acc@1: 84.6236 | Acc@5: 94.9396
[08-08 13:18:33] - Val   loss: 1.9299 | Acc@1: 75.8300 | Acc@5: 92.6400
[08-08 13:18:33] - Epoch 87: best loss improved from 1.9314 to 1.9299
[08-08 13:18:33] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [13:46,  3.03it/s, Acc@1=84.720, Acc@5=94.930, Loss=1.6612]
Epoch 88/90. validating: 101it [00:20,  4.94it/s, Acc@1=72.064, Acc@5=90.544, Loss=2.0947]
[08-08 13:32:41] - Train loss: 1.6612 | Acc@1: 84.6932 | Acc@5: 94.9399
[08-08 13:32:41] - Val   loss: 1.9286 | Acc@1: 75.8040 | Acc@5: 92.6400
[08-08 13:32:41] - Epoch 88: best loss improved from 1.9299 to 1.9286
[08-08 13:32:41] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [13:46,  3.03it/s, Acc@1=84.811, Acc@5=94.989, Loss=1.6571]
Epoch 89/90. validating: 101it [00:20,  4.83it/s, Acc@1=79.480, Acc@5=94.752, Loss=1.7639]
[08-08 13:46:49] - Train loss: 1.6562 | Acc@1: 84.8184 | Acc@5: 94.9993
[08-08 13:46:49] - Val   loss: 1.9301 | Acc@1: 75.7580 | Acc@5: 92.6140
[08-08 13:46:49] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:46,  3.03it/s, Acc@1=84.829, Acc@5=94.994, Loss=1.6559]
Epoch 90/90. validating: 101it [00:20,  4.94it/s, Acc@1=71.976, Acc@5=90.532, Loss=2.0955]
[08-08 14:00:56] - Train loss: 1.6560 | Acc@1: 84.8103 | Acc@5: 94.9930
[08-08 14:00:56] - Val   loss: 1.9288 | Acc@1: 75.7700 | Acc@5: 92.6660
[08-08 14:00:57] - Acc@1 75.770 Acc@5 92.666
[08-08 14:00:57] - Total time: 21h 28.4m
Vanilla Resnet + EMA + color twist aug
Epoch 85/90. training: 2504it [13:50,  3.02it/s, Acc@1=82.961, Acc@5=94.302, Loss=1.7165]
Epoch 85/90. validating: 101it [00:20,  4.81it/s, Acc@1=80.076, Acc@5=95.016, Loss=1.7426]
[08-10 03:29:15] - Train loss: 1.7151 | Acc@1: 83.0049 | Acc@5: 94.3181
[08-10 03:29:15] - Val   loss: 1.9036 | Acc@1: 76.3040 | Acc@5: 92.9180
[08-10 03:29:15] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [13:50,  3.01it/s, Acc@1=83.259, Acc@5=94.416, Loss=1.7061]
Epoch 86/90. validating: 101it [00:20,  4.94it/s, Acc@1=72.516, Acc@5=90.828, Loss=2.0635]
[08-10 03:43:27] - Train loss: 1.7073 | Acc@1: 83.2211 | Acc@5: 94.4151
[08-10 03:43:27] - Val   loss: 1.9032 | Acc@1: 76.3060 | Acc@5: 92.9180
[08-10 03:43:27] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [13:51,  3.01it/s, Acc@1=83.305, Acc@5=94.436, Loss=1.7054]
Epoch 87/90. validating: 101it [00:20,  4.82it/s, Acc@1=80.016, Acc@5=95.004, Loss=1.7425]
[08-10 03:57:39] - Train loss: 1.7053 | Acc@1: 83.3025 | Acc@5: 94.4406
[08-10 03:57:39] - Val   loss: 1.9030 | Acc@1: 76.3040 | Acc@5: 92.8900
[08-10 03:57:39] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [13:51,  3.01it/s, Acc@1=83.414, Acc@5=94.425, Loss=1.7033]
Epoch 88/90. validating: 101it [00:20,  4.93it/s, Acc@1=72.532, Acc@5=90.840, Loss=2.0637]
[08-10 04:11:51] - Train loss: 1.7032 | Acc@1: 83.4011 | Acc@5: 94.4357
[08-10 04:11:51] - Val   loss: 1.9032 | Acc@1: 76.2660 | Acc@5: 92.9100
[08-10 04:11:51] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [13:51,  3.01it/s, Acc@1=83.509, Acc@5=94.462, Loss=1.6992]
Epoch 89/90. validating: 101it [00:20,  4.82it/s, Acc@1=80.012, Acc@5=94.988, Loss=1.7425]
[08-10 04:26:03] - Train loss: 1.6979 | Acc@1: 83.5370 | Acc@5: 94.4932
[08-10 04:26:03] - Val   loss: 1.9031 | Acc@1: 76.2620 | Acc@5: 92.9060
[08-10 04:26:03] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:50,  3.02it/s, Acc@1=83.515, Acc@5=94.537, Loss=1.6972]
Epoch 90/90. validating: 101it [00:20,  4.94it/s, Acc@1=72.516, Acc@5=90.856, Loss=2.0637]
[08-10 04:40:15] - Train loss: 1.6973 | Acc@1: 83.5025 | Acc@5: 94.5317
[08-10 04:40:15] - Val   loss: 1.9031 | Acc@1: 76.2780 | Acc@5: 92.9220
[08-10 04:40:16] - Acc@1 76.278 Acc@5 92.922
[08-10 04:40:16] - Total time: 21h 28.7m

  1. ResNet50 с единой stride 2 сверткой.
ResNet with no residual in stride 2 block
Epoch 85/90. training: 2504it [13:30,  3.09it/s, Acc@1=82.457, Acc@5=94.125, Loss=1.7528]
Epoch 85/90. validating: 101it [00:20,  4.89it/s, Acc@1=79.572, Acc@5=94.864, Loss=1.7781]
[08-08 11:17:41] - Train loss: 1.7520 | Acc@1: 82.5174 | Acc@5: 94.1372
[08-08 11:17:41] - Val   loss: 1.9366 | Acc@1: 75.8400 | Acc@5: 92.7960
[08-08 11:17:41] - Epoch 85: best loss improved from 1.9403 to 1.9366
[08-08 11:17:42] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [13:06,  3.18it/s, Acc@1=82.795, Acc@5=94.256, Loss=1.7428]
Epoch 86/90. validating: 101it [00:21,  4.73it/s, Acc@1=72.212, Acc@5=90.788, Loss=2.0923]
[08-08 11:31:10] - Train loss: 1.7436 | Acc@1: 82.7438 | Acc@5: 94.2680
[08-08 11:31:11] - Val   loss: 1.9340 | Acc@1: 75.9720 | Acc@5: 92.7920
[08-08 11:31:11] - Epoch 86: best loss improved from 1.9366 to 1.9340
[08-08 11:31:11] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [13:04,  3.19it/s, Acc@1=82.826, Acc@5=94.329, Loss=1.7408]
Epoch 87/90. validating: 101it [00:24,  4.11it/s, Acc@1=79.704, Acc@5=94.880, Loss=1.7735]
[08-08 11:44:40] - Train loss: 1.7409 | Acc@1: 82.8435 | Acc@5: 94.3096
[08-08 11:44:40] - Val   loss: 1.9317 | Acc@1: 75.9680 | Acc@5: 92.8780
[08-08 11:44:40] - Epoch 87: best loss improved from 1.9340 to 1.9317
[08-08 11:44:40] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [12:51,  3.25it/s, Acc@1=82.918, Acc@5=94.294, Loss=1.7392]
Epoch 88/90. validating: 101it [00:20,  5.05it/s, Acc@1=72.320, Acc@5=90.908, Loss=2.0905]
[08-08 11:57:52] - Train loss: 1.7392 | Acc@1: 82.9118 | Acc@5: 94.2970
[08-08 11:57:52] - Val   loss: 1.9315 | Acc@1: 76.0240 | Acc@5: 92.8440
[08-08 11:57:52] - Epoch 88: best loss improved from 1.9317 to 1.9315
[08-08 11:57:52] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [12:48,  3.26it/s, Acc@1=83.049, Acc@5=94.341, Loss=1.7353]
Epoch 89/90. validating: 101it [00:20,  4.92it/s, Acc@1=79.672, Acc@5=94.824, Loss=1.7720]
[08-08 12:11:02] - Train loss: 1.7341 | Acc@1: 83.0485 | Acc@5: 94.3593
[08-08 12:11:02] - Val   loss: 1.9311 | Acc@1: 75.9920 | Acc@5: 92.8540
[08-08 12:11:02] - Epoch 89: best loss improved from 1.9315 to 1.9311
[08-08 12:11:02] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [12:47,  3.26it/s, Acc@1=83.063, Acc@5=94.343, Loss=1.7339]
Epoch 90/90. validating: 101it [00:20,  5.04it/s, Acc@1=72.284, Acc@5=90.932, Loss=2.0908]
[08-08 12:24:10] - Train loss: 1.7339 | Acc@1: 83.0634 | Acc@5: 94.3575
[08-08 12:24:10] - Val   loss: 1.9314 | Acc@1: 75.9560 | Acc@5: 92.8920
[08-08 12:24:10] - Acc@1 75.956 Acc@5 92.892
[08-08 12:24:10] - Total time: 19h 51.5m
ResNet with no residual in stride 2 block + EMA + color twist
Epoch 85/90. training: 2504it [12:35,  3.31it/s, Acc@1=81.405, Acc@5=93.703, Loss=1.7885]
Epoch 85/90. validating: 101it [00:20,  5.01it/s, Acc@1=80.180, Acc@5=95.024, Loss=1.7578]
[08-10 01:40:39] - Train loss: 1.7873 | Acc@1: 81.4761 | Acc@5: 93.7253
[08-10 01:40:39] - Val   loss: 1.9184 | Acc@1: 76.3980 | Acc@5: 92.9700
[08-10 01:40:39] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [12:36,  3.31it/s, Acc@1=81.765, Acc@5=93.854, Loss=1.7787]
Epoch 86/90. validating: 101it [00:19,  5.13it/s, Acc@1=72.552, Acc@5=90.928, Loss=2.0778]
[08-10 01:53:36] - Train loss: 1.7790 | Acc@1: 81.7623 | Acc@5: 93.8478
[08-10 01:53:36] - Val   loss: 1.9177 | Acc@1: 76.3740 | Acc@5: 92.9820
[08-10 01:53:36] - Epoch 86: best loss improved from 1.9179 to 1.9177
[08-10 01:53:36] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [12:37,  3.31it/s, Acc@1=81.771, Acc@5=93.871, Loss=1.7770]
Epoch 87/90. validating: 101it [00:20,  5.00it/s, Acc@1=80.200, Acc@5=95.028, Loss=1.7574]
[08-10 02:06:34] - Train loss: 1.7770 | Acc@1: 81.7953 | Acc@5: 93.8757
[08-10 02:06:34] - Val   loss: 1.9174 | Acc@1: 76.3880 | Acc@5: 93.0200
[08-10 02:06:34] - Epoch 87: best loss improved from 1.9177 to 1.9174
[08-10 02:06:34] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [12:37,  3.31it/s, Acc@1=81.940, Acc@5=93.872, Loss=1.7742]
Epoch 88/90. validating: 101it [00:19,  5.11it/s, Acc@1=72.500, Acc@5=91.008, Loss=2.0770]
[08-10 02:19:32] - Train loss: 1.7745 | Acc@1: 81.9126 | Acc@5: 93.8782
[08-10 02:19:32] - Val   loss: 1.9173 | Acc@1: 76.3600 | Acc@5: 93.0380
[08-10 02:19:32] - Epoch 88: best loss improved from 1.9174 to 1.9173
[08-10 02:19:32] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [12:35,  3.31it/s, Acc@1=82.016, Acc@5=93.939, Loss=1.7702]
Epoch 89/90. validating: 101it [00:20,  4.99it/s, Acc@1=80.232, Acc@5=95.052, Loss=1.7574]
[08-10 02:32:28] - Train loss: 1.7692 | Acc@1: 82.0163 | Acc@5: 93.9560
[08-10 02:32:28] - Val   loss: 1.9173 | Acc@1: 76.3860 | Acc@5: 93.0080
[08-10 02:32:28] - Epoch 89: best loss improved from 1.9173 to 1.9173
[08-10 02:32:29] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [12:36,  3.31it/s, Acc@1=82.042, Acc@5=93.938, Loss=1.7694]
Epoch 90/90. validating: 101it [00:19,  5.14it/s, Acc@1=72.532, Acc@5=90.976, Loss=2.0769]
[08-10 02:45:25] - Train loss: 1.7694 | Acc@1: 82.0458 | Acc@5: 93.9409
[08-10 02:45:25] - Val   loss: 1.9171 | Acc@1: 76.3740 | Acc@5: 93.0020
[08-10 02:45:25] - Epoch 90: best loss improved from 1.9173 to 1.9171
[08-10 02:45:26] - Acc@1 76.374 Acc@5 93.002
[08-10 02:45:26] - Total time: 19h 34.0m

  1. Linear Bottleneck ResNet50
ResNet with no residual in stride 2 block and no last activation
To be added

Выводы после трех экспериментов выше - no residual in stride 2 block заметно ускоряет, без уменьшения качества. точно имеет смысл оставить.

  1. Resnet34-50 (?). Bottleneck ratio=1 (это даже не bottleneck получается). количество слоёв как в resnet50, количество фильтров как в resnet34. no residual в stride=2 блоках.
Resnet34-50 with no residual in stride 2 block
Epoch 85/90. training: 2504it [08:52,  4.70it/s, Acc@1=77.790, Acc@5=92.127, Loss=1.9207]
Epoch 85/90. validating: 101it [00:16,  6.03it/s, Acc@1=78.988, Acc@5=94.436, Loss=1.8038]
[08-10 06:15:20] - Train loss: 1.9197 | Acc@1: 77.8283 | Acc@5: 92.1667
[08-10 06:15:20] - Val   loss: 1.9649 | Acc@1: 75.1400 | Acc@5: 92.3740
[08-10 06:15:20] - Epoch 85: best loss improved from 1.9655 to 1.9649
[08-10 06:15:20] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [08:53,  4.70it/s, Acc@1=77.991, Acc@5=92.282, Loss=1.9129]
Epoch 86/90. validating: 101it [00:16,  6.17it/s, Acc@1=71.284, Acc@5=90.276, Loss=2.1250]
[08-10 06:24:30] - Train loss: 1.9128 | Acc@1: 77.9938 | Acc@5: 92.2696
[08-10 06:24:30] - Val   loss: 1.9643 | Acc@1: 75.1600 | Acc@5: 92.3340
[08-10 06:24:30] - Epoch 86: best loss improved from 1.9649 to 1.9643
[08-10 06:24:30] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [09:12,  4.53it/s, Acc@1=78.049, Acc@5=92.307, Loss=1.9109]              B
Epoch 87/90. validating: 101it [00:16,  5.95it/s, Acc@1=79.016, Acc@5=94.400, Loss=1.8031]
[08-10 06:33:59] - Train loss: 1.9110 | Acc@1: 78.0691 | Acc@5: 92.3038
[08-10 06:33:59] - Val   loss: 1.9641 | Acc@1: 75.1840 | Acc@5: 92.3540
[08-10 06:33:59] - Epoch 87: best loss improved from 1.9643 to 1.9641
[08-10 06:34:00] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [09:18,  4.49it/s, Acc@1=78.217, Acc@5=92.330, Loss=1.9079]
Epoch 88/90. validating: 101it [00:16,  6.14it/s, Acc@1=71.360, Acc@5=90.296, Loss=2.1245]
[08-10 06:43:35] - Train loss: 1.9081 | Acc@1: 78.1746 | Acc@5: 92.3133
[08-10 06:43:35] - Val   loss: 1.9638 | Acc@1: 75.1600 | Acc@5: 92.3460
[08-10 06:43:35] - Epoch 88: best loss improved from 1.9641 to 1.9638
[08-10 06:43:35] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [09:15,  4.51it/s, Acc@1=78.238, Acc@5=92.371, Loss=1.9043]
Epoch 89/90. validating: 101it [00:17,  5.92it/s, Acc@1=78.980, Acc@5=94.412, Loss=1.8028]
[08-10 06:53:07] - Train loss: 1.9031 | Acc@1: 78.2649 | Acc@5: 92.3855
[08-10 06:53:07] - Val   loss: 1.9636 | Acc@1: 75.1500 | Acc@5: 92.3660
[08-10 06:53:07] - Epoch 89: best loss improved from 1.9638 to 1.9636
[08-10 06:53:08] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [09:13,  4.52it/s, Acc@1=78.295, Acc@5=92.367, Loss=1.9017]                                                            
Epoch 90/90. validating: 101it [00:16,  6.13it/s, Acc@1=71.360, Acc@5=90.352, Loss=2.1242]                                                           
[08-10 07:02:38] - Train loss: 1.9025 | Acc@1: 78.2674 | Acc@5: 92.3671                                                                              
[08-10 07:02:38] - Val   loss: 1.9634 | Acc@1: 75.1700 | Acc@5: 92.3840                                                                              
[08-10 07:02:38] - Epoch 90: best loss improved from 1.9636 to 1.9634
[08-10 07:02:39] - Acc@1 75.170 Acc@5 92.384
[08-10 07:02:39] - Total time: 20h 45.5m - время обучение не правильное. там в какой-то момент влез другой процесс и сильно все замедлил, эта сетка где-то на 70% быстрее версии R50 выше и на 25% быстрее учится
Resnet34-50 with no residual in stride 2 block and no last activation
Epoch 85/90. training: 2504it [24:46,  1.68it/s, Acc@1=77.986, Acc@5=92.217, Loss=1.9219]                                                                                                                    
Epoch 85/90. validating: 101it [00:16,  6.06it/s, Acc@1=79.276, Acc@5=94.524, Loss=1.7990]                                                                                                                   
[08-10 23:36:29] - Train loss: 1.9211 | Acc@1: 78.0078 | Acc@5: 92.2317                                                                                                                                      
[08-10 23:36:29] - Val   loss: 1.9565 | Acc@1: 75.5320 | Acc@5: 92.4920                                                                                                                                      
[08-10 23:36:29] - Epoch 85: best loss improved from 1.9571 to 1.9565                                                                                                                                        
[08-10 23:36:30] - Epoch 86 | lr 2.21e-03                                                                                                                                                                    
Epoch 86/90. training: 2504it [24:46,  1.68it/s, Acc@1=78.235, Acc@5=92.365, Loss=1.9132]                                                                                                                    
Epoch 86/90. validating: 101it [00:16,  6.28it/s, Acc@1=71.816, Acc@5=90.452, Loss=2.1128]                                                                                                                   
[08-11 00:01:50] - Train loss: 1.9136 | Acc@1: 78.1908 | Acc@5: 92.3697                                                                                                                                      
[08-11 00:01:50] - Val   loss: 1.9558 | Acc@1: 75.5520 | Acc@5: 92.5000                                                                                                                                      
[08-11 00:01:50] - Epoch 86: best loss improved from 1.9565 to 1.9558                                                                                                                                        
[08-11 00:01:50] - Epoch 87 | lr 1.48e-03                                                                                                                                                                    
Epoch 87/90. training: 2504it [25:00,  1.67it/s, Acc@1=78.175, Acc@5=92.325, Loss=1.9133]                                                                                                                    
Epoch 87/90. validating: 101it [00:16,  6.10it/s, Acc@1=79.208, Acc@5=94.524, Loss=1.7980]                                                                                                                   
[08-11 00:27:25] - Train loss: 1.9127 | Acc@1: 78.2190 | Acc@5: 92.3324                                                                                                                                      
[08-11 00:27:25] - Val   loss: 1.9555 | Acc@1: 75.4840 | Acc@5: 92.4620                                                                                                                                      
[08-11 00:27:25] - Epoch 87: best loss improved from 1.9558 to 1.9555                                                                                                                                        
[08-11 00:27:25] - Epoch 88 | lr 8.98e-04                                                                                                                                                                    
Epoch 88/90. training: 2504it [24:58,  1.67it/s, Acc@1=78.341, Acc@5=92.368, Loss=1.9095]                                                                                                                    
Epoch 88/90. validating: 101it [00:16,  6.30it/s, Acc@1=71.756, Acc@5=90.412, Loss=2.1128]                                                                                                                   
[08-11 00:52:58] - Train loss: 1.9095 | Acc@1: 78.3341 | Acc@5: 92.3745                                                                                                                                      
[08-11 00:52:58] - Val   loss: 1.9554 | Acc@1: 75.4780 | Acc@5: 92.4700                                                                                                                                      
[08-11 00:52:58] - Epoch 88: best loss improved from 1.9555 to 1.9554                                                                                                                                        
[08-11 00:52:58] - Epoch 89 | lr 4.58e-04                                                                                                                                                                    
Epoch 89/90. training: 2504it [24:54,  1.68it/s, Acc@1=78.476, Acc@5=92.434, Loss=1.9045]                                                                                                                    
Epoch 89/90. validating: 101it [00:16,  6.12it/s, Acc@1=79.208, Acc@5=94.548, Loss=1.7978]                                                                                                                   
[08-11 01:18:26] - Train loss: 1.9039 | Acc@1: 78.4616 | Acc@5: 92.4578                                                                                                                                      
[08-11 01:18:26] - Val   loss: 1.9552 | Acc@1: 75.4920 | Acc@5: 92.4840                                                                                                                                      
[08-11 01:18:26] - Epoch 89: best loss improved from 1.9554 to 1.9552                                                                                                                                        
[08-11 01:18:26] - Epoch 90 | lr 1.65e-04                                                                                                                                                                    
Epoch 90/90. training: 2504it [24:53,  1.68it/s, Acc@1=78.474, Acc@5=92.445, Loss=1.9037]
Epoch 90/90. validating: 101it [00:16,  6.31it/s, Acc@1=71.796, Acc@5=90.432, Loss=2.1124]
[08-11 01:43:54] - Train loss: 1.9035 | Acc@1: 78.4825 | Acc@5: 92.4667
[08-11 01:43:54] - Val   loss: 1.9551 | Acc@1: 75.5240 | Acc@5: 92.4880
[08-11 01:43:54] - Epoch 90: best loss improved from 1.9552 to 1.9551
[08-11 01:43:55] - Acc@1 75.524 Acc@5 92.488
[08-11 01:43:55] - Total time: 18h 28.6m 

работает чутка лучше


  1. Timm Darknet53
Timm Darknet53
Epoch 85/90. training: 2504it [18:44,  2.23it/s, Acc@1=81.288, Acc@5=93.484, Loss=1.7823]
Epoch 85/90. validating: 101it [00:25,  3.97it/s, Acc@1=79.584, Acc@5=94.548, Loss=1.7704]
[08-11 08:05:23] - Train loss: 1.7811 | Acc@1: 81.3370 | Acc@5: 93.5267
[08-11 08:05:23] - Val   loss: 1.9384 | Acc@1: 75.6280 | Acc@5: 92.4500
[08-11 08:05:23] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [18:41,  2.23it/s, Acc@1=81.598, Acc@5=93.667, Loss=1.7716]
Epoch 86/90. validating: 101it [00:24,  4.09it/s, Acc@1=71.724, Acc@5=90.304, Loss=2.1059]
[08-11 08:24:30] - Train loss: 1.7718 | Acc@1: 81.5709 | Acc@5: 93.6734
[08-11 08:24:30] - Val   loss: 1.9384 | Acc@1: 75.6640 | Acc@5: 92.3720
[08-11 08:24:30] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [18:42,  2.23it/s, Acc@1=81.625, Acc@5=93.685, Loss=1.7700]
Epoch 87/90. validating: 101it [00:24,  4.05it/s, Acc@1=79.596, Acc@5=94.504, Loss=1.7705]
[08-11 08:43:37] - Train loss: 1.7697 | Acc@1: 81.6773 | Acc@5: 93.6703
[08-11 08:43:37] - Val   loss: 1.9389 | Acc@1: 75.7260 | Acc@5: 92.4320
[08-11 08:43:37] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [18:42,  2.23it/s, Acc@1=81.805, Acc@5=93.640, Loss=1.7675]
Epoch 88/90. validating: 101it [00:24,  4.18it/s, Acc@1=71.796, Acc@5=90.332, Loss=2.1073]
[08-11 09:02:44] - Train loss: 1.7675 | Acc@1: 81.7973 | Acc@5: 93.6588
[08-11 09:02:44] - Val   loss: 1.9390 | Acc@1: 75.7140 | Acc@5: 92.4320
[08-11 09:02:44] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [18:42,  2.23it/s, Acc@1=81.873, Acc@5=93.714, Loss=1.7628]
Epoch 89/90. validating: 101it [00:24,  4.04it/s, Acc@1=79.620, Acc@5=94.536, Loss=1.7704]
[08-11 09:21:52] - Train loss: 1.7612 | Acc@1: 81.9164 | Acc@5: 93.7516
[08-11 09:21:52] - Val   loss: 1.9389 | Acc@1: 75.6940 | Acc@5: 92.4320
[08-11 09:21:52] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [18:48,  2.22it/s, Acc@1=81.924, Acc@5=93.754, Loss=1.7609]              dB
Epoch 90/90. validating: 101it [00:24,  4.06it/s, Acc@1=71.772, Acc@5=90.332, Loss=2.1073]
[08-11 09:41:07] - Train loss: 1.7611 | Acc@1: 81.9245 | Acc@5: 93.7698
[08-11 09:41:07] - Val   loss: 1.9388 | Acc@1: 75.6980 | Acc@5: 92.4320
[08-11 09:41:08] - Acc@1 75.698 Acc@5 92.432
[08-11 09:41:08] - Total time: 28h 35.6m

Работает на уровне моего resnet34-50, только тут 41М параметров и он заметно медленнее


  1. Timm CSPDarknet53
Timm CSPDarknet53
Epoch 85/90. training: 2504it [20:22,  2.05it/s, Acc@1=80.479, Acc@5=93.336, Loss=1.8029]
Epoch 85/90. validating: 101it [00:25,  4.03it/s, Acc@1=80.496, Acc@5=95.296, Loss=1.7263]
[08-11 10:38:27] - Train loss: 1.8021 | Acc@1: 80.5142 | Acc@5: 93.3400
[08-11 10:38:27] - Val   loss: 1.8755 | Acc@1: 76.9200 | Acc@5: 93.3800
[08-11 10:38:27] - Epoch 85: best loss improved from 1.8756 to 1.8755
[08-11 10:38:28] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [20:11,  2.07it/s, Acc@1=80.719, Acc@5=93.427, Loss=1.7948]
Epoch 86/90. validating: 101it [00:24,  4.18it/s, Acc@1=73.404, Acc@5=91.536, Loss=2.0234]
[08-11 10:59:04] - Train loss: 1.7947 | Acc@1: 80.6935 | Acc@5: 93.4401
[08-11 10:59:04] - Val   loss: 1.8747 | Acc@1: 76.9680 | Acc@5: 93.4300
[08-11 10:59:04] - Epoch 86: best loss improved from 1.8755 to 1.8747
[08-11 10:59:05] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [20:11,  2.07it/s, Acc@1=80.693, Acc@5=93.454, Loss=1.7931]
Epoch 87/90. validating: 101it [00:25,  3.96it/s, Acc@1=80.552, Acc@5=95.280, Loss=1.7256]
[08-11 11:19:42] - Train loss: 1.7932 | Acc@1: 80.7234 | Acc@5: 93.4479
[08-11 11:19:42] - Val   loss: 1.8745 | Acc@1: 76.9480 | Acc@5: 93.3660
[08-11 11:19:42] - Epoch 87: best loss improved from 1.8747 to 1.8745
[08-11 11:19:42] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [20:09,  2.07it/s, Acc@1=80.851, Acc@5=93.434, Loss=1.7902]
Epoch 88/90. validating: 101it [00:24,  4.15it/s, Acc@1=73.400, Acc@5=91.504, Loss=2.0231]
[08-11 11:40:16] - Train loss: 1.7909 | Acc@1: 80.8035 | Acc@5: 93.4390
[08-11 11:40:16] - Val   loss: 1.8743 | Acc@1: 76.9840 | Acc@5: 93.4060
[08-11 11:40:16] - Epoch 88: best loss improved from 1.8745 to 1.8743
[08-11 11:40:17] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [20:14,  2.06it/s, Acc@1=80.889, Acc@5=93.497, Loss=1.7869]
Epoch 89/90. validating: 101it [00:25,  3.96it/s, Acc@1=80.560, Acc@5=95.300, Loss=1.7253]             Bp
[08-11 12:00:57] - Train loss: 1.7857 | Acc@1: 80.9323 | Acc@5: 93.5143
[08-11 12:00:57] - Val   loss: 1.8743 | Acc@1: 76.9800 | Acc@5: 93.4000
[08-11 12:00:57] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [20:39,  2.02it/s, Acc@1=80.941, Acc@5=93.536, Loss=1.7845]
Epoch 90/90. validating: 101it [00:26,  3.82it/s, Acc@1=73.416, Acc@5=91.504, Loss=2.0233]
[08-11 12:22:04] - Train loss: 1.7849 | Acc@1: 80.9294 | Acc@5: 93.5404
[08-11 12:22:04] - Val   loss: 1.8744 | Acc@1: 76.9800 | Acc@5: 93.4000
[08-11 12:22:05] - Acc@1 76.980 Acc@5 93.400
[08-11 12:22:05] - Total time: 31h 15.6m

Работает заметно лучше обычного DarkNet при меньшем количестве параметров. Тренится чуть медленее


  1. Preact Resnet34-50
PreAct Resnet34-50 + no bias in last conv in block
Epoch 85/90. training: 2504it [10:29,  3.98it/s, Acc@1=77.720, Acc@5=92.113, Loss=1.9219]
Epoch 85/90. validating: 101it [00:19,  5.28it/s, Acc@1=78.692, Acc@5=94.420, Loss=1.8053]
[08-12 03:34:26] - Train loss: 1.9207 | Acc@1: 77.7639 | Acc@5: 92.1334
[08-12 03:34:26] - Val   loss: 1.9669 | Acc@1: 75.0200 | Acc@5: 92.3200
[08-12 03:34:26] - Epoch 85: best loss improved from 1.9677 to 1.9669
[08-12 03:34:26] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [10:26,  3.99it/s, Acc@1=78.003, Acc@5=92.219, Loss=1.9133]
Epoch 86/90. validating: 101it [00:19,  5.15it/s, Acc@1=71.368, Acc@5=90.268, Loss=2.1277]
[08-12 03:45:13] - Train loss: 1.9134 | Acc@1: 77.9695 | Acc@5: 92.2331
[08-12 03:45:13] - Val   loss: 1.9661 | Acc@1: 75.0540 | Acc@5: 92.3300
[08-12 03:45:13] - Epoch 86: best loss improved from 1.9669 to 1.9661
[08-12 03:45:14] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [10:32,  3.96it/s, Acc@1=77.961, Acc@5=92.273, Loss=1.9115]
Epoch 87/90. validating: 101it [00:18,  5.39it/s, Acc@1=78.760, Acc@5=94.392, Loss=1.8038]
[08-12 03:56:04] - Train loss: 1.9114 | Acc@1: 78.0165 | Acc@5: 92.2695
[08-12 03:56:04] - Val   loss: 1.9659 | Acc@1: 75.0240 | Acc@5: 92.3140
[08-12 03:56:04] - Epoch 87: best loss improved from 1.9661 to 1.9659
[08-12 03:56:05] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [10:25,  4.00it/s, Acc@1=78.106, Acc@5=92.279, Loss=1.9086]
Epoch 88/90. validating: 101it [00:19,  5.21it/s, Acc@1=71.348, Acc@5=90.232, Loss=2.1273]
[08-12 04:06:50] - Train loss: 1.9091 | Acc@1: 78.0847 | Acc@5: 92.2814
[08-12 04:06:50] - Val   loss: 1.9655 | Acc@1: 75.0880 | Acc@5: 92.3140
[08-12 04:06:50] - Epoch 88: best loss improved from 1.9659 to 1.9655
[08-12 04:06:50] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [10:23,  4.01it/s, Acc@1=78.222, Acc@5=92.356, Loss=1.9050]
Epoch 89/90. validating: 101it [00:18,  5.36it/s, Acc@1=78.864, Acc@5=94.408, Loss=1.8035]
[08-12 04:17:33] - Train loss: 1.9035 | Acc@1: 78.2516 | Acc@5: 92.3837
[08-12 04:17:33] - Val   loss: 1.9654 | Acc@1: 75.1220 | Acc@5: 92.3580
[08-12 04:17:33] - Epoch 89: best loss improved from 1.9655 to 1.9654
[08-12 04:17:33] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:33,  3.95it/s, Acc@1=78.261, Acc@5=92.377, Loss=1.9032]
Epoch 90/90. validating: 101it [00:18,  5.60it/s, Acc@1=71.404, Acc@5=90.304, Loss=2.1271]
[08-12 04:28:26] - Train loss: 1.9036 | Acc@1: 78.2454 | Acc@5: 92.3815
[08-12 04:28:26] - Val   loss: 1.9653 | Acc@1: 75.1220 | Acc@5: 92.3520
[08-12 04:28:26] - Epoch 90: best loss improved from 1.9654 to 1.9653
[08-12 04:28:27] - Acc@1 75.122 Acc@5 92.352
[08-12 04:28:27] - Total time: 16h 23.1m

Работает чуть хуже, чем Resnet34-50 + Linear Bottleneck.
Добавлю bias в последний conv слой и повторю

With bias in last conv
Epoch 85/90. training: 2504it [10:42,  3.90it/s, Acc@1=77.690, Acc@5=92.111, Loss=1.9217]
Epoch 85/90. validating: 101it [00:22,  4.56it/s, Acc@1=78.724, Acc@5=94.408, Loss=1.8059]
[08-12 22:34:47] - Train loss: 1.9207 | Acc@1: 77.7494 | Acc@5: 92.1224
[08-12 22:34:47] - Val   loss: 1.9684 | Acc@1: 75.0120 | Acc@5: 92.2920
[08-12 22:34:47] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [10:44,  3.89it/s, Acc@1=77.986, Acc@5=92.229, Loss=1.9141]
Epoch 86/90. validating: 101it [00:19,  5.06it/s, Acc@1=71.340, Acc@5=90.120, Loss=2.1296]
[08-12 22:45:52] - Train loss: 1.9136 | Acc@1: 77.9766 | Acc@5: 92.2491
[08-12 22:45:52] - Val   loss: 1.9674 | Acc@1: 75.1000 | Acc@5: 92.2820
[08-12 22:45:52] - Epoch 86: best loss improved from 1.9683 to 1.9674
[08-12 22:45:53] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [10:48,  3.86it/s, Acc@1=77.944, Acc@5=92.250, Loss=1.9120]
Epoch 87/90. validating: 101it [00:21,  4.60it/s, Acc@1=78.804, Acc@5=94.412, Loss=1.8044]
[08-12 22:57:04] - Train loss: 1.9117 | Acc@1: 78.0041 | Acc@5: 92.2757
[08-12 22:57:04] - Val   loss: 1.9669 | Acc@1: 75.0260 | Acc@5: 92.2980
[08-12 22:57:04] - Epoch 87: best loss improved from 1.9674 to 1.9669
[08-12 22:57:04] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [10:44,  3.89it/s, Acc@1=78.149, Acc@5=92.276, Loss=1.9089]
Epoch 88/90. validating: 101it [00:19,  5.26it/s, Acc@1=71.272, Acc@5=90.180, Loss=2.1293]
[08-12 23:08:08] - Train loss: 1.9093 | Acc@1: 78.1127 | Acc@5: 92.2774
[08-12 23:08:08] - Val   loss: 1.9669 | Acc@1: 75.0640 | Acc@5: 92.3160
[08-12 23:08:08] - Epoch 88: best loss improved from 1.9669 to 1.9669
[08-12 23:08:08] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [10:54,  3.82it/s, Acc@1=78.189, Acc@5=92.305, Loss=1.9057]
Epoch 89/90. validating: 101it [00:21,  4.73it/s, Acc@1=78.936, Acc@5=94.432, Loss=1.8040]
[08-12 23:19:25] - Train loss: 1.9044 | Acc@1: 78.2006 | Acc@5: 92.3418
[08-12 23:19:25] - Val   loss: 1.9668 | Acc@1: 75.1080 | Acc@5: 92.3060
[08-12 23:19:25] - Epoch 89: best loss improved from 1.9669 to 1.9668
[08-12 23:19:25] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [11:01,  3.79it/s, Acc@1=78.248, Acc@5=92.348, Loss=1.9034]
Epoch 90/90. validating: 101it [00:20,  4.95it/s, Acc@1=71.288, Acc@5=90.228, Loss=2.1293]
[08-12 23:30:47] - Train loss: 1.9034 | Acc@1: 78.2496 | Acc@5: 92.3634
[08-12 23:30:47] - Val   loss: 1.9666 | Acc@1: 75.1080 | Acc@5: 92.3280
[08-12 23:30:47] - Epoch 90: best loss improved from 1.9668 to 1.9666
[08-12 23:30:49] - Acc@1 75.108 Acc@5 92.328
[08-12 23:30:49] - Total time: 16h 28.6m

Стало даже чутка хуже, чем без bias


  1. PreAct Resnet34-50 + space2depth + stride 2
PreAct Resnet34-50 + space2depth + stride 2 no bias in last conv in block
Epoch 85/90. training: 2504it [11:15,  3.71it/s, Acc@1=78.280, Acc@5=92.398, Loss=1.8987]                                                                                                                    
Epoch 85/90. validating: 101it [00:19,  5.11it/s, Acc@1=79.512, Acc@5=94.752, Loss=1.7871]                                                                                                                   
[08-12 07:01:41] - Train loss: 1.8980 | Acc@1: 78.3003 | Acc@5: 92.4126                                                                                                                                      
[08-12 07:01:41] - Val   loss: 1.9460 | Acc@1: 75.5800 | Acc@5: 92.6040                                                                                                                                      
[08-12 07:01:41] - Epoch 85: best loss improved from 1.9464 to 1.9460                                                                                                                                        
[08-12 07:01:41] - Epoch 86 | lr 2.21e-03                                                                                                                                                                    
Epoch 86/90. training: 2504it [11:44,  3.56it/s, Acc@1=78.551, Acc@5=92.501, Loss=1.8907]                                                                                                                    
Epoch 86/90. validating: 101it [00:21,  4.68it/s, Acc@1=71.684, Acc@5=90.604, Loss=2.1036]                                                                                                                   
[08-12 07:13:47] - Train loss: 1.8908 | Acc@1: 78.5276 | Acc@5: 92.5174                                                                                                                                      
[08-12 07:13:47] - Val   loss: 1.9452 | Acc@1: 75.5780 | Acc@5: 92.6720                                                                                                                                      
[08-12 07:13:47] - Epoch 86: best loss improved from 1.9460 to 1.9452                                                                                                                                        
[08-12 07:13:47] - Epoch 87 | lr 1.48e-03                                                                                                                                                                    
Epoch 87/90. training: 2504it [11:49,  3.53it/s, Acc@1=78.531, Acc@5=92.541, Loss=1.8888]                                                                                                                    
Epoch 87/90. validating: 101it [00:21,  4.73it/s, Acc@1=79.404, Acc@5=94.716, Loss=1.7858]                                                                                                                   
[08-12 07:25:58] - Train loss: 1.8885 | Acc@1: 78.5534 | Acc@5: 92.5353                                                                                                                                      
[08-12 07:25:58] - Val   loss: 1.9450 | Acc@1: 75.5000 | Acc@5: 92.6180                                                                                                                                      
[08-12 07:25:58] - Epoch 87: best loss improved from 1.9452 to 1.9450                                                                                                                                        
[08-12 07:25:58] - Epoch 88 | lr 8.98e-04                                                                                                                                                                    
Epoch 88/90. training: 2504it [11:50,  3.53it/s, Acc@1=78.655, Acc@5=92.528, Loss=1.8879]                                                                                                                    
Epoch 88/90. validating: 101it [00:20,  4.94it/s, Acc@1=71.592, Acc@5=90.524, Loss=2.1038]                                                                                                                   
[08-12 07:38:09] - Train loss: 1.8881 | Acc@1: 78.6161 | Acc@5: 92.5393                                                                                                                                      
[08-12 07:38:09] - Val   loss: 1.9447 | Acc@1: 75.5060 | Acc@5: 92.6360                                                                                                                                      
[08-12 07:38:09] - Epoch 88: best loss improved from 1.9450 to 1.9447                                                                                                                                        
[08-12 07:38:10] - Epoch 89 | lr 4.58e-04                                                                                                                                                                    
Epoch 89/90. training: 2504it [11:58,  3.49it/s, Acc@1=78.760, Acc@5=92.623, Loss=1.8820]                                                                                                                    
Epoch 89/90. validating: 101it [00:23,  4.38it/s, Acc@1=79.444, Acc@5=94.716, Loss=1.7855]                                                                                                                   
[08-12 07:50:31] - Train loss: 1.8816 | Acc@1: 78.7766 | Acc@5: 92.6388                                                                                                                                      
[08-12 07:50:31] - Val   loss: 1.9446 | Acc@1: 75.5220 | Acc@5: 92.6180                                                                                                                                      
[08-12 07:50:31] - Epoch 89: best loss improved from 1.9447 to 1.9446                                                                                                                                        
[08-12 07:50:31] - Epoch 90 | lr 1.65e-04                                                                                                                                                                    
Epoch 90/90. training: 2504it [11:57,  3.49it/s, Acc@1=78.766, Acc@5=92.631, Loss=1.8809]                                                                                                                    
Epoch 90/90. validating: 101it [00:24,  4.08it/s, Acc@1=71.568, Acc@5=90.512, Loss=2.1037]                                                                                                                   
[08-12 08:02:55] - Train loss: 1.8813 | Acc@1: 78.7659 | Acc@5: 92.6370                                                                                                                                      
[08-12 08:02:55] - Val   loss: 1.9446 | Acc@1: 75.5140 | Acc@5: 92.6240                                                                                                                                      
[08-12 08:02:55] - Epoch 90: best loss improved from 1.9446 to 1.9446                                                                                                                                        
[08-12 08:02:56] - Acc@1 75.514 Acc@5 92.624                                                                                                                                                                 
[08-12 08:02:56] - Total time: 18h 14.7m 

Space To Depth вход работает заметно лучше дефолтного. Качество pre-activation версии становится как у обычной. Похоже, что идея linear bottleneck работает лучше, чем pre-activation. Кажется что одна из причин - меньшее количество активаций в основном потоке. эксперимент Откидываю идею pre-activation и начинаю использовать только linear bottleneck


  1. PreAct Resnet34-50 + s2d + stride 2 + groups=16
PreAct Resnet34-50 + s2d + stride 2 + groups=16
Epoch 85/90. training: 2504it [15:32,  2.69it/s, Acc@1=76.150, Acc@5=91.373, Loss=1.9929]
Epoch 85/90. validating: 101it [00:18,  5.38it/s, Acc@1=77.780, Acc@5=94.052, Loss=1.8557]
[08-12 14:43:45] - Train loss: 1.9908 | Acc@1: 76.2302 | Acc@5: 91.4008
[08-12 14:43:45] - Val   loss: 2.0190 | Acc@1: 74.0760 | Acc@5: 91.7280
[08-12 14:43:45] - Epoch 85: best loss improved from 2.0192 to 2.0190
[08-12 14:43:45] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [15:33,  2.68it/s, Acc@1=76.406, Acc@5=91.519, Loss=1.9835]
Epoch 86/90. validating: 101it [00:18,  5.58it/s, Acc@1=70.412, Acc@5=89.500, Loss=2.1812]
[08-12 14:59:37] - Train loss: 1.9841 | Acc@1: 76.4197 | Acc@5: 91.5135
[08-12 14:59:37] - Val   loss: 2.0179 | Acc@1: 74.1400 | Acc@5: 91.7400
[08-12 14:59:37] - Epoch 86: best loss improved from 2.0190 to 2.0179
[08-12 14:59:37] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [15:45,  2.65it/s, Acc@1=76.465, Acc@5=91.546, Loss=1.9829]
Epoch 87/90. validating: 101it [00:18,  5.39it/s, Acc@1=77.896, Acc@5=94.056, Loss=1.8537]
[08-12 15:15:42] - Train loss: 1.9829 | Acc@1: 76.4750 | Acc@5: 91.5496
[08-12 15:15:42] - Val   loss: 2.0175 | Acc@1: 74.1600 | Acc@5: 91.7620
[08-12 15:15:42] - Epoch 87: best loss improved from 2.0179 to 2.0175
[08-12 15:15:42] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [15:33,  2.68it/s, Acc@1=76.547, Acc@5=91.537, Loss=1.9806]
Epoch 88/90. validating: 101it [00:18,  5.54it/s, Acc@1=70.472, Acc@5=89.436, Loss=2.1809]
[08-12 15:31:34] - Train loss: 1.9809 | Acc@1: 76.5281 | Acc@5: 91.5374
[08-12 15:31:34] - Val   loss: 2.0174 | Acc@1: 74.1620 | Acc@5: 91.7320
[08-12 15:31:34] - Epoch 88: best loss improved from 2.0175 to 2.0174
[08-12 15:31:34] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [15:22,  2.71it/s, Acc@1=76.641, Acc@5=91.598, Loss=1.9768]
Epoch 89/90. validating: 101it [00:18,  5.41it/s, Acc@1=77.836, Acc@5=94.064, Loss=1.8537]
[08-12 15:47:15] - Train loss: 1.9755 | Acc@1: 76.6587 | Acc@5: 91.6229
[08-12 15:47:15] - Val   loss: 2.0173 | Acc@1: 74.1680 | Acc@5: 91.7560
[08-12 15:47:15] - Epoch 89: best loss improved from 2.0174 to 2.0173
[08-12 15:47:15] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [15:23,  2.71it/s, Acc@1=76.703, Acc@5=91.625, Loss=1.9751]
Epoch 90/90. validating: 101it [00:18,  5.54it/s, Acc@1=70.540, Acc@5=89.468, Loss=2.1806]
[08-12 16:02:57] - Train loss: 1.9749 | Acc@1: 76.7064 | Acc@5: 91.6282
[08-12 16:02:57] - Val   loss: 2.0172 | Acc@1: 74.2000 | Acc@5: 91.7680
[08-12 16:02:57] - Epoch 90: best loss improved from 2.0173 to 2.0172
[08-12 16:02:58] - Acc@1 74.200 Acc@5 91.768
[08-12 16:02:58] - Total time: 23h 37.0m

довольно плохо, но надо делать скидку на то, что тут всего 6М параметров. пока эту ветку экспериментов прикрою, буду экспериментировать с группами для linear bottleneck версии


  1. R34-50 noact in last conv + space2depth
    Это продолжение 5го эксперимента. Если сравнивать с 9м, видно что linear bottleneck работает лучше.
simpl R34 noact space2depth
Epoch 85/90. training: 2504it [11:36,  3.60it/s, Acc@1=78.404, Acc@5=92.435, Loss=1.9039]
Epoch 85/90. validating: 101it [00:18,  5.35it/s, Acc@1=79.568, Acc@5=94.716, Loss=1.7837]
[08-13 04:56:52] - Train loss: 1.9032 | Acc@1: 78.4491 | Acc@5: 92.4576
[08-13 04:56:52] - Val   loss: 1.9395 | Acc@1: 75.8460 | Acc@5: 92.7200
[08-13 04:56:52] - Epoch 85: best loss improved from 1.9405 to 1.9395
[08-13 04:56:53] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [11:39,  3.58it/s, Acc@1=78.646, Acc@5=92.540, Loss=1.8955]
Epoch 86/90. validating: 101it [00:18,  5.40it/s, Acc@1=72.100, Acc@5=90.696, Loss=2.0945]
[08-13 05:08:51] - Train loss: 1.8956 | Acc@1: 78.6410 | Acc@5: 92.5483
[08-13 05:08:51] - Val   loss: 1.9391 | Acc@1: 75.8540 | Acc@5: 92.7380
[08-13 05:08:51] - Epoch 86: best loss improved from 1.9395 to 1.9391
[08-13 05:08:51] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [11:33,  3.61it/s, Acc@1=78.664, Acc@5=92.597, Loss=1.8936]
Epoch 87/90. validating: 101it [00:20,  4.99it/s, Acc@1=79.604, Acc@5=94.776, Loss=1.7830]
[08-13 05:20:45] - Train loss: 1.8937 | Acc@1: 78.6835 | Acc@5: 92.6029
[08-13 05:20:45] - Val   loss: 1.9390 | Acc@1: 75.8440 | Acc@5: 92.7300
[08-13 05:20:45] - Epoch 87: best loss improved from 1.9391 to 1.9390
[08-13 05:20:45] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [11:34,  3.61it/s, Acc@1=78.807, Acc@5=92.566, Loss=1.8922]
Epoch 88/90. validating: 101it [00:19,  5.22it/s, Acc@1=72.056, Acc@5=90.664, Loss=2.0943]
[08-13 05:32:39] - Train loss: 1.8925 | Acc@1: 78.7634 | Acc@5: 92.5752
[08-13 05:32:39] - Val   loss: 1.9386 | Acc@1: 75.8440 | Acc@5: 92.7020
[08-13 05:32:39] - Epoch 88: best loss improved from 1.9390 to 1.9386
[08-13 05:32:40] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [11:41,  3.57it/s, Acc@1=78.878, Acc@5=92.676, Loss=1.8871]
Epoch 89/90. validating: 101it [00:19,  5.21it/s, Acc@1=79.628, Acc@5=94.764, Loss=1.7828]
[08-13 05:44:40] - Train loss: 1.8864 | Acc@1: 78.8939 | Acc@5: 92.6786
[08-13 05:44:40] - Val   loss: 1.9386 | Acc@1: 75.8500 | Acc@5: 92.7200
[08-13 05:44:40] - Epoch 89: best loss improved from 1.9386 to 1.9386
[08-13 05:44:41] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [11:43,  3.56it/s, Acc@1=78.922, Acc@5=92.641, Loss=1.8857]              ^N
Epoch 90/90. validating: 101it [00:20,  5.00it/s, Acc@1=72.088, Acc@5=90.668, Loss=2.0943]
[08-13 05:56:45] - Train loss: 1.8857 | Acc@1: 78.9320 | Acc@5: 92.6633
[08-13 05:56:45] - Val   loss: 1.9385 | Acc@1: 75.8560 | Acc@5: 92.7180
[08-13 05:56:45] - Epoch 90: best loss improved from 1.9386 to 1.9385
[08-13 05:56:46] - Acc@1 75.856 Acc@5 92.718
[08-13 05:56:46] - Total time: 18h 33.7m

  1. ResNet 34 noact s2d + groups 16. 6.08M параметров.
ResNet 34 noact s2d + groups 16
Epoch 85/90. training: 2504it [17:50,  2.34it/s, Acc@1=76.085, Acc@5=91.208, Loss=2.0204]
Epoch 85/90. validating: 101it [00:23,  4.34it/s, Acc@1=78.220, Acc@5=94.012, Loss=1.8706]
[08-14 10:57:53] - Train loss: 2.0194 | Acc@1: 76.1246 | Acc@5: 91.2158
[08-14 10:57:53] - Val   loss: 2.0323 | Acc@1: 74.2680 | Acc@5: 91.6980
[08-14 10:57:53] - Epoch 85: best loss improved from 2.0325 to 2.0323
[08-14 10:57:53] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [17:39,  2.36it/s, Acc@1=76.348, Acc@5=91.314, Loss=2.0118]
Epoch 86/90. validating: 101it [00:23,  4.28it/s, Acc@1=70.368, Acc@5=89.448, Loss=2.1930]
[08-14 11:15:57] - Train loss: 2.0121 | Acc@1: 76.3121 | Acc@5: 91.3243
[08-14 11:15:57] - Val   loss: 2.0314 | Acc@1: 74.3040 | Acc@5: 91.7000
[08-14 11:15:57] - Epoch 86: best loss improved from 2.0323 to 2.0314
[08-14 11:15:57] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [17:28,  2.39it/s, Acc@1=76.317, Acc@5=91.387, Loss=2.0107]
Epoch 87/90. validating: 101it [00:23,  4.28it/s, Acc@1=78.224, Acc@5=93.980, Loss=1.8695]
[08-14 11:33:49] - Train loss: 2.0105 | Acc@1: 76.3668 | Acc@5: 91.3731
[08-14 11:33:49] - Val   loss: 2.0312 | Acc@1: 74.2940 | Acc@5: 91.7080
[08-14 11:33:49] - Epoch 87: best loss improved from 2.0314 to 2.0312
[08-14 11:33:50] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [17:32,  2.38it/s, Acc@1=76.464, Acc@5=91.341, Loss=2.0082]
Epoch 88/90. validating: 101it [00:22,  4.43it/s, Acc@1=70.436, Acc@5=89.428, Loss=2.1926]
[08-14 11:51:45] - Train loss: 2.0087 | Acc@1: 76.4059 | Acc@5: 91.3571
[08-14 11:51:45] - Val   loss: 2.0310 | Acc@1: 74.3680 | Acc@5: 91.7060
[08-14 11:51:45] - Epoch 88: best loss improved from 2.0312 to 2.0310
[08-14 11:51:46] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [17:43,  2.35it/s, Acc@1=76.593, Acc@5=91.455, Loss=2.0034]
Epoch 89/90. validating: 101it [00:21,  4.60it/s, Acc@1=78.272, Acc@5=93.992, Loss=1.8692]
[08-14 12:09:51] - Train loss: 2.0027 | Acc@1: 76.5807 | Acc@5: 91.4581
[08-14 12:09:51] - Val   loss: 2.0310 | Acc@1: 74.3660 | Acc@5: 91.6940
[08-14 12:09:51] - Epoch 89: best loss improved from 2.0310 to 2.0310
[08-14 12:09:51] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [17:03,  2.45it/s, Acc@1=76.564, Acc@5=91.436, Loss=2.0031]
Epoch 90/90. validating: 101it [00:21,  4.74it/s, Acc@1=70.440, Acc@5=89.372, Loss=2.1925]
[08-14 12:27:18] - Train loss: 2.0028 | Acc@1: 76.5911 | Acc@5: 91.4674
[08-14 12:27:18] - Val   loss: 2.0308 | Acc@1: 74.3560 | Acc@5: 91.6860
[08-14 12:27:18] - Epoch 90: best loss improved from 2.0310 to 2.0308
[08-14 12:27:19] - Acc@1 74.356 Acc@5 91.686
[08-14 12:27:19] - Total time: 27h 5.4

чёт пока никаких выводов


  1. ResNet 34 noact s2d + groups width 16. 6.02M параметров
ResNet 34 noact s2d + groups width 16
Epoch 85/90. training: 2504it [17:49,  2.34it/s, Acc@1=76.525, Acc@5=91.436, Loss=2.0038]
Epoch 85/90. validating: 101it [00:22,  4.42it/s, Acc@1=78.780, Acc@5=94.096, Loss=1.8557]
[08-14 11:02:42] - Train loss: 2.0034 | Acc@1: 76.5725 | Acc@5: 91.4357
[08-14 11:02:43] - Val   loss: 2.0149 | Acc@1: 74.8440 | Acc@5: 91.9020
[08-14 11:02:43] - Epoch 85: best loss improved from 2.0157 to 2.0149
[08-14 11:02:43] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [17:34,  2.37it/s, Acc@1=76.753, Acc@5=91.506, Loss=1.9971]
Epoch 86/90. validating: 101it [00:21,  4.81it/s, Acc@1=70.920, Acc@5=89.676, Loss=2.1727]
[08-14 11:20:39] - Train loss: 1.9968 | Acc@1: 76.7448 | Acc@5: 91.5391
[08-14 11:20:39] - Val   loss: 2.0142 | Acc@1: 74.8500 | Acc@5: 91.9040
[08-14 11:20:39] - Epoch 86: best loss improved from 2.0149 to 2.0142
[08-14 11:20:39] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [17:34,  2.37it/s, Acc@1=76.821, Acc@5=91.555, Loss=1.9941]
Epoch 87/90. validating: 101it [00:21,  4.66it/s, Acc@1=78.772, Acc@5=94.124, Loss=1.8548]
[08-14 11:38:36] - Train loss: 1.9945 | Acc@1: 76.8168 | Acc@5: 91.5559
[08-14 11:38:36] - Val   loss: 2.0140 | Acc@1: 74.8600 | Acc@5: 91.9120
[08-14 11:38:36] - Epoch 87: best loss improved from 2.0142 to 2.0140
[08-14 11:38:36] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [17:38,  2.37it/s, Acc@1=76.957, Acc@5=91.560, Loss=1.9925]
Epoch 88/90. validating: 101it [00:21,  4.80it/s, Acc@1=70.908, Acc@5=89.736, Loss=2.1726]
[08-14 11:56:36] - Train loss: 1.9928 | Acc@1: 76.8930 | Acc@5: 91.5636
[08-14 11:56:36] - Val   loss: 2.0137 | Acc@1: 74.8080 | Acc@5: 91.9180
[08-14 11:56:36] - Epoch 88: best loss improved from 2.0140 to 2.0137
[08-14 11:56:36] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [17:17,  2.41it/s, Acc@1=76.986, Acc@5=91.693, Loss=1.9872]
Epoch 89/90. validating: 101it [00:20,  4.85it/s, Acc@1=78.688, Acc@5=94.100, Loss=1.8545]
[08-14 12:14:15] - Train loss: 1.9872 | Acc@1: 76.9975 | Acc@5: 91.6908
[08-14 12:14:15] - Val   loss: 2.0136 | Acc@1: 74.7920 | Acc@5: 91.9120
[08-14 12:14:15] - Epoch 89: best loss improved from 2.0137 to 2.0136
[08-14 12:14:15] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [16:44,  2.49it/s, Acc@1=76.962, Acc@5=91.636, Loss=1.9884]
Epoch 90/90. validating: 101it [00:18,  5.46it/s, Acc@1=70.908, Acc@5=89.728, Loss=2.1726]
[08-14 12:31:19] - Train loss: 1.9878 | Acc@1: 76.9904 | Acc@5: 91.6604
[08-14 12:31:19] - Val   loss: 2.0136 | Acc@1: 74.7900 | Acc@5: 91.9200
[08-14 12:31:19] - Epoch 90: best loss improved from 2.0136 to 2.0136
[08-14 12:31:21] - Acc@1 74.790 Acc@5 91.920
[08-14 12:31:21] - Total time: 27h 8.0m

меньше параметров чем в 13-м эксперименте, но при этом качество заметно выше. возможно из-за того, что в первых слоях больше параметров.


  1. CSP ResNet34-50
    тут 9М параметров, что больше чем в варианте с groups, но при этом работает хуже.
    Хотя в целом для 9М параметров и такой скорости не плохо. (оно раза в 1.5 быстрее чем вариант с grouped свертками, в эксперименте 10).

Нужно попробовать без transition conv перед concat, может станет лучше.
upd. на самом деле кажется, что дело может быть в слишком маленьком количестве сверток в самом начале. нужно попробовать убрать их.

CSP ResNet34-50 + noact + s2d
Epoch 85/90. training: 2504it [09:00,  4.63it/s, Acc@1=74.384, Acc@5=90.380, Loss=2.0751]
Epoch 85/90. validating: 101it [00:16,  6.20it/s, Acc@1=77.924, Acc@5=93.860, Loss=1.8691]
[08-13 05:25:53] - Train loss: 2.0739 | Acc@1: 74.4454 | Acc@5: 90.3918
[08-13 05:25:53] - Val   loss: 2.0313 | Acc@1: 74.0460 | Acc@5: 91.5980
[08-13 05:25:53] - Epoch 85: best loss improved from 2.0322 to 2.0313
[08-13 05:25:53] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [09:00,  4.63it/s, Acc@1=74.662, Acc@5=90.471, Loss=2.0671]
Epoch 86/90. validating: 101it [00:15,  6.37it/s, Acc@1=70.208, Acc@5=89.316, Loss=2.1919]
[08-13 05:35:10] - Train loss: 2.0673 | Acc@1: 74.6425 | Acc@5: 90.4857
[08-13 05:35:10] - Val   loss: 2.0303 | Acc@1: 74.0600 | Acc@5: 91.5880
[08-13 05:35:10] - Epoch 86: best loss improved from 2.0313 to 2.0303
[08-13 05:35:10] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [09:00,  4.63it/s, Acc@1=74.672, Acc@5=90.526, Loss=2.0652]
Epoch 87/90. validating: 101it [00:16,  6.20it/s, Acc@1=77.944, Acc@5=93.808, Loss=1.8678]
[08-13 05:44:27] - Train loss: 2.0655 | Acc@1: 74.6920 | Acc@5: 90.5052
[08-13 05:44:27] - Val   loss: 2.0300 | Acc@1: 74.0900 | Acc@5: 91.5820
[08-13 05:44:27] - Epoch 87: best loss improved from 2.0303 to 2.0300
[08-13 05:44:27] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [09:00,  4.64it/s, Acc@1=74.778, Acc@5=90.543, Loss=2.0636]
Epoch 88/90. validating: 101it [00:15,  6.38it/s, Acc@1=70.268, Acc@5=89.356, Loss=2.1915]
[08-13 05:53:44] - Train loss: 2.0637 | Acc@1: 74.7393 | Acc@5: 90.5345
[08-13 05:53:44] - Val   loss: 2.0296 | Acc@1: 74.1160 | Acc@5: 91.5840
[08-13 05:53:44] - Epoch 88: best loss improved from 2.0300 to 2.0296
[08-13 05:53:44] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [09:00,  4.63it/s, Acc@1=74.806, Acc@5=90.577, Loss=2.0601]
Epoch 89/90. validating: 101it [00:16,  6.20it/s, Acc@1=77.932, Acc@5=93.864, Loss=1.8673]
[08-13 06:03:00] - Train loss: 2.0590 | Acc@1: 74.8482 | Acc@5: 90.6015
[08-13 06:03:00] - Val   loss: 2.0295 | Acc@1: 74.1180 | Acc@5: 91.6040
[08-13 06:03:00] - Epoch 89: best loss improved from 2.0296 to 2.0295
[08-13 06:03:00] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [09:00,  4.64it/s, Acc@1=74.904, Acc@5=90.595, Loss=2.0579]
Epoch 90/90. validating: 101it [00:15,  6.38it/s, Acc@1=70.284, Acc@5=89.372, Loss=2.1914]
[08-13 06:12:17] - Train loss: 2.0578 | Acc@1: 74.9071 | Acc@5: 90.6071
[08-13 06:12:17] - Val   loss: 2.0294 | Acc@1: 74.1280 | Acc@5: 91.6140
[08-13 06:12:17] - Epoch 90: best loss improved from 2.0295 to 2.0294
[08-13 06:12:18] - Acc@1 74.128 Acc@5 91.614
[08-13 06:12:18] - Total time: 13h 56.2m

  1. CSP ResNet34-50 no x2 transition
CSP ResNet34-50 no x2 transition
Epoch 85/90. training: 2504it [08:44,  4.77it/s, Acc@1=75.104, Acc@5=90.720, Loss=2.0511]
Epoch 85/90. validating: 101it [00:16,  6.28it/s, Acc@1=77.932, Acc@5=93.912, Loss=1.8666]
[08-13 23:50:06] - Train loss: 2.0500 | Acc@1: 75.1298 | Acc@5: 90.7145
[08-13 23:50:06] - Val   loss: 2.0283 | Acc@1: 74.0860 | Acc@5: 91.7280
[08-13 23:50:06] - Epoch 85: best loss improved from 2.0287 to 2.0283
[08-13 23:50:06] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [08:44,  4.77it/s, Acc@1=75.276, Acc@5=90.828, Loss=2.0435]
Epoch 86/90. validating: 101it [00:15,  6.47it/s, Acc@1=70.316, Acc@5=89.524, Loss=2.1886]
[08-13 23:59:06] - Train loss: 2.0435 | Acc@1: 75.2927 | Acc@5: 90.8264
[08-13 23:59:06] - Val   loss: 2.0274 | Acc@1: 74.1380 | Acc@5: 91.7060
[08-13 23:59:06] - Epoch 86: best loss improved from 2.0283 to 2.0274
[08-13 23:59:07] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [08:43,  4.78it/s, Acc@1=75.378, Acc@5=90.871, Loss=2.0408]
Epoch 87/90. validating: 101it [00:16,  6.28it/s, Acc@1=77.984, Acc@5=93.880, Loss=1.8656]
[08-14 00:08:06] - Train loss: 2.0414 | Acc@1: 75.3660 | Acc@5: 90.8340
[08-14 00:08:06] - Val   loss: 2.0272 | Acc@1: 74.1120 | Acc@5: 91.6900
[08-14 00:08:06] - Epoch 87: best loss improved from 2.0274 to 2.0272
[08-14 00:08:06] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [08:44,  4.78it/s, Acc@1=75.391, Acc@5=90.849, Loss=2.0403]
Epoch 88/90. validating: 101it [00:15,  6.46it/s, Acc@1=70.176, Acc@5=89.524, Loss=2.1880]
[08-14 00:17:07] - Train loss: 2.0403 | Acc@1: 75.3748 | Acc@5: 90.8567
[08-14 00:17:07] - Val   loss: 2.0268 | Acc@1: 74.1140 | Acc@5: 91.7120
[08-14 00:17:07] - Epoch 88: best loss improved from 2.0272 to 2.0268
[08-14 00:17:07] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [08:44,  4.78it/s, Acc@1=75.532, Acc@5=90.934, Loss=2.0353]
Epoch 89/90. validating: 101it [00:16,  6.27it/s, Acc@1=78.052, Acc@5=93.920, Loss=1.8654]
[08-14 00:26:07] - Train loss: 2.0338 | Acc@1: 75.5366 | Acc@5: 90.9607
[08-14 00:26:07] - Val   loss: 2.0267 | Acc@1: 74.1340 | Acc@5: 91.7520
[08-14 00:26:07] - Epoch 89: best loss improved from 2.0268 to 2.0267
[08-14 00:26:07] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [08:44,  4.78it/s, Acc@1=75.570, Acc@5=90.934, Loss=2.0336]
Epoch 90/90. validating: 101it [00:15,  6.44it/s, Acc@1=70.300, Acc@5=89.584, Loss=2.1878]
[08-14 00:35:08] - Train loss: 2.0336 | Acc@1: 75.5688 | Acc@5: 90.9464
[08-14 00:35:08] - Val   loss: 2.0266 | Acc@1: 74.1660 | Acc@5: 91.7500
[08-14 00:35:08] - Epoch 90: best loss improved from 2.0267 to 2.0266
[08-14 00:35:09] - Acc@1 74.166 Acc@5 91.750
[08-14 00:35:09] - Total time: 13h 39.7m

чуть быстрее чем версия С x2 transition, чуть лучше (но это не очень достоверно), ниже лосс на трейне, т.е. как будто лучше обучается. пока кажется, что смысла в transition нет


  1. CSP ResNet34-50 no x2 transition no first CSP 0.75 csp ratio. 12.45М параметров
    Removed csp in first block to reduce representation bottleneck
    Increased csp ratio to have more parameters
    Сравнивать нужно с 12м. Этот вариант быстрее, на 4М меньше параметров и хуже по качеству. кажется что просадка не значительная. нужно попробовать 12й и 17 на 100 классов
CSP ResNet34-50 no x2 transition no first CSP 0.75 csp ratio
[08-18 03:08:46] - Epoch 85 | lr 3.08e-03
[08-18 03:19:49] - Train loss: 1.9607 | Acc@1: 77.1407 | Acc@5: 91.8156
[08-18 03:19:49] - Val   loss: 1.9719 | Acc@1: 75.2340 | Acc@5: 92.3480
[08-18 03:19:49] - Epoch 85: best loss improved from 1.9723 to 1.9719
[08-18 03:19:49] - Epoch 86 | lr 2.21e-03
[08-18 03:30:49] - Train loss: 1.9535 | Acc@1: 77.3081 | Acc@5: 91.9243
[08-18 03:30:49] - Val   loss: 1.9713 | Acc@1: 75.2460 | Acc@5: 92.3360
[08-18 03:30:49] - Epoch 86: best loss improved from 1.9719 to 1.9713
[08-18 03:30:49] - Epoch 87 | lr 1.48e-03
[08-18 03:41:49] - Train loss: 1.9520 | Acc@1: 77.3594 | Acc@5: 91.9464
[08-18 03:41:49] - Val   loss: 1.9705 | Acc@1: 75.2700 | Acc@5: 92.3720
[08-18 03:41:49] - Epoch 87: best loss improved from 1.9713 to 1.9705
[08-18 03:41:49] - Epoch 88 | lr 8.98e-04
[08-18 03:52:47] - Train loss: 1.9498 | Acc@1: 77.4201 | Acc@5: 91.9562
[08-18 03:52:47] - Val   loss: 1.9703 | Acc@1: 75.2920 | Acc@5: 92.3880
[08-18 03:52:47] - Epoch 88: best loss improved from 1.9705 to 1.9703
[08-18 03:52:48] - Epoch 89 | lr 4.58e-04
[08-18 04:03:42] - Train loss: 1.9440 | Acc@1: 77.5878 | Acc@5: 92.0432
[08-18 04:03:42] - Val   loss: 1.9703 | Acc@1: 75.2920 | Acc@5: 92.3900
[08-18 04:03:42] - Epoch 90 | lr 1.65e-04
[08-18 04:14:40] - Train loss: 1.9443 | Acc@1: 77.5711 | Acc@5: 92.0437
[08-18 04:14:40] - Val   loss: 1.9702 | Acc@1: 75.2880 | Acc@5: 92.3960
[08-18 04:14:40] - Epoch 90: best loss improved from 1.9703 to 1.9702
[08-18 04:14:41] - Acc@1 75.288 Acc@5 92.396
[08-18 04:14:41] - Total time: 16h 39.4m

  1. CSP ResNet34-50 no x2 transition no first CSP 0.5 csp ratio. 9.35М параметров
    Отличие от 16го - нет CSP в первом блоке
    Работает лучше чем 16, хотя параметров всего на 0.03М больше. значит no first csp - хорошая идея
CSP ResNet34-50 no x2 transition no first CSP 0.5 csp ratio
[08-18 02:53:50] - Epoch 85 | lr 3.08e-03
[08-18 03:04:43] - Train loss: 2.0415 | Acc@1: 75.2850 | Acc@5: 90.8460
[08-18 03:04:43] - Val   loss: 2.0199 | Acc@1: 74.4380 | Acc@5: 91.8240
[08-18 03:04:43] - Epoch 85: best loss improved from 2.0202 to 2.0199
[08-18 03:04:43] - Epoch 86 | lr 2.21e-03
[08-18 03:15:28] - Train loss: 2.0353 | Acc@1: 75.4592 | Acc@5: 90.9374
[08-18 03:15:28] - Val   loss: 2.0192 | Acc@1: 74.4380 | Acc@5: 91.7880
[08-18 03:15:28] - Epoch 86: best loss improved from 2.0199 to 2.0192
[08-18 03:15:29] - Epoch 87 | lr 1.48e-03
[08-18 03:26:20] - Train loss: 2.0326 | Acc@1: 75.5330 | Acc@5: 90.9636
[08-18 03:26:20] - Val   loss: 2.0186 | Acc@1: 74.4280 | Acc@5: 91.8100
[08-18 03:26:20] - Epoch 87: best loss improved from 2.0192 to 2.0186
[08-18 03:26:20] - Epoch 88 | lr 8.98e-04
[08-18 03:37:06] - Train loss: 2.0312 | Acc@1: 75.5901 | Acc@5: 91.0040
[08-18 03:37:06] - Val   loss: 2.0183 | Acc@1: 74.4200 | Acc@5: 91.8500
[08-18 03:37:06] - Epoch 88: best loss improved from 2.0186 to 2.0183
[08-18 03:37:06] - Epoch 89 | lr 4.58e-04
[08-18 03:47:54] - Train loss: 2.0258 | Acc@1: 75.7582 | Acc@5: 91.0742
[08-18 03:47:54] - Val   loss: 2.0181 | Acc@1: 74.4300 | Acc@5: 91.8520
[08-18 03:47:54] - Epoch 89: best loss improved from 2.0183 to 2.0181
[08-18 03:47:55] - Epoch 90 | lr 1.65e-04
[08-18 03:58:40] - Train loss: 2.0254 | Acc@1: 75.7276 | Acc@5: 91.0748
[08-18 03:58:40] - Val   loss: 2.0180 | Acc@1: 74.4640 | Acc@5: 91.8600
[08-18 03:58:40] - Epoch 90: best loss improved from 2.0181 to 2.0180
[08-18 03:58:41] - Acc@1 74.464 Acc@5 91.860
[08-18 03:58:41] - Total time: 16h 23.5m

  1. ResNet 34 noact s2d + groups width 16 + no groups in stride 2 blocks. 9.01M параметров

Убрал groups в блоках, где stride=2. количество параметров заметно увеличилось, скорость упала. Лосс лучше чем в 14. и 13. но возможно все дело в лишних параметрах. не понятно пока

ResNet 34 noact s2d + groups width 16 + no groups in stride 2 blocks. 9.01M параметров
Epoch 85/90. validating: 101it [00:17,  5.74it/s, Acc@1=78.108, Acc@5=94.380, Loss=1.8438]
[08-18 06:30:07] - Train loss: 1.9924 | Acc@1: 76.4693 | Acc@5: 91.4885
[08-18 06:30:07] - Val   loss: 2.0006 | Acc@1: 74.5840 | Acc@5: 92.1380
[08-18 06:30:07] - Epoch 85: best loss improved from 2.0011 to 2.0006
[08-18 06:30:08] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [13:04,  3.19it/s, Acc@1=76.684, Acc@5=91.619, Loss=1.9843]
Epoch 86/90. validating: 101it [00:17,  5.89it/s, Acc@1=71.076, Acc@5=89.960, Loss=2.1563]
[08-18 06:43:30] - Train loss: 1.9848 | Acc@1: 76.6472 | Acc@5: 91.6114
[08-18 06:43:30] - Val   loss: 1.9999 | Acc@1: 74.6200 | Acc@5: 92.1680
[08-18 06:43:30] - Epoch 86: best loss improved from 2.0006 to 1.9999
[08-18 06:43:30] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [13:05,  3.19it/s, Acc@1=76.760, Acc@5=91.633, Loss=1.9825]
Epoch 87/90. validating: 101it [00:17,  5.75it/s, Acc@1=78.212, Acc@5=94.344, Loss=1.8426]
[08-18 06:56:53] - Train loss: 1.9829 | Acc@1: 76.7349 | Acc@5: 91.6323
[08-18 06:56:53] - Val   loss: 1.9995 | Acc@1: 74.6540 | Acc@5: 92.1560
[08-18 06:56:53] - Epoch 87: best loss improved from 1.9999 to 1.9995
[08-18 06:56:53] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [13:04,  3.19it/s, Acc@1=76.844, Acc@5=91.617, Loss=1.9805]
Epoch 88/90. validating: 101it [00:17,  5.90it/s, Acc@1=71.068, Acc@5=89.916, Loss=2.1558]
[08-18 07:10:15] - Train loss: 1.9809 | Acc@1: 76.7961 | Acc@5: 91.6332
[08-18 07:10:15] - Val   loss: 1.9991 | Acc@1: 74.6820 | Acc@5: 92.1540
[08-18 07:10:15] - Epoch 88: best loss improved from 1.9995 to 1.9991
[08-18 07:10:15] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [13:04,  3.19it/s, Acc@1=76.942, Acc@5=91.713, Loss=1.9755]
Epoch 89/90. validating: 101it [00:17,  5.76it/s, Acc@1=78.244, Acc@5=94.364, Loss=1.8421]
[08-18 07:23:37] - Train loss: 1.9751 | Acc@1: 76.9273 | Acc@5: 91.7137
[08-18 07:23:37] - Val   loss: 1.9988 | Acc@1: 74.6800 | Acc@5: 92.1480
[08-18 07:23:37] - Epoch 89: best loss improved from 1.9991 to 1.9988
[08-18 07:23:38] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:04,  3.19it/s, Acc@1=76.914, Acc@5=91.726, Loss=1.9750]
Epoch 90/90. validating: 101it [00:17,  5.88it/s, Acc@1=71.128, Acc@5=89.964, Loss=2.1554]
[08-18 07:37:00] - Train loss: 1.9750 | Acc@1: 76.9392 | Acc@5: 91.7437
[08-18 07:37:00] - Val   loss: 1.9987 | Acc@1: 74.6940 | Acc@5: 92.1680
[08-18 07:37:00] - Epoch 90: best loss improved from 1.9988 to 1.9987
[08-18 07:37:01] - Acc@1 74.694 Acc@5 92.168
[08-18 07:37:01] - Total time: 20h 2.2m

??. поменять количество слоёв на 3, 4, 6, 3 -> 2, 4, 8, 2
??. сделать модель пожирнее 64, 128, 256, 512 -> 64, 160, 400, 1024 (идея из regnet, что нужно увеличивать больше чем в 2 раза)
??. идея из rexnet - увеличивать количесто слоёв каждый блок, а не каждый stage

@bonlime
Copy link
Owner Author

bonlime commented Aug 6, 2020

Как должен выглядеть идельный Building блок для сети?

  1. там должные быть conv + normalization + activation. порядок может быть другой.
    PreActivation ResNet показывает, что важно сохранять residual path чистым, убрав оттуда все relu. авторы предлагают BN -> Act -> Conv -> Addition. Таким образом residual path всегда остается чистым. После PreAct Resnet про эту идею забыли, но что-то похожее было в MobileNet v2 где они убрали последнуюю активацию, чтобы оставить основной проход чистым.
    upd. В статье Wider or Deeper: Revisiting the ResNet Model for Visual Recognition авторы используют pre-activation. Еще они там показывают, что можно сделать сетку сильно менее глубокой чем ResNet при том же качестве. Плюс они много говорят о потоках градиентов через ResNet что пересекается с мыслями в Res2Net.

Авторы утверждают, что градиенты все равно быстро гаснут и resnet это ансамбль большого числа не очень глубоких сеток. картинка из apendix показывает, что градиенты тухнут через ~5 блоков

  1. есть двухслойный вариант (resnet34: conv3x3 -> conv3x3). Есть 3х слойный вариант (resnet50: conv1x1 -> conv3x3 -> conv1x1 или как в MobileNet Inverted Residual, которая увеличивает количество канал). resnet50 так сделан, что у него одинаковое количество параметров в resnet34, но он работает лучше. т.е. dimensionality reduction важно. В Mobilenet V2 были рассуждения про то, как ReLU убивает информацию в пространстве. я не до конца их понял, надо потом будет перечитать, но очевидные take away оттуда такие - нужно убирать relu из стема и residual в bottlenecks работает лучше чем между блоками.

upd. кажется, что на самом деле Basic Block / Bottleneck with ratio 1 должны работать лучше чем дефолтный Bottleneck в ResNet и единственная причина, по которой тот плохо обучается - 512 каналов на выходе.

upd. в силу особенностей современных видеокарт, conv3x3 дают бОльшую computational density и поэтому считаются с такой же скоростью, при бОльшем количестве параметров, рассуждения о том, как это связано с DRAM есть в статье про HardNet

upd. В оригинальной статье про ResNeXt авторы тупо зафиксировали количество групп на свертку. но кажется, что гораздо важнее фиксировать количество каналов на группу. Статья про RegNet показывает, что 16 chs / group - нормально рабоает. это еще пересекается с результатми в Group Norm, где у них тоже лучше всего работало 16 chs / group.

Не обязательно использовать одинаковые блоки по всей сетке. в TResNet используют BasicBlock в первых двух стадиях и Bottleneck Block в последующих

Статья про Regnet даёт следующие инсайды про блоки:

  • Лучший bottleneck ratio <= 2
  • Groups > 1 work better
  • Лучше всего работает не удвоение количества весов, а добавление в каждый блок какого-то фиксированного количества
  • больше w0 на входе (то про что Антон говорил. идея что ты хочешь вначале много инфы из картинки запомнить
  • исходя из анализа графиков RegNet моделей. stage 1 должен быть из 2х блока
    upd. после прочтения статьи про ReXNet осознал, что экперипенты показали, что лучше увеличивать глубину линейно, но авторы все равно зачем-то привели все к quantizied linear
    image
  1. куда ставить attention? в середину блока. для Bottleneck после conv3x3, в InvertedResidual тоже в середине. Вместо Sigmoid в SE можно ставить hard sigmoid. В случае res2net нужен дополнительный conv1x1 для смешивания каналов, поэтому attention видимо должен пойти после него

3.1 какой attention ставить? в SE плохо то, что есть dimnesionality reduction. можно вместо этого использовать 1) Efficient Channel Attention. или 2) SE без reduction 3) или SE но с grouped свертками. нужно посмотреть, не будет ли это медленне чем без reduction.
в WeightNet: Revisiting the Design Space of
Weight Networks
предлагают что-то похожее на se с группами
upd. 12.09.20 посмотрел еще раз статью про ECA. кажется что лучший вариант это sigmoid( conv1x1( GAP(x), bias=True)), потому что кажется что авторы ECA натянули свои результаты, чтобы они были чуть выше чем этот вариант, но при этом такой attention видит связь со всеми каналами

upd. 12.01.21 - SE-Var3 даёт неприятно много параметров, но при этом работает не лучше чем SE, что странно, потому что у авторов работы про ECA оно было заметно лучше (см. exp107-111 ниже). но работает быстрее SE

еще в послднее время наткнулся на несколько интересных статей про attention:

1.. Spatial and Channel ‘Squeeze & Excitation’ (scSE) - предлгают делать SE + conv1x1 для локального attention и потом конкатить результаты. главный минус - на выходе количество каналов увеличивается в 2 раза и это не удобно.

2.. Attentional Feature Fusion - предлагают то же что выше, но берут сумму global & local attention и только потом считают sigmoid. выглядит лучше чем статья выше и легче втыкать. Называют блок MS-CAM.
image
Еще в статье есть мысли о том, как правильно делать fusion внутри каждого блока, выглядит логично, но нет замеров по скорости, а это может быть критично.
image
В целом статья хорошего качества и результаты вызывают доверие. upd. автор забыл упомянуть в статье. что скорость заметно падает, потому что его вариант хоть и не добавляет много параметров, но применяет 1x1 свертку ко всем пикселям изображения. еще одна важная деталь - attention есть только в последних двух блоках для эффективности

3.. Enhanced Visual Attention-Guided Deep Neural Networks for Image Classification - тут есть классная идея - использовать последний канал как spatial attention, что выглядит логичным. можно попробовать совместить это с SE для глобального контекста

  1. FcaNet: Frequency Channel Attention Networks - говорят что сильно лучше SE при том что меняют всего одну строчку, приводят много каких-то теоретических обоснований почему лучше. Выглядит интересно, нужно прочитать.
    upd. прочитал. авторы говорят, что на картике есть много частот, но GAP учитывает только самую низкую, если же учесть и остальные, то качество растет. на практике выглядит так, что есть отдельный тензор, размером со входную картинку, на которую умножается feature map перед FC
    image

Вопросы к статье:

  • говорят что extra flops are neglitible но почему-то не мерят скорость
  • скорее всего эти доп. тензоры заметно увеличивают количество необходимой памяти
  • говорят что лучше всего работает 16 frequency, но это похоже на оверфит и нет std. утвердаю что 4 будет работать точно так же
    если посмотреть на картинки того, что они используют, становится понятно что это очень похоже на идеи из CoordConv, фильтры точно такие же. да и вообще coordinate embedding выглядит как отличная идея для conv слоёв, чтобы они стали чуть менее translation invariant. Идея авторов классная, потому что они воткнули этот эмбединг в место, где он не будет слишком сильно замедлять сетку
    image
  1. как уменьшать разрешение. ResNet почему-то использует stride 2 conv3x3 + maxpool, но не использует stride в первом блоке. кажется что лучше вначале воткнуть один space2depth + bn и во всех следующих блоках использовать stride=2. output stride сразу даёт ответ на вопрос о том, сколько должно быть блоков
    .
    В ResNet уменьшение размерности происходит в двух местах - внутри bottleneck и в отдельной ветке для residual. В целях упрощения, можно убрать residual из блоков, где stride=2.
    upd. убирание уменьшает количество параметров, ускоряет сетку и улучшает качество. чистый win
    upd. 12.09.20 если внимательно посмотреть на exp2 vs exp3 видно что качество падает сильно! нифига не чистый win. Еще exp26 (GENet original) vs exp36 & 37 показывают что убирание residual из таких блоков - плохая идея. другой вопрос - как уменьшать

  2. как должен выглядеть stem?
    Сравнение скорости с разным входом:

Option Forward Time (msec) Max Memory FPS
maxpool + stride 1 in block 1 26.87+-0.05 600.43Mb 2382.00
stride 2 in block 2 27.88+-0.07 722.59Mb 2295.46
S2D + conv3x3 28.46+-0.08 601.27Mb 2248.49
S2D + conv1x1 27.40+-0.07 600.52Mb 2335.62

Нужно сравнить дефолтный и stride 2 in conv 1, может быть оно будет работать лучше (?)

  1. как должен выглядеть stride 2 block?
    Кажется, что часто именно он мешает нормальному обучению сеток, часто вижу графики, где stride=2 блоки как-то выделяются
  • В статье про anti aliased CNN добавляли Blur Pool (который стабильно докидывает)

  • В статье про ReXNet показывали, что сильное увеличение количества каналов в stride=2 приводит к representational bottleneck.

  • В статье про MixNet предлагали заменить 3x3 depthwise свертки на сверти 3ч3, 5х5, 7х7, 9х9. таким образом поднимая receptive field каждой свертки (идея чем-то пересекается с res2net кстати). на картинке видно, что это особенно важно для stride=2 сверток

image

upd. 2.09.20 Обсуждение блоков с Владом
кажется, что блок 1x1 -> 3x3 -> 1x1 с r=1 не правильный, потому что 1x1 на самом деле не нужны. хочется использовать по максимуму 3x3. в inverted residual блоках свертки 1x1 нужны для увеличения/уменьшения количества фильров. увеличение нужно, чтобы не было слишком мало параметров. если у нас не DW а просто grouped, то параметров будет больше и можно обойтись вообще без увеличения.

предлагается блок 3x3 -> 1x1 -> 3x3 -> 1x1, где у 3x3 grouped, а 1x1 перемешивают. или можно поменять порядок 3x3 и 1x1. важно что 1x1 после каждой grouped свертки, чтобы перемешивать.

Knowledge Distillation and other distillations. CONTRASTIVE REPRESENTATION DISTILLATION (CRD)

MEAL V2: Boosting Vanilla ResNet-50 - получают впечатляющие цифры, но по сути делают мало. Ключевая идея - ванильный KD через KL лосс между моделью и средним между предсказаниями учителей + зачем то навешивают лосс дискриминатора, чтобы отличать выход сетки от выхода учителя. говорят что с помощью этого регуляризируют, но хз. У них стоит wd=0 и мало аугментаций, возможно будет работать и без дискриминатора. Еще из важного - они начинают учить сетку не с нуля, а берут уже претренированную сетку (с acc 79% потому что её timm так хорошо обучил). а до этого люди обычно с нуля пытались учиться. так что вклад статьи еще сомнительнее становится

Bootstrap Your Own Latent A New Approach to Self-Supervised Learning
Проблема обычного contrastive в том, что для того чтобы представления не схлопнулись, нужно сравнивать положительный пример в большим количеством отрицательных, чтобы среди этих отрицательных нашелся пример "близкий" к положительному и сетка хорошо училась их разделять.

Авторы берут две аугментированные картинки, пропускают через модель и EMA модель, минимизируют cosine distance между двумя полученными представлениями. Звучит просто (и похоже на то, что предалагал я), но есть пара нюансов, они предсказывают сначала representation -> projection -> prediction, они так называют тот факт, что у них MLP в голове сетки. 2048 (после AvgPool) -> 4096 -> 256 (забавно что даже при размере final layer в 4 раза меньшем чем количество классов, сетка всё равно прекрасно учится их линейно разделять).
Еще для симметрии авторы пропускают обе картинки через обе сетки и считают сумму этих лоссов. (именно из-за этого они не могут пропускать через EMA неаугментированную картинку)

Supervised Contrastive Learning - до этого люди пытались предобучать модели для image classification с помощью contrasive loss, оно работало, но была одна проблема - contrastive loss не в курсе про классы и может расстаскивать картинки из одного класса далеко друг от друга. идея - давайте поверх 2048-d вектора перед logits навесим две головы. на одной будем считать старый добрый softmax, а на другой - contarasitve. вся суть сразу становится понятна, если посмотреть на картинки в статье. с одной стороны нам теперь нужны лейблы для всех картинок, но с другой contrasitve как будто помогает лучше подтягивать распределения для softmax (хз что написал, сам не понимаю). Самое главное - отлично бустит качество supervised классификации, выглядит как plug in play. Для R50 77% -> 78.8% кмк не плохо. upd. 29.10.20 почему-то совсем забыл про эту статью, ведь идея реально крутая, надо подумать как с MoCo объединить
перечитал статью, нашел еще пару важных деталей. 1) они тоже используют projection в 128-n dim и L2 norm для обоих голов. Из-за того что у нас есть лейблы, в батче может быть несколько положительных примеров, авторы изучают два варианта лоссов, показывают что вот такой работает лучше:
image

грубо говоря хочется чтобы сумма InfoNCE для всех positive anchors была максимальной, говорят что их лосс 1) обобщается на любое количество positive 2) улучшается с увеличением количества negative 3) при нормализации на сферу неявно происходит hard negative mining

Momentum Contrast for Unsupervised Visual Representation Learning aka MoCo
Тут важно отметить исторический контекст, эта статья от FAIR вышло до SimCLR, т.е. они параллельно придумали две прикольные вещи, а потом авторы MoCo докинули себе идей из SimCLR.
Краткий обзор: смотрим на contrastive learning (CL) как на dictionary проблем, по query (Q) найти наиболее похожий ключ (K), но не в явном виде найти, а чтобы InfoNCE был высокий. вопрос - как считать K?

вариант 1) end-to-end т.е. ключи получаются из той же модели что выдаёт Q, но как показали многие предущие статьи - размер батча для майнинга хороших HardNegative примеров очень важен. (не понимаю тогда почему они говорят вообще про какую-то Q, когда можно с тем же успехом пихать рандомные батчи? upd. ответ такой: можно пихать рандомные батчи, но для них снова нужно считать представление, а для истории они у нас доступны бесплатно.

вариант 2) memory bank - хранить уже посчитанную историю для прошлых батчей, используя её как негативные примеры. как-то работает, но не очень хорошо по той причине, что предсталвения были посчитаны на других весах, которые отличаются от текущих (так говорят авторы, но возможно дело еще в том, что такие представления не стабильные и это гораздо сильнее портит обучение, пришел к таким выводам потому, что memory банк работает сильно хуже даже на очень маленьких батчах, когда ошибка в разнице предсказаний еще точно не накопилась). по сравнению с BS=16к - всего 16 шагов, ema decay стоит ~0.999, т.е. MoCo делает предсказания сильно стабильнее. судя по тому, что даже с маленким размером memory MoCo работает сильно лучше этого варианта, основное улучшение статьи именно в стабильном представлении через EMA
вариант 3) MoCo - считать EMA по весам модели, с помощью этих весов считать представления для новых и добавлять их к старым. От размера памяти зависит как сильно нужно "раскидать" по пространству точки и если он большой, приходится делать это умнее, наверно поэтому растет качество.

важно! в коде они еще дополнительно нормализуют выходы обоих энкодеров, это логично с точки зрения contrastive learning (хочется чтобы точки были на сфере), но они не пишут об этом в статье

image

Improved Baselines with Momentum Contrastive Learning aka MoCo v2
Улучшения MoCo от авторов, предлагают вот что: 1) заменить голову сетки на MLP (обычно в сетках идет 1024 -> 2048 -> 1000, т.е. и так своего рода MLP, не понятно какой вариант был у авторов изначально, просто 1024 -> 1000 что ли?) поскольку они потом учат линейную лог.регрессию на представлениях, MLP не увеличивает количество реальных параметров, а лишь помогает обучиться, т.е. это идейно чистый win 2) добавляют Blur Augmentation, пишут что она одна сильно бустит. довольно очевидная вещь, нечего добавить. 3) cosine sheduling 4) подольше поучить - 800 (!) эпох вместо 200 5) еще говорят о том что размер BS важен, но т.к. в MoCo есть очередь, они не зависят от железа и могут симулировать любые размеры батча, что как они замечают, очень важно (показывают что SimCLR на маленьких батчах плохо работает).

Meta Pseudo Labels
Авторы задаются вопросом - как получить хорошие target distribution для обучения? 1) брать one-hot 2) one-hot + label smoothing 3) Knoledge Distillation - во всех этих случаях у нас либо есть bias (2) либо таргет фиксированный во время обучения, хочется вместо этого как-то адаптивно менять, чему учится сетка.
image

А давайте просто будем использовать Meta Pseudo Labels, т.е. будет еще одна маленькая сетка, которая будет процессить таргеты и выдавать что-то такое, оптимизация по чему будет улучшать лосс на валидации. тут важно заметить, что ученик никоим образом не видит валидационных примером, мы лишь хитро подстраиваем трейн лосс. Есть пара имплементационных деталей, без которых не работает - нужно учить Учителя не только на выходах студента, но и на GT валид. лоссе, чтобы S & T не смогли деградировать вместе.

T это 5й слойный MLP c hidden=512

в целом очень крутая идея. единственное у них представления посчитаны заранее с помощью какой-то большой сетки. если бы можно было всё делать онлайн..., наверно это можно сделать через EMA вот так: модель выдает предсказания для аугментированных картинок. EMA на читых картинках -> pseudo labels, потом уже эти labels пропускаем через 5L MLP и вот это MLP уже учим. звучит логично, но к сожалению это всё может легко задеградировать(

Knowledge Distillation Meets Self-Supervision
Делают что-то очень похожее на Contrastive Representation Distillation (см. выше), но утверждают что у них есть разница.
The difference is the purpose of SS (self-supervision) and how contrastive task is performed. In CRD, contrastive learning is performed across teacher and student networks to maximize the mutual information between two networks. In SSKD, contrastive task serves as a way to define knowledge. It is performed separately in two networks and then matched together through KL-divergence, which is very different from CRD.
In SSKD, however, the main goal is not to learn representations invariant to transformations, but to exploit contrastive prediction as an auxiliary task for mining richer knowledge from the teacher model
Используют вот такой лосс для обучения contrasitve части:
image
Teacher учат в две стадии. сначала учат всю сетку + classification head, потом всё морозят и учат только SS модуль, который по сути делает contrastive. в отличии от Supervised Contrastive на втором шаге они выкидывают лейблы и учатся только на положительных/негативных парах. что менее end-to-end, доучивают SS они для того, чтобы тот выдавал что-то адекватное и его можно было использовать для distillation. в 3.3 они отмечают, что т.к SS не училась вместе со всей сеткой, она иногда выдаёт неправильне предсказания, которые в малых дозах полезны, но в больших портят обучение, поэтому они каждый раз сверяются с GT и делают transfer только с правильных лейблов и k% не правильных. (на практике k~50-75% т.е. выкидывают только четверть самых плохих предсказаний

Финальный лосс student состоит из 4х (!) частей
image
image
image
если пытаться объяснить по-человечески, то лосс состоит из 1) CE на чистых картинках, 2) KLD для чистых картинок (в обе сетки пихают чистую) 3) KLD для шумных картинок (в обе сетки пихают шумные). авторы отмечают, что т.к. возможно ауги уничтожили semantic информацию, накидывать CE на шумные картинки нельзя, а вот KLD самое то 4) в этом лоссе суть статьи. KLD между contrastive simularity matrix обоих сеток. по сути 1. и 2. это дефолтный KLD, авторы показывают что добавление 3. или 4. тоже помогает. авторы говорят, что чем больше лоссов, тем больше "dark knowledge" перетекает в студента.

Отмечу, что авторы где-то используют нормализацию, где-то не используют и везде используют температуру. Сравнивают качество разных self-supervised задач типо jigsaw и rotation, показывают что contrasitve работает лучше всего. Сравнивают много других KD методов, показывают что CRD работает лучше всех (после их метода конечно же). Пытаются учиться только с помощью лосса 4, но у них плохо работает. имхо дело в использовании KLD, если бы они как-то умнее считали contrastive между T и S, оно бы лучше работало (у MoCo и BYOL же работает). В целом хорошая статья, но работает имхо вопреки, а не благодаря. вместо того чтобы определять знание через contrastive matrix и потом пытаться его передать через KLD, лучше сразу как-то представления матчить, имхо.

@bonlime
Copy link
Owner Author

bonlime commented Aug 7, 2020

Еще одно место для краткого содержания статей

Хочется улучшить лосс для классификации, привнеся идеи из metric learning, чтобы the maximal intra-class distance is smaller than the minimal inter-class distance under a certain metric

Статьи важно читать в хронологическом порядке, чтобы понимать как менялись подходы

SphereFace: Deep Hypersphere Embedding for Face Recognition (apr 2017 v1, jan 2018 v2)
Решают задачу open-set face recognition (т.е. набор людей в test set и train set разный). Дефолтный лосс - softmax (cross-entropy), которйы учит separable features that are not discriminative т.е. границы классов пролегают очень близко друг к другу. Center loss -добавляет дополнительный лосс за отклонение от центра классов, но если классов много, центры дорого и долго считать. Contrasitve/Triplet loss требует чтобы расстояние между positve было больше чем между negative, проблема в том, что из-за размеров пространства, triplet loss будет низким чисто на рандоме, поэтому нужно придумывать какие-то хитрые способы майнинга. Еще многие другие работы используют euclidian distance для разделения классов, но это не идеально, потому что softmax naturally раскидывает фичи по углам (в статье есть матан почему), предлагается это использовать.

image

авторы предлагают A(ngular)-Softmax, приходя к нему через 2 шага. сначала нормировать веса последнего Linear слоя, убрать из него bias. тогда decision boundary будет зависеть только от угла между фичами и центрами классов, называют это modified softmax. но такой лосс не уменьшает intra-class angle, т.е не стягивает точки внутри класса друг к другу. чтобы этого добиться, предлагают ввести параметр m, геометрический смысл которого такой: если раньше для правильной классификации было достаточно чтобы O_1 < O_2, то теперь требуем чтобы O_1 * m < O_2, (где О_1 и О_2 это углы между объектом и центрами двух классов), т.е. требуем чтобы расстояние до центра соседнего класса было в m раз больше чем до центра своего. на практике авторы используют m=4. см. картинку
image

вдохновившись статьей решил нарисовать фичи для 3х случайных классов обученной на Imagenet сетки (после PCA) и тут правда хорошо видно angular structure! картинка почти такая же как у авторов выше, чудеса
image

минусы подхода:
1.. intra-class size зависит от угла theta, т.е. некоторые классы "стягиваются" сильнее чем другие, из-за того, что центры классов не обязательно соотносятся с осями. и для похожих классов (центры которых лежат рядом друг с другом) margin будет маленьким, а мы хотим большой
2.. еще есть какая-то проблема с тем, что m - целое, тип лосс очень 'крутой', но я пока не очень понимаю эту часть
3.. cos не монотонная и нужно применять определенные хаки, чтобы оно работало
4.. softmax dominates cosine loss, делая фичи менее разделимыми

CosFace: Large Margin Cosine Loss for Deep Face Recognition (jan 2018 v1, apr 2018 v2)
Задача - face recognition. В отличие от A-Softmax предлагают large margin cosine loss (LMCL), который требует разделимости не в угловом пространстве, а в косинусном, эффективно решая первую проблему A-Softmax.т.е. хочется чтобы cos(θ1) - m ≥ cos(θ2).
Картинка ниже из ArcFace, в статье CosFace есть похожая, но там авторы неправильно нарисовали границы для cosface, они нарисовали их прямыми, хотя на деле они искривляются из-за природы косинуса.
image

Дальше авторы объясняют почему важно дополнительно нормировать фичи (A-Softmax нормирует только веса). Если изначально cos(θ1) ~ cos(θ2), то один из способ уменьшить лосс - уменьшая норму фичей, что вредит оптимизации т.к. оптимизирует не то, что нам хочется. НО ! авторы предлагают нормировать не на единичную сферу, а на сферу радиусом s. чем больше s тем меньше лосс и тем "больше пространства" для фичей, что упрощает оптимизацию. s и m зависят друг от друга
Авторы используют m=0.35, s=64

ArcFace: Additive Angular Margin Loss for Deep Face Recognition (jan 2018 v1, feb 2019 v3)
Задача - face recognition. В отличие от cos face предлагают добавлять margin в угловом прострастве, а не косинусном. Весь метод в одной картинке. На деле работает лучше чем CosFace, хорошо разделяет positive & negative пары,
image

upd. 28.12.20
судя по всему первая версия работы про ArcFace сильно отличалась от третей, которую я читал. вот тут можно посмотреть первую, с классными распределениями углов для положительных и отрицательных классов. и классными примерами шума в разметке данных

A Performance Evaluation of Loss Functions for Deep Face Recognition
Сравнили Softmax, A-Softmax, CosFace, ArcFace на большом количестве датасетов на двух разных моделях, получили что ArcFace лучше всех

AMC-Loss: Angular Margin Contrastive Loss for Improved Explainability in Image Classification
Предложили по сути то же самое что ArcFace, но в 2020 🤦

Dyn-arcFace: Dynamic Additive Angular Margin Loss for Deep Face Recognition (нет статьи, только выступление на ICCV 2019)

ArcFace хорош, но у него нет штрафа за intra-class distance, т.е. он начинает сжимать классы только если поставить достаточно большое значение margin. Идея - использовать адаптивный margin, который будет зависеть от расстояния до ближайшего центра класса, чем больше расстояние, тем больше margin, чтобы intra-class не расползались слишком сильно. Центры класов очен дешево получаются из матрицы весов последнего (нормализованного) слоя.

image
Эксперименты показывает, что это улучшает качество по сравнению с ArcFace. Хорошая статья, которая поднимает важный вопрос про наказание за большой intra-class, но возможно это можно делать элегантнее?

Мои мысли:
Идею CenterLoss изначально выкинули из-за того, что там сложно было считать центры, но в случае с ArcFace центры это строки матрицы. возможно добавление дополнительного члена, который будет наказывать за отклонение от центра еще сильнее улучшит ArcFace (вот пишу и думаю, что это точно кто-то уже придумал).

AdaCos: Adaptively Scaling Cosine Logits for Effectively Learning Deep Face Representations
Angular методы это конечно хорошо, но у них аж 2 гиперпараметра, причём performance очень чувствителен к обоим из них. нужно подбирать s под количество классов и m под сложность разделения классов.
На что влияет s: на min & max вероятности после softmax. точные границы вот такие:
image
чего нам хочется от S? чтобы вероятность (а значит и лосс) менялись монотонно по мере уменьшения угла от π / 2 до 0. этого можно достичь подбором s под конкретное количество классов. (note они почему-то берут очень странную оценку для константы B, они оценивают её минимальным возможным значением, но возможно это не влияет на анализ). Если s слишком маленький - будет наказывать даже при очень маленьком угле, если слишком большой - не будем наказывать даже при очень большом угле.

На что влияет m: на минимальный угол, после которого лосс начинает падать. если поставить m очень большим, то даже при маленьком угле вероятность будет близка к 0, это не то чего хочется. во всех предыдущих статьях m выбирают чисто на глазок

Если внимательно посмотреть на картинку снизу, видно что s влияет на ширину кривой, а m только сдвигает её. авторы предлагают убрать m вообще и сфокусироваться на автоподборе хорошей s. Дальше следует немного матана и доказательств, вывод которых - для хорошего подбора и оценки S нужно знать сумму остаточных членов в знаменателе softmax (т.е. всех тех что не в числителе). оценка C -1 может быть не очень точной, поэтому авторы предлагают считать running average напрямую из данных. и так же считать running average средних углов между фичами и центрами классов. называют такой адаптивый вариант Dynamic AdaCos (см. картинку ниже). Видно что в течении обучения, S уменьшается, адаптивно усложняя задачу для сетки. Кмк чисто win, нет гиперпараметров да еще и адаптивно всё подстраиваем.
image
image

Кода понятное дело нет :(

A Discriminative Feature Learning Approach for Deep Face Recognition (aka Center Loss) (2016)
Статья старая, поэтому всё дело происходит в euclidian space, предлагают считать центры для классов и добовляют дополнительный член, который штрафует за отклонение от этих центров. штраф пропорционален MSE. ставят вес для center loss = 0.01, цифру подбирают эспирически, но она хорошо работает на разных задачах.

A Comprehensive Study on Center Loss for Deep Face Recognition (2017)
Лишь мельком пробежался по статье, самая главная идея - использовать generalized center loss, который не штрафуе за отклонение меньше какого-то порога. идея - не штрафовать когда результат уже и так хорош. добавляют параметр P и не штрафуют за отклонение меньше P. Показывают на графиках, что хотя среднее с добавлением P растёт, 99% перцентиль падает, что интуитивно кажется лучше, чем стягивание всего в единый центр
image

Мои мысли: у себя в экспериментах я использовал eucl вместо MSE, возможно оно работает хуже потому что стягивает близкие точки так же сильно как дальние, а хочется стягивать дальние сильнее. Идея Center Loss легко обобщается на angular координаты.

LinCos-Softmax: Learning Angle-Discriminative Face Representations With Linearity-Enhanced Cosine Logits
Очередная попытка улучшить a-softmax. изучают два варианта. Cosine Softmax (с степени экспоненты cos) и Linear Softmax (в степени экспоненты сам угол, этот вариант выше я называл Arc Cos). говорят что у хорошая производная dL / d cos θ, которая линейно убывает при приближение угла к 0, но плохая производная dL / d θ, которая убывает слишком сильно при приближении к нулю. У второго варианта хорошая производная dL / d θ (очень похожая на dL / d cos θ для первого варианта), но плохая dL / d cos θ которая взрывается при приближении к нулю и этим усложняет тренировку

image

поэтому авторы предлагают Linear-Cosine Logit, т.е. аппроксимацию arccos через первые члены ряда Тейлора. ограничивают приближение K=2 или 4 членами, лучшие результаты при K=2. если совсем коротко - пихают в степень экспоненты cos θ + ( cos θ ) ^ 3 / 6.

image

Говорят что s нужно выбирать автоматичеки так, чтобы макс. значение было 0.999, но при этом s должно еще зависеть от значения функции в экспоненте в нуле. т.е. если для Cosine logit оптимум это X, то для Linear-Cosine (K=2) оптимум это X * (6 / 7). Конкретно эта идея полностью из adacos, разве что отсейлили на значение в нуле.

image

Очень много качественных экспериментов, везде их Lin-Cos лучше чем только Linear или только Cosine logits. Причём Linear почти всегда хуже всех, что кмк очень странно. есть вот такой график рапределения средних углов, видно что Linear гораздо лучше сжимает классы, не понятно почему при этом метрики получаются хуже

image

Потом еще добавляют margin (angular margin как в cos face). говорят что тут сложновато автоматически выбрать значение s и это они оставляют следующим поколениям, а сами ставят его == 20. добавление margin очень сильно докидывает. (если тут вспомнить Loss Function Search for Face Recognition, то авторы выбрали самый лучший margin с точки зрения cosine лосса, но с точки зрения их лосса, он всё равно получается не оптимальным, потому что формулы изменятся и степень модулирования будет зависит от cos.

В целом мой вывод такой - статья хорошая, но не понятно что именно им докидывает по сравнению с cosine logit, если это не такое сильное затухание стягивающей силы, то может нужно явно center лосс докинуть?
до сих пор не понятно почему linear даёт меньший угол, но хуже работает по метрикам, вот это очень важно понять!
ещё возможно что вместо margin нужно явно модулировать вероятность как в Loss ... Search ...

TO READ:
ArcGrad (говорят что исправляют ошибки AdaCos так что можно сразу её читать) - https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9207251

Sub-center ArcFace: Boosting Face Recognition by Large-scale Noisy Web Faces

Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere (очень свежая, nov 2020)

Мне сейчас (10.11.20) не понятно, так ли тогда нужен этот дополнительный член в лоссе? может Angular Margin Arc Softmax будет работать и так? и если мы всё таки добавлять margin то, как выбирать его значение?

11.11.20 пришла мысль
В моей изначалной реализации Center loss на углах я минимизировал MAE + Arc Softmax и это работало плохо. возможно это связано с профилем градиентов. A-Soft (и Cetner + MSE) сильнее стягивает далекие точки и хуже близкие. Arc-Softmax (и Center + MAE) одинаково стягивает как далёкие так и близкие точки <= я использовал эту комбинацию и понятно почему она докинула, потому что оба лосса оптимизируют одно и то же. а вот у авторов A-Soft + Center (MSE) хорошо работало именно из-за оптимизации разных вещей.

19.11.20
читаю Loss Function Search for Face Recognition где говорится что все margin-based лоссы по сути модулируют вероятность (уменьшают её), таким образом заставляя сильнее стягивать точки.

судя по их экспериментам AM-Softmax (который CosFace == cos (θ) - m) работает лучше чем ArcFace. помню кто-то мне тоже говорил что у него AM-Softmax работал лучше чем ArcFace
кажется что это случается потому, что хотя ArcFace даёт хороший margin с точки зрения геометрии на сфере, но потом ведь всё равно применятся cos и поэтому с точки зрения лосса штраф для разных углов (т.е. для разных классов) получается неодинаковый! поэтому AM-Softmax лучше. Кажется, что если пытаться оптимизировать ArcCos где в степени экспоненты стоит сам угол, то добавление явного margin к этому углу будет работать хорошо.

идеи выше можно завалидировать с помощью вот такого эксперимента:
ArcCos лосс с каким-то margin должен работать идентично ArcCos без margin но с правильной модуляцией вероятностей (если параметр A из статьи поставить равным 1 − e ^ (sm)

05.04.21
скопирую сюда обзор на статью, который писал еще в ноябре

Softmax Dissection: Towards Understanding Intra- and Inter-classObjective for Embedding Learning

там они делают вывод, что главная проблема обычно Softmax что он слишком рано перестаёт оптимизировать intra-class distance, это видно из figure 2 (a). допустим у нас фиксированные log M (сумма всех экспонент кроме theta_true) и s, тогда исходя из формы лосса, видно, что сетка будет хорошо оптимизировать intra-class только до тех пор, пока он меньше d = log M / s, а после этой границы будет уже очень слабо его подтягивать дальше. тут важно, что этот порог d идёт на значения логитов. теперь есть три варианта.

  1. мы можем выбрать какой-нибудь достаточный для нас d = 0.9 (т.е. хотим чтобы intra-class simularity была ~0.9) и сказать что и так збс. но это еще один гиперпараметр и не понятно как его выбирать, плюс он зависит от сложности задачи.
  2. можно выбрать d = median(cos (theta_true)) из соображений что раз у нас есть примеры для которых intra-class меньше медианы, можно и другие примеры начать так же хорошо классифицировать. адаптивность этого порога приводит к тому, что все точки будут подтягиваться одновременно, в случае же когда d фиксировано, сетка может пытаться оптимизировать сначала легкие примеры, а уже потом сложные, а тут получается что сложные будут классифицировать не сильно хуже чем хорошие.
  3. можно считать d = cos(median (theta_true)) кажется что разница с 2) небольшая, но медиана углов нелинейно мапится относительно самих значений косинусов и поэтому кажется что в этом меньше смысла. потому что тогда может получиться либо a) что бОльшая часть примеров уже и так будет за границей (больше границы), тогда оптимизируется меньше половины всех примеров что плохо. b) либо бОльшая часть примеров будет меньше границы (этот случай на самом деле хороший, но не факт что будет именно он).

пока писал пункт выше, понял что ответ на вопрос что будет работать лучше 2) или 3) зависит от взаимного расположения медиан косинуса и косинуса от медианного угла, тут надо еще думать, может быть авторы AdaCos случайно отгадали и их вариант будет лучше

upd. чёт я дурак, это одна и та же величина. а раз так, то нет смысла считать медиану углов, когда проще посчитать медиану косинусов

после того как мы определились с желаемым d, можно теперь его зафиксировтаь, и переписать формулу выше в форме: s = log M / d с помощью которой авторы AdaCos и предлагают выбирать оптимальный s. прикольно что они пришли к такой формуле из совершенно других соображений, но они совпали.

@bonlime
Copy link
Owner Author

bonlime commented Aug 31, 2020

Большое сравнение моделей по скорости от AlexeyAB: AlexeyAB/darknet#4406

мое сравнение моделей (чистый торч + amp)
ResNet50 25.56M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       26.87+-0.05 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 600.43Mb. 2382.00 imgs/sec
TResNet50 31.39M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       28.05+-0.22 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 466.06Mb. 2281.99 imgs/sec
DarkNet53 timm 41.61M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       28.69+-0.13 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 1103.11Mb. 2230.61 imgs/sec
CSPDarkNet53 timm 27.64M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       30.38+-0.17 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 1698.13Mb. 2106.39 imgs/sec
CSPResNet50 timm 21.62M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       21.79+-0.07 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 1119.60Mb. 2936.60 imgs/sec
CSPResNet50d timm 21.64M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       22.93+-0.01 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 1202.36Mb. 2791.09 imgs/sec
CSPResNeXt50 timm 20.57M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       34.59+-0.04 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 1428.08Mb. 1850.07 imgs/sec
Simp_R34 16.79M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       14.99+-0.06 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 462.44Mb. 4269.24 imgs/sec
Simp_preR34 16.79M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       15.04+-0.00 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 527.80Mb. 4256.30 imgs/sec
Simp_preR34 s2d 16.79M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       15.58+-0.01 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 604.79Mb. 4108.97 imgs/sec
То же самое, но для обучения:
Initialized models
R50 25.56M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       28.08+-0.03 msecs Forward. 112.35+-1.66 msecs Backward. Max memory: 3092.56Mb. 455.74 imgs/sec
TR50 31.39M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       28.75+-0.12 msecs Forward. 107.93+-1.24 msecs Backward. Max memory: 2731.11Mb. 468.25 imgs/sec
D53 timm 41.61M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       31.87+-0.03 msecs Forward. 115.14+-3.23 msecs Backward. Max memory: 3925.59Mb. 435.36 imgs/sec
CSPD53 timm 27.64M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       34.75+-0.06 msecs Forward. 125.67+-3.52 msecs Backward. Max memory: 5101.53Mb. 398.96 imgs/sec
CSPR50 timm 21.62M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       23.16+-0.02 msecs Forward. 100.21+-0.65 msecs Backward. Max memory: 3921.26Mb. 518.80 imgs/sec
CSPR50d timm 21.64M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       25.15+-0.02 msecs Forward. 106.86+-1.56 msecs Backward. Max memory: 4284.92Mb. 484.81 imgs/sec
CSPX50 timm 20.57M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       36.16+-0.02 msecs Forward. 143.51+-0.95 msecs Backward. Max memory: 5060.10Mb. 356.21 imgs/sec

выбор между ResNet family и DarkNet исключительно религиозный. Обе одинаковые по скорости, хотя D53 слегка жирнее. CSP вариант уменьшает количество параметров, но остаётся таким же по скорости.

Наверно из блоков нужно остановиться на ResNet потому что:

  • он больше изучен
  • на него известно больше улучшений
  • быстрые conv1x1 увеличивают глубину, не добавляя слишком много вычислений.

upd. 02.09.2020
месяц спустя. выбор между 3х слойным и 2х слойным не такой очевидный, поэтому возвращаюсь к варианту с BasicBlock. такие сетки буду называть кодовым словом simpl dark, хотя это вообще не darknet

Simple Dark
Simp_R34 s2d 16.79M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       15.13+-0.22 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 591.02Mb. 4229.20 imgs/sec
CSP simpl R34 0.75 no 1st csp no x2 12.45M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       13.44+-0.01 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 640.27Mb. 4761.06 imgs/sec
Simp Dark 24.21M params ( conv3x3 --> conv3x3 вместо conv1x1 --> conv3x3 --> conv1x1 в simp R34)
Mean of 5 runs 10 iters each BS=64, SZ=224:
       16.34+-0.02 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 733.61Mb. 3917.36 imgs/sec
CSP Simp Dark 0.75 no 1st csp no x2 17.11M params
Mean of 5 runs 10 iters each BS=64, SZ=224:
       14.16+-0.01 msecs Forward. 0.00+-0.00 msecs Backward. Max memory: 799.88Mb. 4520.10 imgs/sec

upd. 02.09.2020 вечером
кажется, что все таки есть что-то фундаментальное, почему resnet34 плохо работает и это никак особо не пофиксить. не могу понять, в глубине ли дело или в чём-то другом

буду хранить тут новые эксперименты, потому что первое сообщение уже слишком раздулось.

кажется, понял почему некоторые сетки плохо работают на imagenet, но хорошо работают в других задачах - дело в количестве классов и количестве фильтров. у того же resnet34 (и darknet53) в конце 512 фильтров, а у resnet50 - 2048. возможно именно поэтому качество второго лучше. эту гипотезу легко проверить уменьшив количество классов в imagenet например до 100.

Spoiler Template
To be added

exp20
baseline resnet 50 + 100 classes
Как бы мне не хотелось верить, что resnet34 работает хорошо, но нужно лишь еще чуть чуть подпилить, это не так и resnet50 всегда заметно лучше. ценой в 2 раза меньшей скорости правда, но anyway. получается есть что-то фундаментально разное в этих архитектурах. пока мне кажется, что дело в количестве слоев и активаций, их в R50 в полтора раза больше.

baseline resnet 50 + 100 classes
Epoch 85/90. training: 5006it [29:38,  2.81it/s, Acc@1=82.220, Acc@5=94.301, Loss=1.6351]
Epoch 85/90. validating: 201it [00:37,  5.40it/s, Acc@1=78.780, Acc@5=93.850, Loss=1.7575]
[09-02 16:59:12] - Train loss: 1.6351 | Acc@1: 82.2197 | Acc@5: 94.3014
[09-02 16:59:12] - Val   loss: 1.7575 | Acc@1: 78.7800 | Acc@5: 93.8500
[09-02 16:59:12] - Epoch 85: best loss improved from 1.7623 to 1.7575
[09-02 16:59:12] - Epoch 86 | lr 2.52e-03
Epoch 86/90. training: 5006it [29:30,  2.83it/s, Acc@1=82.519, Acc@5=94.386, Loss=1.6259]
Epoch 86/90. validating: 201it [00:38,  5.17it/s, Acc@1=78.898, Acc@5=93.918, Loss=1.7551]
[09-02 17:29:21] - Train loss: 1.6259 | Acc@1: 82.5188 | Acc@5: 94.3857
[09-02 17:29:21] - Val   loss: 1.7551 | Acc@1: 78.8980 | Acc@5: 93.9180
[09-02 17:29:21] - Epoch 86: best loss improved from 1.7575 to 1.7551
[09-02 17:29:21] - Epoch 87 | lr 1.65e-03
Epoch 87/90. training: 5006it [29:30,  2.83it/s, Acc@1=82.791, Acc@5=94.489, Loss=1.6173]
Epoch 87/90. validating: 201it [00:37,  5.39it/s, Acc@1=78.952, Acc@5=93.892, Loss=1.7530]
[09-02 17:59:29] - Train loss: 1.6173 | Acc@1: 82.7910 | Acc@5: 94.4892
[09-02 17:59:29] - Val   loss: 1.7530 | Acc@1: 78.9520 | Acc@5: 93.8920
[09-02 17:59:29] - Epoch 87: best loss improved from 1.7551 to 1.7530
[09-02 17:59:29] - Epoch 88 | lr 9.68e-04
Epoch 88/90. training: 5006it [29:28,  2.83it/s, Acc@1=83.003, Acc@5=94.589, Loss=1.6103]
Epoch 88/90. validating: 201it [00:37,  5.39it/s, Acc@1=78.918, Acc@5=93.926, Loss=1.7508]
[09-02 18:29:35] - Train loss: 1.6103 | Acc@1: 83.0032 | Acc@5: 94.5894
[09-02 18:29:35] - Val   loss: 1.7508 | Acc@1: 78.9180 | Acc@5: 93.9260
[09-02 18:29:35] - Epoch 88: best loss improved from 1.7530 to 1.7508
[09-02 18:29:35] - Epoch 89 | lr 4.64e-04
Epoch 89/90. training: 5006it [29:28,  2.83it/s, Acc@1=83.063, Acc@5=94.566, Loss=1.6088]
Epoch 89/90. validating: 201it [00:38,  5.17it/s, Acc@1=79.054, Acc@5=93.984, Loss=1.7498]
[09-02 18:59:42] - Train loss: 1.6088 | Acc@1: 83.0626 | Acc@5: 94.5657
[09-02 18:59:42] - Val   loss: 1.7498 | Acc@1: 79.0540 | Acc@5: 93.9840
[09-02 18:59:42] - Epoch 89: best loss improved from 1.7508 to 1.7498
[09-02 18:59:43] - Epoch 90 | lr 1.43e-04
Epoch 90/90. training: 5006it [29:30,  2.83it/s, Acc@1=83.218, Acc@5=94.653, Loss=1.6043]
Epoch 90/90. validating: 201it [00:39,  5.03it/s, Acc@1=78.942, Acc@5=93.990, Loss=1.7503]
[09-02 19:29:53] - Train loss: 1.6043 | Acc@1: 83.2180 | Acc@5: 94.6528
[09-02 19:29:53] - Val   loss: 1.7503 | Acc@1: 78.9420 | Acc@5: 93.9900
[09-02 19:29:53] - Acc@1 78.942 Acc@5 93.990
[09-02 19:29:53] - Total time: 45h 25.7m

exp21
baseline resnet 34 + 100 classes
нужно учитывать, что здесь нет expand conv в конце, т.е. голова выглядит как 512 --> 1000. что ближе к exp23 чем exp22

baseline resnet34 + 100 classes
Epoch 85/90. training: 5006it [19:37,  4.25it/s, Acc@1=76.951, Acc@5=91.974, Loss=1.8107]
Epoch 85/90. validating: 201it [00:27,  7.20it/s, Acc@1=75.984, Acc@5=92.594, Loss=1.8415]
[09-02 02:32:20] - Train loss: 1.8107 | Acc@1: 76.9514 | Acc@5: 91.9744
[09-02 02:32:20] - Val   loss: 1.8415 | Acc@1: 75.9840 | Acc@5: 92.5940
[09-02 02:32:20] - Epoch 85: best loss improved from 1.8471 to 1.8415
[09-02 02:32:21] - Epoch 86 | lr 2.52e-03
Epoch 86/90. training: 5006it [19:37,  4.25it/s, Acc@1=77.215, Acc@5=92.042, Loss=1.8027]
Epoch 86/90. validating: 201it [00:28,  7.18it/s, Acc@1=76.202, Acc@5=92.700, Loss=1.8361]
[09-02 02:52:26] - Train loss: 1.8027 | Acc@1: 77.2149 | Acc@5: 92.0416
[09-02 02:52:26] - Val   loss: 1.8361 | Acc@1: 76.2020 | Acc@5: 92.7000
[09-02 02:52:26] - Epoch 86: best loss improved from 1.8415 to 1.8361
[09-02 02:52:27] - Epoch 87 | lr 1.65e-03
Epoch 87/90. training: 5006it [19:37,  4.25it/s, Acc@1=77.453, Acc@5=92.139, Loss=1.7955]
Epoch 87/90. validating: 201it [00:27,  7.19it/s, Acc@1=76.216, Acc@5=92.706, Loss=1.8342]
[09-02 03:12:32] - Train loss: 1.7955 | Acc@1: 77.4529 | Acc@5: 92.1394
[09-02 03:12:32] - Val   loss: 1.8342 | Acc@1: 76.2160 | Acc@5: 92.7060
[09-02 03:12:32] - Epoch 87: best loss improved from 1.8361 to 1.8342
[09-02 03:12:32] - Epoch 88 | lr 9.68e-04
Epoch 88/90. training: 5006it [19:37,  4.25it/s, Acc@1=77.629, Acc@5=92.260, Loss=1.7883]
Epoch 88/90. validating: 201it [00:27,  7.19it/s, Acc@1=76.326, Acc@5=92.714, Loss=1.8317]
[09-02 03:32:38] - Train loss: 1.7883 | Acc@1: 77.6289 | Acc@5: 92.2602
[09-02 03:32:38] - Val   loss: 1.8317 | Acc@1: 76.3260 | Acc@5: 92.7140
[09-02 03:32:38] - Epoch 88: best loss improved from 1.8342 to 1.8317
[09-02 03:32:38] - Epoch 89 | lr 4.64e-04
Epoch 89/90. training: 5006it [19:37,  4.25it/s, Acc@1=77.692, Acc@5=92.267, Loss=1.7866]
Epoch 89/90. validating: 201it [00:27,  7.19it/s, Acc@1=76.302, Acc@5=92.736, Loss=1.8303]
[09-02 03:52:43] - Train loss: 1.7866 | Acc@1: 77.6921 | Acc@5: 92.2670
[09-02 03:52:43] - Val   loss: 1.8303 | Acc@1: 76.3020 | Acc@5: 92.7360
[09-02 03:52:43] - Epoch 89: best loss improved from 1.8317 to 1.8303
[09-02 03:52:44] - Epoch 90 | lr 1.43e-04
Epoch 90/90. training: 5006it [19:38,  4.25it/s, Acc@1=77.861, Acc@5=92.318, Loss=1.7820]
Epoch 90/90. validating: 201it [00:28,  7.18it/s, Acc@1=76.308, Acc@5=92.702, Loss=1.8309]
[09-02 04:12:50] - Train loss: 1.7820 | Acc@1: 77.8614 | Acc@5: 92.3179
[09-02 04:12:50] - Val   loss: 1.8309 | Acc@1: 76.3080 | Acc@5: 92.7020
[09-02 04:12:50] - Acc@1 76.308 Acc@5 92.702
[09-02 04:12:50] - Total time: 30h 9.7m

exp22
такой же как exp 12 + 100 классов. этот эксперимент был нужен чтобы понять насколько текущая модель лучше чем например в эксперименте 21. видно что лучше

R34-50 s2d 100 cls
name : exp22.simpl_R34_noact_s2d                                                                                                                     
arch : simpl_resnet34                                                                                                                                
model_params:                                                                                                                                        
stem_type: s2d                                                                                                                                     
weight_decay : 3e-5                                                                                                                                  
smooth: true                                                                                                                                         
                                                                                                                                                   
ctwist: true                                                                                                                                         
# very short period of ~3 epoch for ema: 0.9993 ** (2500 * 3) ~= 5e-3                                                                                
ema_decay: 0.9993                                                                                                                                    
                                                                                                                                                   
# lr should be BS/256 * 0.1                                                                                                                          
phases : [                                                                                                                                           
  {"ep": 0, "sz": 224, "bs": 256},                                                                                                                 
  {"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},                                                                                                      
  {"ep": [8, 90], "lr": [0.2, 0], "mom": 0.9, "mode": "cos"},                                                                                      
]                                                                                                                                                    
                                                                                                                                                   
classes_divisor: 10 # train on 100 classes instead  

Epoch 85/90. training: 2504it [10:55,  3.82it/s, Acc@1=77.444, Acc@5=92.422, Loss=1.8102]
Epoch 85/90. validating: 101it [00:20,  5.03it/s, Acc@1=83.800, Acc@5=96.176, Loss=1.5679]
[09-01 11:38:30] - Train loss: 1.8087 | Acc@1: 77.4890 | Acc@5: 92.4373
[09-01 11:38:30] - Val   loss: 1.8116 | Acc@1: 77.2820 | Acc@5: 93.1820
[09-01 11:38:30] - Epoch 85: best loss improved from 1.8117 to 1.8116
[09-01 11:38:30] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [10:53,  3.83it/s, Acc@1=77.734, Acc@5=92.568, Loss=1.8007]
Epoch 86/90. validating: 101it [00:18,  5.33it/s, Acc@1=70.712, Acc@5=90.208, Loss=2.0550]
[09-01 11:49:43] - Train loss: 1.8019 | Acc@1: 77.7018 | Acc@5: 92.5508
[09-01 11:49:43] - Val   loss: 1.8115 | Acc@1: 77.2600 | Acc@5: 93.2220
[09-01 11:49:43] - Epoch 86: best loss improved from 1.8116 to 1.8115
[09-01 11:49:43] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [10:51,  3.84it/s, Acc@1=77.685, Acc@5=92.508, Loss=1.8014]
Epoch 87/90. validating: 101it [00:19,  5.26it/s, Acc@1=83.856, Acc@5=96.260, Loss=1.5672]
[09-01 12:00:54] - Train loss: 1.8008 | Acc@1: 77.6993 | Acc@5: 92.5281
[09-01 12:00:54] - Val   loss: 1.8109 | Acc@1: 77.2560 | Acc@5: 93.2140
[09-01 12:00:54] - Epoch 87: best loss improved from 1.8115 to 1.8109
[09-01 12:00:54] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [10:50,  3.85it/s, Acc@1=77.809, Acc@5=92.580, Loss=1.7971]
Epoch 88/90. validating: 101it [00:19,  5.23it/s, Acc@1=70.720, Acc@5=90.228, Loss=2.0542]
[09-01 12:12:04] - Train loss: 1.7977 | Acc@1: 77.7817 | Acc@5: 92.5610
[09-01 12:12:04] - Val   loss: 1.8107 | Acc@1: 77.3320 | Acc@5: 93.2520
[09-01 12:12:04] - Epoch 88: best loss improved from 1.8109 to 1.8107
[09-01 12:12:04] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [10:56,  3.81it/s, Acc@1=77.936, Acc@5=92.606, Loss=1.7941]
Epoch 89/90. validating: 101it [00:19,  5.21it/s, Acc@1=83.888, Acc@5=96.256, Loss=1.5667]
[09-01 12:23:20] - Train loss: 1.7934 | Acc@1: 77.9517 | Acc@5: 92.6183
[09-01 12:23:20] - Val   loss: 1.8106 | Acc@1: 77.2940 | Acc@5: 93.2340
[09-01 12:23:20] - Epoch 89: best loss improved from 1.8107 to 1.8106
[09-01 12:23:20] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [11:01,  3.78it/s, Acc@1=77.924, Acc@5=92.670, Loss=1.7922]
Epoch 90/90. validating: 101it [00:19,  5.17it/s, Acc@1=70.700, Acc@5=90.192, Loss=2.0543]
[09-01 12:34:42] - Train loss: 1.7924 | Acc@1: 77.9595 | Acc@5: 92.6587
[09-01 12:34:42] - Val   loss: 1.8105 | Acc@1: 77.2980 | Acc@5: 93.2300
[09-01 12:34:42] - Epoch 90: best loss improved from 1.8106 to 1.8105
[09-01 12:34:43] - Acc@1 77.298 Acc@5 93.230
[09-01 12:34:43] - Total time: 17h 7.1m

exp23
такой же как, но без последнего expand 512 --> 2048 --> 1000. Вместо этого тут 512 --> 1000. видно что работает сильно хуже, значит этот expand все таки важен. не понятно только нужен ли он один или может их можно много воткнуть больше и качество будет лучше?

R34-50 100 cls no expand
name : exp23.simpl_R34_noact_s2d                                                                                                                     
arch : simpl_resnet34                                                                                                                                
model_params:                                                                                                                                        
stem_type: s2d                                                                                                                                     
expand_before_head: False                                                                                                                          
weight_decay : 3e-5                                                                                                                                  
smooth: true                                                                                                                                         
                                                                                                                                                   
ctwist: true                                                                                                                                         
# very short period of ~3 epoch for ema: 0.9993 ** (2500 * 3) ~= 5e-3                                                                                
ema_decay: 0.9993                                                                                                                                    
                                                                                                                                                   
# lr should be BS/256 * 0.1                                                                                                                          
phases : [                                                                                                                                           
  {"ep": 0, "sz": 224, "bs": 256},                                                                                                                 
  {"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},                                                                                                      
  {"ep": [8, 90], "lr": [0.2, 0], "mom": 0.9, "mode": "cos"},                                                                                      
]                                                                                                                                                    
                                                                                                                                                   
classes_divisor: 10 # train on 100 classes instead

Epoch 85/90. training: 2504it [10:55,  3.82it/s, Acc@1=75.469, Acc@5=91.296, Loss=1.8869]
Epoch 85/90. validating: 101it [00:18,  5.32it/s, Acc@1=83.300, Acc@5=96.152, Loss=1.6025]
[09-01 11:40:44] - Train loss: 1.8859 | Acc@1: 75.4886 | Acc@5: 91.3083
[09-01 11:40:44] - Val   loss: 1.8602 | Acc@1: 76.5600 | Acc@5: 92.7700
[09-01 11:40:44] - Epoch 85: best loss improved from 1.8602 to 1.8602
[09-01 11:40:44] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [10:53,  3.83it/s, Acc@1=75.762, Acc@5=91.441, Loss=1.8778]
Epoch 86/90. validating: 101it [00:19,  5.15it/s, Acc@1=69.840, Acc@5=89.416, Loss=2.1157]
[09-01 11:51:58] - Train loss: 1.8786 | Acc@1: 75.7311 | Acc@5: 91.4369
[09-01 11:51:58] - Val   loss: 1.8589 | Acc@1: 76.5920 | Acc@5: 92.7960
[09-01 11:51:58] - Epoch 86: best loss improved from 1.8602 to 1.8589
[09-01 11:51:58] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [10:50,  3.85it/s, Acc@1=75.697, Acc@5=91.462, Loss=1.8776]
Epoch 87/90. validating: 101it [00:19,  5.26it/s, Acc@1=83.312, Acc@5=96.208, Loss=1.6019]
[09-01 12:03:08] - Train loss: 1.8769 | Acc@1: 75.7480 | Acc@5: 91.4411
[09-01 12:03:08] - Val   loss: 1.8582 | Acc@1: 76.5760 | Acc@5: 92.8340
[09-01 12:03:08] - Epoch 87: best loss improved from 1.8589 to 1.8582
[09-01 12:03:08] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [10:54,  3.83it/s, Acc@1=75.868, Acc@5=91.493, Loss=1.8737]
Epoch 88/90. validating: 101it [00:18,  5.34it/s, Acc@1=69.880, Acc@5=89.480, Loss=2.1146]
[09-01 12:14:22] - Train loss: 1.8743 | Acc@1: 75.8526 | Acc@5: 91.4700
[09-01 12:14:22] - Val   loss: 1.8582 | Acc@1: 76.6180 | Acc@5: 92.8460
[09-01 12:14:22] - Epoch 88: best loss improved from 1.8582 to 1.8582
[09-01 12:14:22] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [10:56,  3.81it/s, Acc@1=75.967, Acc@5=91.574, Loss=1.8694]
Epoch 89/90. validating: 101it [00:19,  5.23it/s, Acc@1=83.352, Acc@5=96.196, Loss=1.6013]
[09-01 12:25:38] - Train loss: 1.8691 | Acc@1: 75.9689 | Acc@5: 91.5816
[09-01 12:25:38] - Val   loss: 1.8580 | Acc@1: 76.5840 | Acc@5: 92.8160
[09-01 12:25:38] - Epoch 89: best loss improved from 1.8582 to 1.8580
[09-01 12:25:38] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [11:05,  3.76it/s, Acc@1=75.987, Acc@5=91.548, Loss=1.8684]
Epoch 90/90. validating: 101it [00:18,  5.60it/s, Acc@1=69.792, Acc@5=89.424, Loss=2.1146]
[09-01 12:37:02] - Train loss: 1.8684 | Acc@1: 75.9944 | Acc@5: 91.5674
[09-01 12:37:02] - Val   loss: 1.8579 | Acc@1: 76.5400 | Acc@5: 92.8040
[09-01 12:37:02] - Epoch 90: best loss improved from 1.8580 to 1.8579
[09-01 12:37:03] - Acc@1 76.540 Acc@5 92.804
[09-01 12:37:03] - Total time: 17h 5.8m

exp24
mobilenet v3 head. идея - делать сначала GAP а замет expand свертки в конце. работает с тем же качеством что и exp22, но быстрее! значит Mobilinetv3 head - хорошая идея

mobilenet v3 head
arch : simpl_resnet34                                                                                                                                
model_params:                                                                                                                                        
stem_type: s2d                                                                                                                                     
mobilenetv3_head: true                                                                                                                             
weight_decay : 3e-5                                                                                                                                  
smooth: true                                                                                                                                         
                                                                                                                                                   
ctwist: true                                                                                                                                         
# very short period of ~3 epoch for ema: 0.9993 ** (2500 * 3) ~= 5e-3                                                                                
ema_decay: 0.9993                                                                                                                                    
                                                                                                                                                   
# lr should be BS/256 * 0.1                                                                                                                          
phases : [                                                                                                                                           
  {"ep": 0, "sz": 224, "bs": 256},                                                                                                                 
  {"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},                                                                                                      
  {"ep": [8, 90], "lr": [0.2, 0], "mom": 0.9, "mode": "cos"},                                                                                      
]                                                                                                                                                    
                                                                                                                                                   
classes_divisor: 10 # train on 100 classes instead 

Epoch 85/90. training: 2504it [11:17,  3.70it/s, Acc@1=78.951, Acc@5=93.068, Loss=1.7612]                                                             
Epoch 85/90. validating: 101it [00:18,  5.42it/s, Acc@1=83.968, Acc@5=96.440, Loss=1.5676]                                                            
[09-02 22:56:35] - Train loss: 1.7595 | Acc@1: 79.0180 | Acc@5: 93.0884                                                                               
[09-02 22:56:35] - Val   loss: 1.8104 | Acc@1: 77.6460 | Acc@5: 93.3020                                                                               
[09-02 22:56:35] - Epoch 86 | lr 2.21e-03                                                                                                             
Epoch 86/90. training: 2504it [11:15,  3.71it/s, Acc@1=79.243, Acc@5=93.187, Loss=1.7525]                                                             
Epoch 86/90. validating: 101it [00:18,  5.40it/s, Acc@1=71.228, Acc@5=90.200, Loss=2.0537]                                                            
[09-02 23:08:09] - Train loss: 1.7533 | Acc@1: 79.2131 | Acc@5: 93.1889                                                                               
[09-02 23:08:09] - Val   loss: 1.8102 | Acc@1: 77.5600 | Acc@5: 93.3320                                                                               
[09-02 23:08:09] - Epoch 87 | lr 1.48e-03                                                                                                             
Epoch 87/90. training: 2504it [11:12,  3.72it/s, Acc@1=79.220, Acc@5=93.205, Loss=1.7516]                                                             
Epoch 87/90. validating: 101it [00:18,  5.36it/s, Acc@1=84.056, Acc@5=96.452, Loss=1.5657]                                                            
[09-02 23:19:40] - Train loss: 1.7512 | Acc@1: 79.2523 | Acc@5: 93.2087                                                                               
[09-02 23:19:40] - Val   loss: 1.8099 | Acc@1: 77.6620 | Acc@5: 93.3220                                                                               
[09-02 23:19:40] - Epoch 87: best loss improved from 1.8102 to 1.8099                                                                                 
[09-02 23:19:41] - Epoch 88 | lr 8.98e-04                                                                                                             
Epoch 88/90. training: 2504it [11:11,  3.73it/s, Acc@1=79.369, Acc@5=93.217, Loss=1.7488]                                                             
Epoch 88/90. validating: 101it [00:18,  5.47it/s, Acc@1=71.236, Acc@5=90.276, Loss=2.0535]                                                            
[09-02 23:31:12] - Train loss: 1.7494 | Acc@1: 79.3187 | Acc@5: 93.1925                                                                               
[09-02 23:31:12] - Val   loss: 1.8095 | Acc@1: 77.6400 | Acc@5: 93.3720                                                                               
[09-02 23:31:12] - Epoch 88: best loss improved from 1.8099 to 1.8095                                                                                 
[09-02 23:31:12] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [11:13,  3.72it/s, Acc@1=79.483, Acc@5=93.272, Loss=1.7448]
Epoch 89/90. validating: 101it [00:19,  5.25it/s, Acc@1=84.032, Acc@5=96.444, Loss=1.5654]
[09-02 23:42:45] - Train loss: 1.7446 | Acc@1: 79.4811 | Acc@5: 93.2802
[09-02 23:42:45] - Val   loss: 1.8093 | Acc@1: 77.6280 | Acc@5: 93.3720
[09-02 23:42:45] - Epoch 89: best loss improved from 1.8095 to 1.8093
[09-02 23:42:45] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [11:13,  3.72it/s, Acc@1=79.506, Acc@5=93.320, Loss=1.7430]
Epoch 90/90. validating: 101it [00:18,  5.44it/s, Acc@1=71.200, Acc@5=90.316, Loss=2.0531]
[09-02 23:54:18] - Train loss: 1.7434 | Acc@1: 79.5026 | Acc@5: 93.3095
[09-02 23:54:18] - Val   loss: 1.8093 | Acc@1: 77.6260 | Acc@5: 93.3860
[09-02 23:54:18] - Acc@1 77.626 Acc@5 93.386
[09-02 23:54:18] - Total time: 17h 14.5m

exp25
во всех экспериментах выше в R34-50 сетке базовый блок был SimpleBottleneck. но тут возникает вопрос, зачем нам conv1x1 в Bottleneck, если можно воткнуть 2 x conv3x3 (SimpleBasicBlock). по скорости работает как R34, но почему-то гораздо хуже обучился :( может ли быть дело в том, что R34 училась на одной карте и там было больше update steps? возможно, но сейчас нет времени проверять, тем более результаты слишком грустные, чтобы списывать на distributed

Darknet like
name : exp25.simpl_Dark                                                                                                                              
arch : simpl_dark                                                                                                                                    
model_params:                                                                                                                                        
stem_type: s2d                                                                                                                                     
weight_decay : 3e-5                                                                                                                                  
smooth: true                                                                                                                                         
                                                                                                                                                   
ctwist: true                                                                                                                                         
# very short period of ~3 epoch for ema: 0.9993 ** (2500 * 3) ~= 5e-3                                                                                
ema_decay: 0.9993                                                                                                                                    
                                                                                                                                                   
# lr should be BS/256 * 0.1                                                                                                                          
phases : [                                                                                                                                           
  {"ep": 0, "sz": 224, "bs": 256},                                                                                                                 
  {"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},                                                                                                      
  {"ep": [8, 90], "lr": [0.2, 0], "mom": 0.9, "mode": "cos"},                                                                                      
]                                                                                                                                                    
                                                                                                                                                   
classes_divisor: 10 # train on 100 classes instead 

Epoch 85/90. training: 2504it [10:20,  4.04it/s, Acc@1=77.023, Acc@5=92.200, Loss=1.8317]                                                             
Epoch 85/90. validating: 101it [00:18,  5.56it/s, Acc@1=82.512, Acc@5=96.024, Loss=1.6131]                                                            
[09-03 02:30:32] - Train loss: 1.8307 | Acc@1: 77.0134 | Acc@5: 92.2222                                                                               
[09-03 02:30:32] - Val   loss: 1.8653 | Acc@1: 75.9040 | Acc@5: 92.5900                                                                               
[09-03 02:30:32] - Epoch 86 | lr 2.21e-03                                                                                                             
Epoch 86/90. training: 2504it [10:12,  4.09it/s, Acc@1=77.273, Acc@5=92.382, Loss=1.8223]                                                             
Epoch 86/90. validating: 101it [00:17,  5.86it/s, Acc@1=69.300, Acc@5=89.140, Loss=2.1171]                                                            
[09-03 02:41:02] - Train loss: 1.8227 | Acc@1: 77.2480 | Acc@5: 92.3784                                                                               
[09-03 02:41:02] - Val   loss: 1.8651 | Acc@1: 75.8720 | Acc@5: 92.6000                                                                               
[09-03 02:41:02] - Epoch 86: best loss improved from 1.8652 to 1.8651                                                                                 
[09-03 02:41:02] - Epoch 87 | lr 1.48e-03                                                                                                             
Epoch 87/90. training: 2504it [10:10,  4.10it/s, Acc@1=77.282, Acc@5=92.357, Loss=1.8218]                                                             
Epoch 87/90. validating: 101it [00:17,  5.73it/s, Acc@1=82.424, Acc@5=96.092, Loss=1.6126]                                                            
[09-03 02:51:30] - Train loss: 1.8210 | Acc@1: 77.3160 | Acc@5: 92.3726                                                                               
[09-03 02:51:30] - Val   loss: 1.8651 | Acc@1: 75.8280 | Acc@5: 92.6300                                                                               
[09-03 02:51:30] - Epoch 87: best loss improved from 1.8651 to 1.8651                                                                                 
[09-03 02:51:30] - Epoch 88 | lr 8.98e-04                                                                                                             
Epoch 88/90. training: 2504it [10:15,  4.07it/s, Acc@1=77.385, Acc@5=92.401, Loss=1.8182]                                                             
Epoch 88/90. validating: 101it [00:17,  5.93it/s, Acc@1=69.184, Acc@5=89.184, Loss=2.1171]
[09-03 03:02:03] - Train loss: 1.8183 | Acc@1: 77.3804 | Acc@5: 92.3980
[09-03 03:02:03] - Val   loss: 1.8650 | Acc@1: 75.8140 | Acc@5: 92.6320
[09-03 03:02:03] - Epoch 88: best loss improved from 1.8651 to 1.8650
[09-03 03:02:03] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [10:12,  4.09it/s, Acc@1=77.512, Acc@5=92.417, Loss=1.8140]
Epoch 89/90. validating: 101it [00:18,  5.56it/s, Acc@1=82.504, Acc@5=96.112, Loss=1.6127]
[09-03 03:12:34] - Train loss: 1.8135 | Acc@1: 77.5135 | Acc@5: 92.4685
[09-03 03:12:34] - Val   loss: 1.8649 | Acc@1: 75.8780 | Acc@5: 92.6380
[09-03 03:12:34] - Epoch 89: best loss improved from 1.8650 to 1.8649
[09-03 03:12:34] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:05,  4.14it/s, Acc@1=77.554, Acc@5=92.461, Loss=1.8133]
Epoch 90/90. validating: 101it [00:17,  5.82it/s, Acc@1=69.308, Acc@5=89.172, Loss=2.1168]
[09-03 03:22:58] - Train loss: 1.8120 | Acc@1: 77.5828 | Acc@5: 92.4940
[09-03 03:22:58] - Val   loss: 1.8648 | Acc@1: 75.8800 | Acc@5: 92.6380
[09-03 03:22:58] - Epoch 90: best loss improved from 1.8649 to 1.8648
[09-03 03:22:59] - Acc@1 75.880 Acc@5 92.638
[09-03 03:22:59] - Total time: 15h 51.3m

??. не понятно почему добавление csp к darknet53 хорошо работает, а к моему resnet34-50 - плохо. дело ли в количестве параметров или в чем-то другом?

@bonlime
Copy link
Owner Author

bonlime commented Sep 2, 2020

вдохновился Neural Architecture Design for GPU-Efficient Networks. не до конца понимаю почему их сетка так хорошо работает, но anyway.

что можно улучшить:

  • убрать residual где stride=2
  • поднять kernel size до 7 для первой свертки со stride=2 или использовать идею из MixNet с использованием разных kernel size на разных частях фильтров
  • заменить bottleneck на DW блок. а в идеале вообще на separable convolution block - так и не смог понять, в какой момент человечество выкинуло и забыло идею про Separable свертки, перейдя полностью на Inverted Bottlenecks с expansion. кажется, что блок из 2x sep convs должен работать не хуже, чем inverted res блок. нужно проверить (!)

нашел еще статью: Rethinking Bottleneck Structure for Efficient Mobile Network Design где задаются теми же вопросами про то, почему вообще inverted residual появился и хорошая ли это вообще идея (спойлер - не очень)

upd 4.09.20
Сидел думал о разнице между InvertedResidual блоке и Separable conv, пытаясь осознать результаты экспериментов. 27-29. Вопрос - использовать ли активацию между DW и PointWise свертками. Xception говорит что активация ухудшает результаы, но с другой стороны статья написана в 2017м и с тех пор все поменялось. Separable Convs в голове EffDet тоже без нормализации и активации между ними, но так сделано потому, что эта голова применяется к разным фичемапам и нормализация там отдельная для каждой мапы, между SepConv. проблема с отсутствием активации между DW и PW свертками - в сети в целом получается очень мало активаций, а поскольку без них сетка это линейный оператор, хочется чтобы их было побольше. если их добавть, то в SepConv2 будет столько же активаций как в Not Linear IR блоке и возможно они сравняются по качеству

Spoiler Template
To be added

exp26 GENet Normal original
Обучил их модель на своём коде. качество сильно хуже, но оно и понятно. Остальное добивается более долгой тренировкой и подбором гипер параметров. Этот эксперимент нужен исключительно для бейзлайна и измерения качества дальнейших модификаций. Сравнивать нужно с exp12. Эта модель заметно лучше. При том в оригинале есть и downsample in bottleneck и not linear bottleneck и stem хуже.

GENet normal original
name : exp26.GENet_normal
arch : GENet_normal

weight_decay : 3e-5
smooth: true

ctwist: true
# very short period of ~3 epoch for ema: 0.9993 ** (2500 * 3) ~= 5e-3
ema_decay: 0.9993

# lr should be BS/256 * 0.1
phases : [
  {"ep": 0, "sz": 224, "bs": 256},
  {"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},
  {"ep": [8, 90], "lr": [0.2, 0], "mom": 0.9, "mode": "cos"},
]

Epoch 85/90. training: 2504it [10:05,  4.13it/s, Acc@1=83.757, Acc@5=94.585, Loss=1.6854]
Epoch 85/90. validating: 101it [00:17,  5.64it/s, Acc@1=79.764, Acc@5=94.776, Loss=1.7579]
[09-04 00:28:52] - Train loss: 1.6845 | Acc@1: 83.8239 | Acc@5: 94.5907
[09-04 00:28:52] - Val   loss: 1.9180 | Acc@1: 75.9800 | Acc@5: 92.6460
[09-04 00:28:52] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [10:04,  4.14it/s, Acc@1=84.058, Acc@5=94.705, Loss=1.6760]
Epoch 86/90. validating: 101it [00:17,  5.77it/s, Acc@1=72.360, Acc@5=90.508, Loss=2.0773]
[09-04 00:39:14] - Train loss: 1.6762 | Acc@1: 84.0284 | Acc@5: 94.7134
[09-04 00:39:14] - Val   loss: 1.9178 | Acc@1: 76.1000 | Acc@5: 92.6400
[09-04 00:39:14] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [10:05,  4.14it/s, Acc@1=84.028, Acc@5=94.697, Loss=1.6757]
Epoch 87/90. validating: 101it [00:17,  5.63it/s, Acc@1=79.804, Acc@5=94.780, Loss=1.7576]
[09-04 00:49:38] - Train loss: 1.6754 | Acc@1: 84.0721 | Acc@5: 94.6995
[09-04 00:49:38] - Val   loss: 1.9176 | Acc@1: 76.0920 | Acc@5: 92.6580
[09-04 00:49:38] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [10:05,  4.14it/s, Acc@1=84.122, Acc@5=94.692, Loss=1.6742]
Epoch 88/90. validating: 101it [00:17,  5.79it/s, Acc@1=72.432, Acc@5=90.544, Loss=2.0776]
[09-04 01:00:01] - Train loss: 1.6735 | Acc@1: 84.1397 | Acc@5: 94.7180
[09-04 01:00:01] - Val   loss: 1.9177 | Acc@1: 76.1060 | Acc@5: 92.6800
[09-04 01:00:01] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [10:05,  4.14it/s, Acc@1=84.274, Acc@5=94.772, Loss=1.6697]
Epoch 89/90. validating: 101it [00:17,  5.62it/s, Acc@1=79.808, Acc@5=94.800, Loss=1.7578]
[09-04 01:10:24] - Train loss: 1.6686 | Acc@1: 84.2801 | Acc@5: 94.7712
[09-04 01:10:24] - Val   loss: 1.9177 | Acc@1: 76.1180 | Acc@5: 92.6900
[09-04 01:10:24] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:05,  4.14it/s, Acc@1=84.318, Acc@5=94.774, Loss=1.6677]
Epoch 90/90. validating: 101it [00:17,  5.77it/s, Acc@1=72.404, Acc@5=90.560, Loss=2.0776]
[09-04 01:20:48] - Train loss: 1.6678 | Acc@1: 84.3046 | Acc@5: 94.7854
[09-04 01:20:48] - Val   loss: 1.9177 | Acc@1: 76.0900 | Acc@5: 92.6880
[09-04 01:20:48] - Acc@1 76.090 Acc@5 92.688
[09-04 01:20:48] - Total time: 18h 24.8m

exp27
GENet normal my - попытка собрать GENet на своём коде. С ходу решил вставить туда много изменений в архитектуру:

  • 4 stages instead of 5. shouldn't really matter
  • no residual in stride=2 blocks
  • space to depth input stem
  • linear bottleneck in all blocks
  • stem width 64 instead of 32
    и в итоге работает хуже :( спросил у авторов про linear bottleneck и у них оно тоже работало хуже. вопрос почему иногда оно работает, а иногда нет - открытый. Пока гипотеза, что дело в количестве активаций. у меня их получается сильно меньше и это перевешивает вклад от linear stem.
GENet normal my
name : exp27.GENet_norm_my
arch : BNet
model_params:
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]
  block_fns: ["XX", "XX", "Btl", "IR"]
  stage_args: [
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},
      {"bottle_ratio": 0.25},
      {"bottle_ratio": 3},
  ]
  layers: [1, 2, 6, 5]
  channels: [128, 192, 640, 640]


weight_decay : 3e-5
smooth: true

ctwist: true
# very short period of ~3 epoch for ema: 0.9993 ** (2500 * 3) ~= 5e-3
ema_decay: 0.9993

# lr should be BS/256 * 0.1
phases : [
  {"ep": 0, "sz": 224, "bs": 256},
  {"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},
  {"ep": [8, 90], "lr": [0.2, 0], "mom": 0.9, "mode": "cos"},
]

Epoch 85/90. training: 2504it [10:43,  3.89it/s, Acc@1=83.333, Acc@5=94.296, Loss=1.7341]
Epoch 85/90. validating: 101it [00:19,  5.17it/s, Acc@1=78.540, Acc@5=93.952, Loss=1.8448]
[09-04 03:07:39] - Train loss: 1.7329 | Acc@1: 83.3764 | Acc@5: 94.3057
[09-04 03:07:39] - Val   loss: 2.0167 | Acc@1: 74.6780 | Acc@5: 91.6200
[09-04 03:07:39] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [10:40,  3.91it/s, Acc@1=83.625, Acc@5=94.410, Loss=1.7246]
Epoch 86/90. validating: 101it [00:18,  5.33it/s, Acc@1=70.792, Acc@5=89.308, Loss=2.1877]
[09-04 03:18:39] - Train loss: 1.7248 | Acc@1: 83.6215 | Acc@5: 94.4225
[09-04 03:18:39] - Val   loss: 2.0164 | Acc@1: 74.6640 | Acc@5: 91.6100
[09-04 03:18:39] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [10:39,  3.91it/s, Acc@1=83.589, Acc@5=94.415, Loss=1.7244]
Epoch 87/90. validating: 101it [00:19,  5.10it/s, Acc@1=78.592, Acc@5=93.896, Loss=1.8443]
[09-04 03:29:39] - Train loss: 1.7238 | Acc@1: 83.6555 | Acc@5: 94.4287
[09-04 03:29:39] - Val   loss: 2.0162 | Acc@1: 74.6920 | Acc@5: 91.5880
[09-04 03:29:39] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [10:39,  3.92it/s, Acc@1=83.790, Acc@5=94.426, Loss=1.7208]
Epoch 88/90. validating: 101it [00:18,  5.35it/s, Acc@1=70.792, Acc@5=89.316, Loss=2.1875]
[09-04 03:40:38] - Train loss: 1.7212 | Acc@1: 83.7289 | Acc@5: 94.4327
[09-04 03:40:38] - Val   loss: 2.0161 | Acc@1: 74.6860 | Acc@5: 91.5940
[09-04 03:40:38] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [10:44,  3.89it/s, Acc@1=83.865, Acc@5=94.512, Loss=1.7173]
Epoch 89/90. validating: 101it [00:19,  5.08it/s, Acc@1=78.620, Acc@5=93.904, Loss=1.8443]
[09-04 03:51:42] - Train loss: 1.7166 | Acc@1: 83.8576 | Acc@5: 94.5193
[09-04 03:51:42] - Val   loss: 2.0159 | Acc@1: 74.7360 | Acc@5: 91.6260
[09-04 03:51:42] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:42,  3.90it/s, Acc@1=83.892, Acc@5=94.528, Loss=1.7152]
Epoch 90/90. validating: 101it [00:18,  5.55it/s, Acc@1=70.824, Acc@5=89.348, Loss=2.1871]
[09-04 04:02:43] - Train loss: 1.7155 | Acc@1: 83.8897 | Acc@5: 94.5220
[09-04 04:02:43] - Val   loss: 2.0157 | Acc@1: 74.7340 | Acc@5: 91.6360
[09-04 04:02:44] - Acc@1 74.734 Acc@5 91.636
[09-04 04:02:44] - Total time: 16h 35.5m

exp28
Запускал этот эксперимент сразу с 27, когда еще не прочухал что мой вариант хуже работает. Отличие от 27го - заменил Bottleneck и Inverted Residual на linear Separable Conv блок с 2мя DW свертками внутри. т.е.
InvertedResidual: conv1x1 (expand 3 times) --> Norm + ACT --> DW conv3x3 --> Norm + ACT --> conv1x1 (reduce 3 times) --> Norm (no ACT in my version, there is ACT in original).
SepBlock_2: DW conv3x3 --> conv1x1 (no expand) --> Norm + ACT --> DW conv3x3 --> conv1x1 --> Norm (no ACT) .
Идея для такой замены была в избегании dimensionality reduction по максимуму. в хотя это работает, но тут всего 1 (!) активация на каждые 3 в оригинале. возможно поэтому качество сильно хуже (Acc@1: 74 vs 76)

GENet normal my + SepConv2 in last 2 blocks
name : exp28.GENet_norm_my_sep2                                                                                                                                                                             
arch : BNet                                                                                                                                                                                                 
model_params:                                                                                                                                                                                               
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                                                                         
  block_fns: ["XX", "XX", "Sep2", "Sep2"]                                                                                                                                                                 
  stage_args: [                                                                                                                                                                                           
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},                                                                                                                                            
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},                                                                                                                                            
      {"bottle_ratio": 1},                                                                                                                                                                                
      {"bottle_ratio": 1},                                                                                                                                                                                
  ]                                                                                                                                                                                                       
  layers: [1, 2, 6, 5]                                                                                                                                                                                    
  channels: [128, 192, 640, 640]                                                                                                                                                                          
                                                                                                                                                                                                          
                                                                                                                                                                                                          
weight_decay : 3e-5                                                                                                                                                                                         
smooth: true                                                                                                                                                                                                
                                                                                                                                                                                                          
ctwist: true                                                                                                                                                                                                
# very short period of ~3 epoch for ema: 0.9993 ** (2500 * 3) ~= 5e-3                                                                                                                                       
ema_decay: 0.9993                                                                                                                                                                                           
                                                                                                                                                                                                          
# lr should be BS/256 * 0.1                                                                                                                                                                                 
phases : [                                                                                                                                                                                                  
  {"ep": 0, "sz": 224, "bs": 256},                                                                                                                                                                        
  {"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},                                                                                                                                                             
  {"ep": [8, 90], "lr": [0.2, 0], "mom": 0.9, "mode": "cos"},                                                                                                                                             
]

Epoch 85/90. training: 2504it [10:39,  3.91it/s, Acc@1=81.688, Acc@5=93.698, Loss=1.7796]
Epoch 85/90. validating: 101it [00:18,  5.45it/s, Acc@1=78.040, Acc@5=93.876, Loss=1.8440]
[09-04 03:01:31] - Train loss: 1.7782 | Acc@1: 81.7302 | Acc@5: 93.7044
[09-04 03:01:31] - Val   loss: 2.0183 | Acc@1: 74.1360 | Acc@5: 91.4540
[09-04 03:01:31] - Epoch 86 | lr 2.21e-03
Epoch 86/90. training: 2504it [10:35,  3.94it/s, Acc@1=81.985, Acc@5=93.813, Loss=1.7697]
Epoch 86/90. validating: 101it [00:18,  5.50it/s, Acc@1=70.100, Acc@5=88.972, Loss=2.1919]
[09-04 03:12:25] - Train loss: 1.7697 | Acc@1: 81.9852 | Acc@5: 93.8297
[09-04 03:12:25] - Val   loss: 2.0180 | Acc@1: 74.0720 | Acc@5: 91.4120
[09-04 03:12:25] - Epoch 87 | lr 1.48e-03
Epoch 87/90. training: 2504it [10:37,  3.93it/s, Acc@1=82.034, Acc@5=93.823, Loss=1.7676]
Epoch 87/90. validating: 101it [00:18,  5.35it/s, Acc@1=78.100, Acc@5=93.832, Loss=1.8438]
[09-04 03:23:22] - Train loss: 1.7678 | Acc@1: 82.0362 | Acc@5: 93.8330
[09-04 03:23:22] - Val   loss: 2.0181 | Acc@1: 74.1420 | Acc@5: 91.4140
[09-04 03:23:22] - Epoch 88 | lr 8.98e-04
Epoch 88/90. training: 2504it [10:34,  3.95it/s, Acc@1=82.093, Acc@5=93.840, Loss=1.7659]
Epoch 88/90. validating: 101it [00:17,  5.65it/s, Acc@1=70.092, Acc@5=89.008, Loss=2.1921]
[09-04 03:34:15] - Train loss: 1.7659 | Acc@1: 82.1009 | Acc@5: 93.8400
[09-04 03:34:15] - Val   loss: 2.0180 | Acc@1: 74.0920 | Acc@5: 91.4220
[09-04 03:34:15] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [10:39,  3.92it/s, Acc@1=82.253, Acc@5=93.918, Loss=1.7608]
Epoch 89/90. validating: 101it [00:19,  5.15it/s, Acc@1=78.044, Acc@5=93.864, Loss=1.8438]
[09-04 03:45:13] - Train loss: 1.7601 | Acc@1: 82.2799 | Acc@5: 93.9389
[09-04 03:45:13] - Val   loss: 2.0179 | Acc@1: 74.0880 | Acc@5: 91.4300
[09-04 03:45:13] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:39,  3.92it/s, Acc@1=82.305, Acc@5=93.918, Loss=1.7590]
Epoch 90/90. validating: 101it [00:18,  5.39it/s, Acc@1=70.092, Acc@5=89.004, Loss=2.1917]
[09-04 03:56:11] - Train loss: 1.7589 | Acc@1: 82.3118 | Acc@5: 93.9249
[09-04 03:56:11] - Val   loss: 2.0178 | Acc@1: 74.0620 | Acc@5: 91.4320
[09-04 03:56:12] - Acc@1 74.062 Acc@5 91.432
[09-04 03:56:12] - Total time: 16h 28.8m

exp29
Попытка улучшить эксперимент 28 добавлением еще одной Separable свертки в блок.
SepBlock_3: DW conv3x3 --> conv1x1 (no expand) --> Norm + ACT --> DW conv3x3 --> conv1x1 (no expand) --> Norm + ACT --> DW conv3x3 --> conv1x1 --> Norm (no ACT) .
по 2 ACT на блок по сравнению с 1й для SepConv2. Работает чуть лучше, но все равно хуже чем изначальный вариант. Кажется что linear bottleneck для этой модели работает заметно хуже не смотря ни на что

GENet SepConv3 in last 2 block
model_params:                                                                                                                                                                                               
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                                                                         
  block_fns: ["XX", "XX", "Sep3", "Sep3"]                                                                                                                                                                 
  stage_args: [                                                                                                                                                                                           
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},                                                                                                                                            
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},                                                                                                                                            
      {"bottle_ratio": 1},                                                                                                                                                                                
      {"bottle_ratio": 1},                                                                                                                                                                                
  ]                                                                                                                                                                                                       
  layers: [1, 2, 6, 5]                                                                                                                                                                                    
  channels: [128, 192, 640, 640]                                                                                                                                                                          

Epoch 89/90. training: 2504it [11:38,  3.59it/s, Acc@1=83.410, Acc@5=94.412, Loss=1.6956]
Epoch 89/90. validating: 101it [00:19,  5.07it/s, Acc@1=78.956, Acc@5=94.256, Loss=1.7929]
[09-05 02:47:29] - Train loss: 1.6949 | Acc@1: 83.4396 | Acc@5: 94.4382
[09-05 02:47:29] - Val   loss: 1.9659 | Acc@1: 75.0480 | Acc@5: 91.9360
[09-05 02:47:29] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [11:38,  3.59it/s, Acc@1=83.496, Acc@5=94.433, Loss=1.6927]
Epoch 90/90. validating: 101it [00:19,  5.28it/s, Acc@1=71.188, Acc@5=89.572, Loss=2.1387]
[09-05 02:59:27] - Train loss: 1.6927 | Acc@1: 83.4981 | Acc@5: 94.4349
[09-05 02:59:27] - Val   loss: 1.9659 | Acc@1: 75.0620 | Acc@5: 91.9060
[09-05 02:59:28] - Acc@1 75.062 Acc@5 91.906
[09-05 02:59:28] - Total time: 18h 6.6m

exp30
GENet normal my + last activation in each block.
Этот вариант еще ближе к исходному. Отличия: 1) 4 стадии вместо 5, но это точно не может влиять на результат 2) no residual in stride=2 блоках. может влиять на результат, хотя exp2 & exp3 говорят что не должно ухудшать. 3) mobilinetv3 head - ускоряет, но в то же время может и ухудшать.

GENet Norm closer
# Reimplmentation of GENet normal model on my codebase                                                                                                                                                      
# The differences from original is much smaller that in exp27                                                                                                                                               
# * 4 stages instead of 5. shouldn't really matter                                                                                                                                                          
# * no residual in stride=2 blocks                                                                                                                                                                          
# * mobilenetv3 head - GAP before last expansion                                                                                                                                                            
#                                                                                                                                                                                                           
# the difference in config is in `final_act=True` and 4 lines above `layers`
arch : BNet                                                                                                                                                                                                 
model_params:                                                                                                                                                                                               
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                                                                         
  block_fns: ["XX", "XX", "Btl", "IR"]                                                                                                                                                                    
  stage_args: [                                                                                                                                                                                           
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "final_act": True},                                                                                                                         
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "final_act": True},                                                                                                                         
      {"bottle_ratio": 0.25, "final_act": True},                                                                                                                                                          
      {"bottle_ratio": 3, "final_act": True},                                                                                                                                                             
  ]                                                                                                                                                                                                       
  stem_width: 32                                                                                                                                                                                          
  head_width: 2560                                                                                                                                                                                        
  norm_act: relu                                                                                                                                                                                          
  stem_type: default                                                                                                                                                                                      
  layers: [1, 2, 6, 5]                                                                                                                                                                                    
  channels: [128, 192, 640, 640]
Epoch 88/90. training: 2504it [10:39,  3.92it/s, Acc@1=83.456, Acc@5=94.416, Loss=1.6946]
Epoch 88/90. validating: 101it [00:17,  5.66it/s, Acc@1=72.100, Acc@5=90.316, Loss=2.0900]
[09-05 04:07:01] - Train loss: 1.6938 | Acc@1: 83.4637 | Acc@5: 94.4209
[09-05 04:07:01] - Val   loss: 1.9298 | Acc@1: 75.7320 | Acc@5: 92.4160
[09-05 04:07:01] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [10:40,  3.91it/s, Acc@1=83.572, Acc@5=94.494, Loss=1.6890]
Epoch 89/90. validating: 101it [00:17,  5.61it/s, Acc@1=79.356, Acc@5=94.516, Loss=1.7693]
[09-05 04:17:59] - Train loss: 1.6891 | Acc@1: 83.5691 | Acc@5: 94.4988
[09-05 04:17:59] - Val   loss: 1.9297 | Acc@1: 75.7320 | Acc@5: 92.3920
[09-05 04:17:59] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:46,  3.87it/s, Acc@1=83.594, Acc@5=94.471, Loss=1.6884]
Epoch 90/90. validating: 101it [00:17,  5.78it/s, Acc@1=72.120, Acc@5=90.272, Loss=2.0899]
[09-05 04:29:04] - Train loss: 1.6880 | Acc@1: 83.6014 | Acc@5: 94.4693
[09-05 04:29:04] - Val   loss: 1.9296 | Acc@1: 75.7200 | Acc@5: 92.3900
[09-05 04:29:07] - Acc@1 75.720 Acc@5 92.390
[09-05 04:29:07] - Total time: 16h 50.0m

exp31
Единственное отличие от exp30 - другой входной блок. работает чуть лучше и чуть быстрее учится (но чуть медленнее на инференсе, буквально на 3%). space2depth - хорошая идея

GENet normal closer + space2depth
Epoch 88/90. training: 2504it [09:38,  4.33it/s, Acc@1=83.454, Acc@5=94.360, Loss=1.6953]
Epoch 88/90. validating: 101it [00:17,  5.89it/s, Acc@1=72.320, Acc@5=90.196, Loss=2.0865]
[09-05 02:43:47] - Train loss: 1.6951 | Acc@1: 83.4352 | Acc@5: 94.3649
[09-05 02:43:47] - Val   loss: 1.9280 | Acc@1: 75.7640 | Acc@5: 92.4080
[09-05 02:43:47] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [09:38,  4.33it/s, Acc@1=83.568, Acc@5=94.446, Loss=1.6906]
Epoch 89/90. validating: 101it [00:17,  5.73it/s, Acc@1=79.232, Acc@5=94.624, Loss=1.7692]
[09-05 02:53:43] - Train loss: 1.6902 | Acc@1: 83.5691 | Acc@5: 94.4585
[09-05 02:53:43] - Val   loss: 1.9279 | Acc@1: 75.8200 | Acc@5: 92.4200
[09-05 02:53:43] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [09:38,  4.33it/s, Acc@1=83.579, Acc@5=94.460, Loss=1.6894]
Epoch 90/90. validating: 101it [00:17,  5.90it/s, Acc@1=72.408, Acc@5=90.212, Loss=2.0865]
[09-05 03:03:39] - Train loss: 1.6889 | Acc@1: 83.5693 | Acc@5: 94.4716
[09-05 03:03:39] - Val   loss: 1.9279 | Acc@1: 75.8280 | Acc@5: 92.4320
[09-05 03:03:40] - Acc@1 75.828 Acc@5 92.432
[09-05 03:03:40] - Total time: 14h 58.9m

exp32:
GENet + default head
Заменил mobilenetv3 head на дефолтрную голову. работает чуть лучше и еще ближе к оригиналу. по сути единственная разница теперь в наличие residual в stride=2 блоке, который я не хочу добавлять потому что мне кажется оно будет плохо работать

GENet even closer (default head)
arch : BNet                                                                                                                                          
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["XX", "XX", "Btl", "IR"]                                                                                                             
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "final_act": True},                                                                  
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "final_act": True},                                                                  
      {"bottle_ratio": 0.25, "final_act": True},                                                                                                   
      {"bottle_ratio": 3, "final_act": True},                                                                                                      
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  head_width: 2560                                                                                                                                 
  norm_act: relu                                                                                                                                   
  stem_type: default                                                                                                                               
  layers: [1, 2, 6, 5]                                                                                                                             
  channels: [128, 192, 640, 640]                                                                                                                   
  mobilenetv3_head: False                                                                                                                          
                                                                                                                                                   
Epoch 89/90. training: 2504it [10:28,  3.99it/s, Acc@1=84.105, Acc@5=94.669, Loss=1.6783]
Epoch 89/90. validating: 101it [00:19,  5.15it/s, Acc@1=79.596, Acc@5=94.684, Loss=1.7598]
[09-08 04:05:50] - Train loss: 1.6776 | Acc@1: 84.1229 | Acc@5: 94.6836
[09-08 04:05:50] - Val   loss: 1.9218 | Acc@1: 75.9480 | Acc@5: 92.6100
[09-08 04:05:50] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:30,  3.97it/s, Acc@1=84.096, Acc@5=94.692, Loss=1.6772]
Epoch 90/90. validating: 101it [00:19,  5.26it/s, Acc@1=72.352, Acc@5=90.564, Loss=2.0837]
[09-08 04:16:40] - Train loss: 1.6776 | Acc@1: 84.0960 | Acc@5: 94.6684
[09-08 04:16:40] - Val   loss: 1.9217 | Acc@1: 75.9800 | Acc@5: 92.6240
[09-08 04:16:41] - Acc@1 75.980 Acc@5 92.624
[09-08 04:16:41] - Total time: 16h 12.1m

exp33:
GENet + default head + PreActBlocks. работает как будто на капельку лучше чем дефолтная версия, но возможно это из-за небольшой глубины сети. мне нравится идея + она не ухудшает результат, так что можно оставить.
пока собирал PreAct версию, обратил внимание на то, что там BN по-разному стоят по сравнению с дефолтом, но не понятно как это влияет.

GENet + PreAct blocks
arch : BNet                                                                                                                                          
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Btl", "Pre_IR"]                                                                                             
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},                                                                                     
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},                                                                                     
      {"bottle_ratio": 0.25},                                                                                                                      
      {"bottle_ratio": 3},                                                                                                                         
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  head_width: 2560                                                                                                                                 
  norm_act: relu                                                                                                                                   
  stem_type: default                                                                                                                               
  layers: [1, 2, 6, 5]                                                                                                                             
  channels: [128, 192, 640, 640]                                                                                                                   
  mobilenetv3_head: False                                                                                                                          


Epoch 89/90. training: 2504it [10:47,  3.87it/s, Acc@1=84.120, Acc@5=94.696, Loss=1.6726]
Epoch 89/90. validating: 101it [00:18,  5.52it/s, Acc@1=79.624, Acc@5=94.824, Loss=1.7593]
[09-08 05:54:41] - Train loss: 1.6724 | Acc@1: 84.1257 | Acc@5: 94.6862
[09-08 05:54:41] - Val   loss: 1.9204 | Acc@1: 75.9200 | Acc@5: 92.7040
[09-08 05:54:41] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:47,  3.87it/s, Acc@1=84.115, Acc@5=94.704, Loss=1.6715]
Epoch 90/90. validating: 101it [00:17,  5.67it/s, Acc@1=72.212, Acc@5=90.596, Loss=2.0813]
[09-08 06:05:47] - Train loss: 1.6712 | Acc@1: 84.1350 | Acc@5: 94.7071
[09-08 06:05:47] - Val   loss: 1.9204 | Acc@1: 75.9200 | Acc@5: 92.7160
[09-08 06:05:47] - Acc@1 75.920 Acc@5 92.716
[09-08 06:05:47] - Total time: 16h 12.5m

повторил этот же эксперимент спустя две недели. (но на другом сервере), получил:

Epoch 89/90. training: 2504it [09:35,  4.35it/s, Acc@1=84.123, Acc@5=94.682, Loss=1.6727]
Epoch 89/90. validating: 101it [00:17,  5.76it/s, Acc@1=79.716, Acc@5=94.744, Loss=1.7641]
[09-14 02:05:51] - Train loss: 1.6712 | Acc@1: 84.1720 | Acc@5: 94.7113
[09-14 02:05:51] - Val   loss: 1.9290 | Acc@1: 75.7700 | Acc@5: 92.5440
[09-14 02:05:51] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [09:35,  4.35it/s, Acc@1=84.203, Acc@5=94.697, Loss=1.6705]
Epoch 90/90. validating: 101it [00:17,  5.93it/s, Acc@1=71.864, Acc@5=90.312, Loss=2.0938]
[09-14 02:15:44] - Train loss: 1.6709 | Acc@1: 84.1553 | Acc@5: 94.6996
[09-14 02:15:44] - Val   loss: 1.9290 | Acc@1: 75.7980 | Acc@5: 92.5300
[09-14 02:15:44] - Acc@1 75.798 Acc@5 92.530
[09-14 02:15:44] - Total time: 14h 47.0m

значит reproducability тут хороший

exp34
Заменил Bottleneck и DW блоки на preact Separable2 причем с нормализацией и активацией между PW и DW. важно отметить, что в этой сетке 14М параметров, что на 6М меньше чем в exp33 и на это нужно обращать внимание при сравнении.
Работает хуже чем exp33, но возможно это связано с меньшим количеством параметров.
Работает заметно лучше чем exp28 и 29. Кажется что дело в количестве активаций и нормальной голове. Эта ветка моделей (XX, XX, Sep2, Sep2) кажутся перспективными. буду дальше экспериментировать с ними

BNet with Sep2 in last stages
arch : BNet
model_params:
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Sep2", "Pre_Sep2"]
  stage_args: [
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},
      {"bottle_ratio": 1},
      {"bottle_ratio": 1},
  ]
  stem_width: 32
  head_width: 2560
  norm_act: relu
  stem_type: default
  layers: [1, 2, 6, 5]
  channels: [128, 192, 640, 640]
  mobilenetv3_head: False


Epoch 88/90. training: 2504it [09:44,  4.28it/s, Acc@1=82.246, Acc@5=94.056, Loss=1.7421]
Epoch 88/90. validating: 101it [00:17,  5.94it/s, Acc@1=71.816, Acc@5=90.288, Loss=2.0937]
[09-08 10:26:11] - Train loss: 1.7419 | Acc@1: 82.2516 | Acc@5: 94.0699
[09-08 10:26:11] - Val   loss: 1.9333 | Acc@1: 75.5780 | Acc@5: 92.4160
[09-08 10:26:11] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [09:41,  4.31it/s, Acc@1=82.372, Acc@5=94.114, Loss=1.7372]                                                                                                                   
Epoch 89/90. validating: 101it [00:18,  5.50it/s, Acc@1=79.316, Acc@5=94.576, Loss=1.7730]                                                                                                                  
[09-08 10:36:11] - Train loss: 1.7367 | Acc@1: 82.3819 | Acc@5: 94.1395                                                                                                                                     
[09-08 10:36:11] - Val   loss: 1.9334 | Acc@1: 75.5820 | Acc@5: 92.4360                                                                                                                                     
[09-08 10:36:11] - Epoch 90 | lr 1.65e-04                                                                                                                                                                   
Epoch 90/90. training: 2504it [09:45,  4.28it/s, Acc@1=82.387, Acc@5=94.173, Loss=1.7352]                                                                                                                   
Epoch 90/90. validating: 101it [00:17,  5.92it/s, Acc@1=71.864, Acc@5=90.284, Loss=2.0934]                                                                                                                  
[09-08 10:46:14] - Train loss: 1.7352 | Acc@1: 82.4091 | Acc@5: 94.1676                                                                                                                                     
[09-08 10:46:14] - Val   loss: 1.9333 | Acc@1: 75.5920 | Acc@5: 92.4220                                                                                                                                     
[09-08 10:46:15] - Acc@1 75.592 Acc@5 92.422                                                                                                                                                                
[09-08 10:46:15] - Total time: 20h 26.5m

exp35
Поменял количество блоков и фильтров в них руководствуясь RegNet как примером. при этом сохранив inference speed на уровне 16ms batch@224 bs=64.

Работает хуже чем дефолтная версия GENet не очень понятно почему, но не сильно хуже. 13.4M параметров.

BNet with Sep2 in last stages and different depth/filters structure
model_params:
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Sep2", "Pre_Sep2"]
  stage_args: [
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},
      {"dim_reduction": "stride & expand", "bottle_ratio": 1},
      {"bottle_ratio": 1},
      {"bottle_ratio": 1},
  ]
  stem_width: 32
  head_width: 2560
  norm_act: leaky_relu
  stem_type: s2d
  layers: [2, 4, 8, 2]
  channels: [64, 160, 416, 1024]
  mobilenetv3_head: False

Epoch 88/90. training: 2504it [11:09,  3.74it/s, Acc@1=83.207, Acc@5=94.350, Loss=1.7441]
Epoch 88/90. validating: 101it [00:19,  5.23it/s, Acc@1=71.432, Acc@5=89.644, Loss=2.1613]
[09-09 03:40:20] - Train loss: 1.7439 | Acc@1: 83.2188 | Acc@5: 94.3492
[09-09 03:40:20] - Val   loss: 1.9880 | Acc@1: 75.2580 | Acc@5: 92.0480
[09-09 03:40:20] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [11:03,  3.77it/s, Acc@1=83.366, Acc@5=94.402, Loss=1.7397]
Epoch 89/90. validating: 101it [00:18,  5.32it/s, Acc@1=79.052, Acc@5=94.444, Loss=1.8147]
[09-09 03:51:43] - Train loss: 1.7391 | Acc@1: 83.3495 | Acc@5: 94.4247
[09-09 03:51:43] - Val   loss: 1.9880 | Acc@1: 75.2360 | Acc@5: 92.0560
[09-09 03:51:43] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [11:09,  3.74it/s, Acc@1=83.387, Acc@5=94.430, Loss=1.7384]
Epoch 90/90. validating: 101it [00:18,  5.45it/s, Acc@1=71.428, Acc@5=89.664, Loss=2.1611]
[09-09 04:03:11] - Train loss: 1.7380 | Acc@1: 83.3884 | Acc@5: 94.4385
[09-09 04:03:11] - Val   loss: 1.9880 | Acc@1: 75.2420 | Acc@5: 92.0600
[09-09 04:03:12] - Acc@1 75.242 Acc@5 92.060
[09-09 04:03:12] - Total time: 17h 3.4m

exp36
Мне не нравится текущий способ уменьшать разрешение. В этом эксперименте сделал сначала expand, затем conv(stride=2). Это замедляет на ~10% но возможно даст буст по качеству.
upd. по сравнению с exp35 качество заметно выше. возможно можно еще лучше, если применить что-то такое во второй части. и нужно еще сравнить прирост от antialias

BNet with Sep2 in last stages and different depth/filters structure and expand -> stride
model_params:
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Sep2", "Pre_Sep2"]
  stage_args: [
      {"dim_reduction": "expand -> stride", "bottle_ratio": 1},
      {"dim_reduction": "expand -> stride", "bottle_ratio": 1},
      {"bottle_ratio": 1},
      {"bottle_ratio": 1},
  ]
  stem_width: 32
  head_width: 2560
  norm_act: leaky_relu
  stem_type: s2d
  layers: [2, 4, 8, 2]
  channels: [64, 160, 416, 1024]
  mobilenetv3_head: False


Epoch 88/90. training: 2504it [13:16,  3.14it/s, Acc@1=83.670, Acc@5=94.523, Loss=1.7255]
Epoch 88/90. validating: 101it [00:20,  5.02it/s, Acc@1=71.788, Acc@5=90.064, Loss=2.1349]
[09-09 07:42:46] - Train loss: 1.7254 | Acc@1: 83.6595 | Acc@5: 94.5303
[09-09 07:42:46] - Val   loss: 1.9645 | Acc@1: 75.7380 | Acc@5: 92.3140
[09-09 07:42:46] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [13:12,  3.16it/s, Acc@1=83.801, Acc@5=94.622, Loss=1.7207]
Epoch 89/90. validating: 101it [00:20,  5.03it/s, Acc@1=79.696, Acc@5=94.592, Loss=1.7938]
[09-09 07:56:19] - Train loss: 1.7204 | Acc@1: 83.8091 | Acc@5: 94.6292
[09-09 07:56:19] - Val   loss: 1.9645 | Acc@1: 75.7220 | Acc@5: 92.3160
[09-09 07:56:19] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:15,  3.15it/s, Acc@1=83.816, Acc@5=94.616, Loss=1.7198]
Epoch 90/90. validating: 101it [00:18,  5.33it/s, Acc@1=71.740, Acc@5=90.032, Loss=2.1350]
[09-09 08:09:54] - Train loss: 1.7192 | Acc@1: 83.8185 | Acc@5: 94.6410
[09-09 08:09:54] - Val   loss: 1.9643 | Acc@1: 75.7400 | Acc@5: 92.3140
[09-09 08:09:55] - Acc@1 75.740 Acc@5 92.314
[09-09 08:09:55] - Total time: 20h 28.6m

@bonlime
Copy link
Owner Author

bonlime commented Sep 8, 2020

Spoiler Template
To be added

exp37 Simple R34-50 new
Модель похожа на R34 из exp12. Разница в 1) preactivation 2) expand -> stride 3) XX для первых блоков. 17.25M params вместо 16.79M у SimpR34

В итоге чуть лучше чем exp12 (linear bottleneck) и заметно лучше exp9 (pre act), возможно дело в expand -> stride

Simple R34-50
                                                                                                                                                                                                                                                                                                                                                                                                 
model_params:                                                                                                                                                                                               
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                                                                         
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Btl", "Pre_Btl"]                                                                                                                                                   
  stage_args: [                                                                                                                                                                                           
      {"dim_reduction": "expand -> stride", "bottle_ratio": 1},                                                                                                                                           
      {"dim_reduction": "expand -> stride", "bottle_ratio": 1},                                                                                                                                           
      {"bottle_ratio": 1},                                                                                                                                                                                
      {"bottle_ratio": 1},                                                                                                                                                                                
  ]                                                                                                                                                                                                       
  stem_width: 64                                                                                                                                                                                          
  head_width: 2048                                                                                                                                                                                        
  norm_act: leaky_relu                                                                                                                                                                                    
  stem_type: s2d                                                                                                                                                                                          
  layers: [3, 4, 6, 3]                                                                                                                                                                                    
  channels: [64, 128, 256, 512]                                                                                                                                                                           
  mobilenetv3_head: False 
Epoch 89/90. training: 2504it [12:33,  3.32it/s, Acc@1=79.133, Acc@5=92.771, Loss=1.8631]
Epoch 89/90. validating: 101it [00:20,  5.01it/s, Acc@1=79.560, Acc@5=94.756, Loss=1.7663]
[09-10 08:31:11] - Train loss: 1.8622 | Acc@1: 79.1390 | Acc@5: 92.7930
[09-10 08:31:11] - Val   loss: 1.9246 | Acc@1: 75.9180 | Acc@5: 92.8140
[09-10 08:31:11] - Epoch 89: best loss improved from 1.9247 to 1.9246
[09-10 08:31:12] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [12:30,  3.33it/s, Acc@1=79.135, Acc@5=92.783, Loss=1.8625]
Epoch 90/90. validating: 101it [00:19,  5.20it/s, Acc@1=72.296, Acc@5=90.860, Loss=2.0827]
[09-10 08:44:03] - Train loss: 1.8628 | Acc@1: 79.1037 | Acc@5: 92.7860
[09-10 08:44:03] - Val   loss: 1.9246 | Acc@1: 75.9340 | Acc@5: 92.8280
[09-10 08:44:03] - Epoch 90: best loss improved from 1.9246 to 1.9246
[09-10 08:44:05] - Acc@1 75.934 Acc@5 92.828
[09-10 08:44:05] - Total time: 19h 33.5m

exp38
Модель похожа на exp37, но немного другая структура количества блоков в стадиях. Скорость такая же, на 1.5М параметров меньше.
Работает буквально чуть хуже. опять таки не понятно почему.
судя по тому что exp35 тоже работает хуже exp34, моё понимание того, сколько должно быть блоков не работает

SimpR34-50 different stages
model_params:                                                                                                                                                                                               
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                                                                         
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Btl", "Pre_Btl"]                                                                                                                                                   
  stage_args: [                                                                                                                                                                                           
      {"dim_reduction": "expand -> stride", "bottle_ratio": 1},                                                                                                                                           
      {"dim_reduction": "expand -> stride", "bottle_ratio": 1},                                                                                                                                           
      {"bottle_ratio": 1},                                                                                                                                                                                
      {"bottle_ratio": 1},                                                                                                                                                                                
  ]                                                                                                                                                                                                       
  stem_width: 64                                                                                                                                                                                          
  head_width: 2048                                                                                                                                                                                        
  norm_act: leaky_relu                                                                                                                                                                                    
  stem_type: s2d                                                                                                                                                                                          
  layers: [2, 4, 8, 2]                                                                                                                                                                                    
  channels: [64, 128, 256, 512]                                                                                                                                                                           
  mobilenetv3_head: False     
Epoch 89/90. training: 2504it [12:28,  3.35it/s, Acc@1=78.601, Acc@5=92.516, Loss=1.8986]
Epoch 89/90. validating: 101it [00:21,  4.72it/s, Acc@1=79.852, Acc@5=94.852, Loss=1.7752]
[09-10 08:05:33] - Train loss: 1.8977 | Acc@1: 78.6271 | Acc@5: 92.5148
[09-10 08:05:33] - Val   loss: 1.9362 | Acc@1: 76.0480 | Acc@5: 92.7780
[09-10 08:05:33] - Epoch 89: best loss improved from 1.9364 to 1.9362
[09-10 08:05:34] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [12:28,  3.35it/s, Acc@1=78.649, Acc@5=92.540, Loss=1.8978]
Epoch 90/90. validating: 101it [00:20,  4.81it/s, Acc@1=72.224, Acc@5=90.692, Loss=2.0970]
[09-10 08:18:24] - Train loss: 1.8971 | Acc@1: 78.6522 | Acc@5: 92.5358
[09-10 08:18:24] - Val   loss: 1.9362 | Acc@1: 76.0540 | Acc@5: 92.7740
[09-10 08:18:24] - Epoch 90: best loss improved from 1.9362 to 1.9362
[09-10 08:18:25] - Acc@1 76.054 Acc@5 92.774
[09-10 08:18:25] - Total time: 19h 7.8m

exp39
Продолжение 34го с другой активацией и другим способ уменьшать размерность в первых блоках. делаю space2depth -> conv3x3 (4 * inp_chs, out_chs). вместо conv3x3(inp_chs, mid_chs, stride=2). 15.3M параметров
Работает чуточку хуже (что это довольно frustrating). Нужно сделать еще один эксперимент, но теперь с expand-stride

like exp34 + s2d in XX blocks
model_params:
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Sep2", "Pre_Sep2"]
  stage_args: [
      {"dim_reduction": "s2d", "bottle_ratio": 1},
      {"dim_reduction": "s2d", "bottle_ratio": 1},
      {"bottle_ratio": 1},
      {"bottle_ratio": 1},
  ]
  stem_width: 32
  head_width: 2560
  norm_act: leaky_relu
  stem_type: default
  layers: [1, 2, 6, 5]
  channels: [128, 192, 640, 640]
  mobilenetv3_head: False

Epoch 88/90. training: 2504it [10:20,  4.04it/s, Acc@1=82.184, Acc@5=94.058, Loss=1.7453]
Epoch 88/90. validating: 101it [00:17,  5.75it/s, Acc@1=71.704, Acc@5=90.288, Loss=2.1008]
[09-11 04:06:19] - Train loss: 1.7456 | Acc@1: 82.1720 | Acc@5: 94.0507
[09-11 04:06:19] - Val   loss: 1.9365 | Acc@1: 75.4580 | Acc@5: 92.4780
[09-11 04:06:19] - Epoch 89 | lr 4.58e-04
Epoch 89/90. training: 2504it [10:22,  4.02it/s, Acc@1=82.224, Acc@5=94.075, Loss=1.7421]
Epoch 89/90. validating: 101it [00:18,  5.54it/s, Acc@1=79.144, Acc@5=94.676, Loss=1.7722]
[09-11 04:16:59] - Train loss: 1.7407 | Acc@1: 82.2608 | Acc@5: 94.1029
[09-11 04:16:59] - Val   loss: 1.9365 | Acc@1: 75.4360 | Acc@5: 92.4760
[09-11 04:16:59] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:21,  4.03it/s, Acc@1=82.305, Acc@5=94.116, Loss=1.7403]
Epoch 90/90. validating: 101it [00:17,  5.72it/s, Acc@1=71.728, Acc@5=90.300, Loss=2.1006]
[09-11 04:27:39] - Train loss: 1.7404 | Acc@1: 82.3131 | Acc@5: 94.1217
[09-11 04:27:39] - Val   loss: 1.9364 | Acc@1: 75.4240 | Acc@5: 92.4840
[09-11 04:27:40] - Acc@1 75.424 Acc@5 92.484
[09-11 04:27:40] - Total time: 17h 17.1m

exp40
Продолжение exp39. Кажется что не нужно так много блоков на самом низком разрешении. и не нужно так много фильтров в предпоследнем блоке. поменял 5 x 640 -> 6 x 640 на 10 x 480 -> 1 x 1024. 13.5М параметров

Работает хуже чем exp39. не ясно почему. может просто фильтров в последнем блоке не хватает?

exp39 + different stages
model_params:
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Sep2", "Pre_Sep2"]
  stage_args: [
      {"dim_reduction": "s2d", "bottle_ratio": 1},
      {"dim_reduction": "s2d", "bottle_ratio": 1},
      {"bottle_ratio": 1},
      {"bottle_ratio": 1},
  ]
  stem_width: 32
  head_width: 2560
  norm_act: leaky_relu
  stem_type: default
  layers: [1, 2, 10, 1]
  channels: [128, 192, 480, 1024]
  mobilenetv3_head: False

Epoch 89/90. training: 2504it [10:28,  3.99it/s, Acc@1=82.872, Acc@5=94.283, Loss=1.7682]
Epoch 89/90. validating: 101it [00:17,  5.63it/s, Acc@1=79.536, Acc@5=94.528, Loss=1.8103]
[09-11 04:27:55] - Train loss: 1.7676 | Acc@1: 82.8851 | Acc@5: 94.2790
[09-11 04:27:55] - Val   loss: 1.9747 | Acc@1: 75.7100 | Acc@5: 92.3880
[09-11 04:27:55] - Epoch 89: best loss improved from 1.9747 to 1.9747
[09-11 04:27:55] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:11,  4.10it/s, Acc@1=82.993, Acc@5=94.288, Loss=1.7666]
Epoch 90/90. validating: 101it [00:17,  5.83it/s, Acc@1=71.900, Acc@5=90.244, Loss=2.1387]
[09-11 04:38:24] - Train loss: 1.7664 | Acc@1: 82.9583 | Acc@5: 94.3036
[09-11 04:38:24] - Val   loss: 1.9745 | Acc@1: 75.7300 | Acc@5: 92.3800
[09-11 04:38:24] - Epoch 90: best loss improved from 1.9747 to 1.9745
[09-11 04:38:27] - Acc@1 75.730 Acc@5 92.380
[09-11 04:38:27] - Total time: 17h 27.8m

exp41
продолжение exp34 и exp39. 14.5M параметров. видно что этот вариант работает заметно лучше. почему exapand -> stride работает, а s2d нет, не понятно

exp39 + expand -> stride
arch : BNet
model_params:
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Sep2", "Pre_Sep2"]
  stage_args: [
      {"dim_reduction": "expand -> stride", "bottle_ratio": 1},
      {"dim_reduction": "expand -> stride", "bottle_ratio": 1},
      {"bottle_ratio": 1},
      {"bottle_ratio": 1},
  ]
  stem_width: 32
  head_width: 2560
  norm_act: leaky_relu
  stem_type: default
  layers: [1, 2, 6, 5]
  channels: [128, 192, 640, 640]
  mobilenetv3_head: False
Epoch 89/90. training: 2504it [12:18,  3.39it/s, Acc@1=82.768, Acc@5=94.312, Loss=1.7219]
Epoch 89/90. validating: 101it [00:18,  5.33it/s, Acc@1=79.804, Acc@5=94.848, Loss=1.7519]
[09-12 08:01:03] - Train loss: 1.7209 | Acc@1: 82.7881 | Acc@5: 94.3153
[09-12 08:01:03] - Val   loss: 1.9148 | Acc@1: 76.0940 | Acc@5: 92.7300
[09-12 08:01:03] - Epoch 89: best loss improved from 1.9148 to 1.9148
[09-12 08:01:03] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [12:18,  3.39it/s, Acc@1=82.817, Acc@5=94.296, Loss=1.7205]
Epoch 90/90. validating: 101it [00:18,  5.49it/s, Acc@1=72.388, Acc@5=90.644, Loss=2.0773]
[09-12 08:13:41] - Train loss: 1.7197 | Acc@1: 82.8322 | Acc@5: 94.3132
[09-12 08:13:41] - Val   loss: 1.9147 | Acc@1: 76.1000 | Acc@5: 92.7440
[09-12 08:13:41] - Epoch 90: best loss improved from 1.9148 to 1.9147
[09-12 08:13:42] - Acc@1 76.100 Acc@5 92.744
[09-12 08:13:42] - Total time: 18h 54.2m

exp42
посмотрел еще раз на эксперименты выше (exp2 vs exp3, exp26 vs exp36 & exp37). и увидел, что на самом деле для resnet убирание residual из stride=2 блоков сильно сказывалось на лоссе. есть две идеи почему: 1) больше лишних активаций в основном stem 2) теряем то что накопили до этого, из-за сложности выучивания identitiy

этот эксперимент нужно сравнивать с exp32 и exp33. видно что на трейне лосс стал чуточку лучше (и даже лучше чем у оригинальной версии GENet, но в пределах погрешности. но на валидации стало чуточку хуже (хотя возможно стало хуже из-за оверфита)

GENet preact + partial residual in stride=2 blocks
model_params:
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Btl", "Pre_IR"]
  stage_args: [
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},
      {"bottle_ratio": 0.25, "force_residual": True},
      {"bottle_ratio": 3, "force_residual": True},
  ]
  stem_width: 32
  head_width: 2560
  norm_act: relu
  stem_type: default
  layers: [1, 2, 6, 5]
  channels: [128, 192, 640, 640]
  mobilenetv3_head: False

Epoch 89/90. training: 2504it [10:41,  3.90it/s, Acc@1=84.666, Acc@5=94.865, Loss=1.6573]
Epoch 89/90. validating: 101it [00:18,  5.60it/s, Acc@1=79.496, Acc@5=94.664, Loss=1.7640]
[09-13 04:53:21] - Train loss: 1.6566 | Acc@1: 84.6706 | Acc@5: 94.8812
[09-13 04:53:21] - Val   loss: 1.9315 | Acc@1: 75.6340 | Acc@5: 92.5320
[09-13 04:53:21] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:40,  3.91it/s, Acc@1=84.660, Acc@5=94.879, Loss=1.6567]
Epoch 90/90. validating: 101it [00:17,  5.75it/s, Acc@1=71.740, Acc@5=90.360, Loss=2.0989]
[09-13 05:04:19] - Train loss: 1.6568 | Acc@1: 84.6684 | Acc@5: 94.8755
[09-13 05:04:19] - Val   loss: 1.9315 | Acc@1: 75.6220 | Acc@5: 92.5120
[09-13 05:04:20] - Acc@1 75.622 Acc@5 92.512
[09-13 05:04:20] - Total time: 16h 29.5m

exp43
Собрал какую-то свою сетку, всего 5,83М параметров, работает ожидаемо плохо

Custom small BNet
model_params:                                                                                                                                                                                               
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                                                                         
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Btl", "Pre_Btl"]                                                                                                                                                   
  stage_args: [                                                                                                                                                                                           
      {"dim_reduction": "expand -> stride", "bottle_ratio": 1, "force_residual": True},                                                                                                                   
      {"dim_reduction": "expand -> stride", "bottle_ratio": 1, "force_residual": True},                                                                                                                   
      {"bottle_ratio": 1, "force_residual": True, "groups_width": 1},                                                                                                                                     
      {"bottle_ratio": 1, "force_residual": True, "groups_width": 1},                                                                                                                                     
  ]                                                                                                                                                                                                       
  stem_width: 32                                                                                                                                                                                          
  head_width: 2048                                                                                                                                                                                        
  norm_act: leaky_relu                                                                                                                                                                                    
  stem_type: s2d                                                                                                                                                                                          
  layers: [2, 4, 10, 2]                                                                                                                                                                                   
  channels: [64, 128, 192, 480]                                                                                                                                                                           
  mobilenetv3_head: False
Epoch 89/90. training: 2504it [10:21,  4.03it/s, Acc@1=76.580, Acc@5=91.488, Loss=2.0020]
Epoch 89/90. validating: 101it [00:17,  5.92it/s, Acc@1=78.324, Acc@5=93.964, Loss=1.8601]
[09-14 23:53:06] - Train loss: 2.0009 | Acc@1: 76.6031 | Acc@5: 91.4854
[09-14 23:53:06] - Val   loss: 2.0254 | Acc@1: 74.4240 | Acc@5: 91.7860
[09-14 23:53:06] - Epoch 89: best loss improved from 2.0255 to 2.0254
[09-14 23:53:06] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:20,  4.03it/s, Acc@1=76.662, Acc@5=91.466, Loss=1.9999]
Epoch 90/90. validating: 101it [00:16,  6.11it/s, Acc@1=70.516, Acc@5=89.616, Loss=2.1906]
[09-15 00:03:44] - Train loss: 2.0004 | Acc@1: 76.6412 | Acc@5: 91.4545
[09-15 00:03:44] - Val   loss: 2.0253 | Acc@1: 74.4080 | Acc@5: 91.8000
[09-15 00:03:44] - Epoch 90: best loss improved from 2.0254 to 2.0253
[09-15 00:03:44] - Acc@1 74.408 Acc@5 91.800
[09-15 00:03:44] - Total time: 15h 57.3m

exp44
Решил улучшать BNet потихоньку. Близко к exp42, но заменил IR в последнем stage на Btl с бОльшим числом слоев. идея - избегать dim reduction, сохранив количество параметров. работает лучше оригинала! дело ли в бОльшим количестве фильтров или в избегании dim_reduction - вопрос

upd. в этой моделе был баг, забыл написать "groups_width": 1 для последнего слоя. т.е. в конце был обычный ботллнек. количество параметров огромное - 66М видимо из-за этого и лучше качество на трейне. exp46 будет исправленным

Spoiler Template
model_params:
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Btl", "Pre_Btl"]
  stage_args: [
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},
      {"bottle_ratio": 0.25, "force_residual": True},
      {"bottle_ratio": 1, "force_residual": True},
  ]
  stem_width: 32
  head_width: 2560
  norm_act: relu
  stem_type: default
  layers: [1, 2, 6, 5]
  channels: [128, 192, 640, 1024]
  mobilenetv3_head: False
Epoch 89/90. training: 2504it [11:48,  3.53it/s, Acc@1=86.918, Acc@5=95.543, Loss=1.5654]
Epoch 89/90. validating: 101it [00:18,  5.34it/s, Acc@1=79.468, Acc@5=94.664, Loss=1.7608]
[09-15 23:49:09] - Train loss: 1.5648 | Acc@1: 86.9205 | Acc@5: 95.5545
[09-15 23:49:09] - Val   loss: 1.9256 | Acc@1: 75.7620 | Acc@5: 92.5520
[09-15 23:49:09] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [11:50,  3.52it/s, Acc@1=86.931, Acc@5=95.565, Loss=1.5640]
Epoch 90/90. validating: 101it [00:18,  5.51it/s, Acc@1=72.112, Acc@5=90.432, Loss=2.0903]
[09-16 00:01:19] - Train loss: 1.5642 | Acc@1: 86.9176 | Acc@5: 95.5675
[09-16 00:01:19] - Val   loss: 1.9256 | Acc@1: 75.7900 | Acc@5: 92.5360
[09-16 00:01:20] - Acc@1 75.790 Acc@5 92.536
[09-16 00:01:20] - Total time: 18h 32.2m

exp45
Кажется что размер dw kernel особенно важно при stride=2, поэтому поднял его для одной свертки. Не знаю зачем, но накинул сразу еще много других изменений в архитектуру. 19.4М парамеров. Работает как будто чуть лучше (по трейну), но на валидации хуже. но с таким оверфитом это вообще говоря не показатель. Вывод - оставляем все изменения,

  • возможно, имеет смысл поднять аугментации, чтобы было легче сравнивать
exp44 + larger dw kernel size
# close to exp44 but increased dw kernel size for last stage + leaky_relu + s2d                                                                     
                                                                                                                                                   
name : exp45.GENet_preact_Btl_last_s2d_leaky                                                                                                         
arch : BNet                                                                                                                                          
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Btl", "Pre_IR"]                                                                                             
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"bottle_ratio": 0.25, "force_residual": True},                                                                                              
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  head_width: 2560                                                                                                                                 
  norm_act: leaky_relu                                                                                                                             
  stem_type: s2d                                                                                                                                   
  layers: [1, 2, 6, 5]                                                                                                                             
  channels: [128, 192, 640, 1024]                                                                                                                  
  mobilenetv3_head: False                                                                                                                          

Epoch 89/90. training: 2504it [11:02,  3.78it/s, Acc@1=85.322, Acc@5=95.094, Loss=1.6330]
Epoch 89/90. validating: 101it [00:18,  5.54it/s, Acc@1=79.288, Acc@5=94.552, Loss=1.7754]
[09-30 00:35:51] - Train loss: 1.6315 | Acc@1: 85.3534 | Acc@5: 95.1186
[09-30 00:35:51] - Val   loss: 1.9501 | Acc@1: 75.3840 | Acc@5: 92.2340
[09-30 00:35:51] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [11:01,  3.79it/s, Acc@1=85.338, Acc@5=95.120, Loss=1.6314]
Epoch 90/90. validating: 101it [00:17,  5.66it/s, Acc@1=71.456, Acc@5=89.940, Loss=2.1245]
[09-30 00:47:11] - Train loss: 1.6312 | Acc@1: 85.3278 | Acc@5: 95.1118
[09-30 00:47:11] - Val   loss: 1.9500 | Acc@1: 75.3880 | Acc@5: 92.2380
[09-30 00:47:14] - Acc@1 75.388 Acc@5 92.238
[09-30 00:47:14] - Total time: 17h 48.0m

exp46
Поправил последнюю свертку в exp44. 19.3M параметров. Нужно сравнивать с exp43. Работает +- точно так же. но без dim_reduction. значит оставляем мою версию модели

exp44 done right
# close to exp42 but replacing IR in last stage with Btl with larger number of channels                                                              
# number of channels ~matches the number of parameters. 640 * 3 x 640 ~= 1024 ^ 2                                                                    
# This version fixed gr width in last stage                                                                                                          
                                                                                                                                                   
name : exp46.GENet_preact_Btl_last_fixed                                                                                                             
arch : BNet                                                                                                                                          
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Btl", "Pre_Btl"]                                                                                            
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"bottle_ratio": 0.25, "force_residual": True},                                                                                              
      {"bottle_ratio": 1, "force_residual": True, "groups_width": 1},                                                                              
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  head_width: 2560                                                                                                                                 
  norm_act: relu                                                                                                                                   
  stem_type: default                                                                                                                               
  layers: [1, 2, 6, 5]                                                                                                                             
  channels: [128, 192, 640, 1024]                                                                                                                  
  mobilenetv3_head: False                                                                                                                          


Epoch 89/90. training: 2504it [10:47,  3.86it/s, Acc@1=84.792, Acc@5=94.956, Loss=1.6591]
Epoch 89/90. validating: 101it [00:18,  5.39it/s, Acc@1=79.512, Acc@5=94.632, Loss=1.7714]
[09-29 23:35:56] - Train loss: 1.6585 | Acc@1: 84.8136 | Acc@5: 94.9462
[09-29 23:35:56] - Val   loss: 1.9429 | Acc@1: 75.7020 | Acc@5: 92.3640
[09-29 23:35:56] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [10:47,  3.87it/s, Acc@1=84.765, Acc@5=94.978, Loss=1.6581]
Epoch 90/90. validating: 101it [00:18,  5.46it/s, Acc@1=71.912, Acc@5=90.104, Loss=2.1141]
[09-29 23:47:02] - Train loss: 1.6581 | Acc@1: 84.7827 | Acc@5: 94.9586
[09-29 23:47:02] - Val   loss: 1.9427 | Acc@1: 75.7060 | Acc@5: 92.3900
[09-29 23:47:03] - Acc@1 75.706 Acc@5 92.390
[09-29 23:47:03] - Total time: 16h 47.5m

exp??
добавить "dim_reduction": "s2d_dw" в предпоследний блок

exp??
добавить "dim_reduction": "s2d_dw" в последний и предпоследний блок

exp??
заменить в первых блоках XX на XX_res2 (блок со структурой больше похожей на Res2Net paper)

exp??
Попробовать antialias в первых блоках

exp??
Попробовать mixconv в последних блоках

exp??
expand -> stride + antialias для XX

exp??
в последних блоках ставить не DW -> PW -> DW -> PW, а DW -> DW -> PW. получим меньше параметров и больше receptive field

@bonlime
Copy link
Owner Author

bonlime commented Oct 2, 2020

Spoiler Template
To be added

exp47
Похоже на exp46, но заменил в 3й стадии Btl на IR. получилась сетка вообще без dimensionality reduction. Количество параметров слегка увеличилось до 21.57М
Качество прям заметно выросло! но стало чуть медленее учиться. По скорости инференса осталось примерно то же самое. Вывод - dim reduction плохо.

No dim reduction Net
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_IR", "Pre_IR"]                                                                                              
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  head_width: 2560                                                                                                                                 
  norm_act: leaky_relu                                                                                                                             
  stem_type: s2d                                                                                                                                   
  layers: [1, 2, 6, 5]                                                                                                                             
  channels: [128, 192, 640, 1024]                                                                                                                  
  mobilenetv3_head: False                                                                                                                          


Epoch 89/90. training: 2504it [13:53,  3.00it/s, Acc@1=86.378, Acc@5=95.489, Loss=1.5865]
Epoch 89/90. validating: 101it [00:19,  5.20it/s, Acc@1=79.880, Acc@5=94.776, Loss=1.7543]
[10-01 10:16:41] - Train loss: 1.5858 | Acc@1: 86.3902 | Acc@5: 95.4946
[10-01 10:16:41] - Val   loss: 1.9147 | Acc@1: 76.3260 | Acc@5: 92.7160
[10-01 10:16:41] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:55,  3.00it/s, Acc@1=86.467, Acc@5=95.500, Loss=1.5852]
Epoch 90/90. validating: 101it [00:18,  5.34it/s, Acc@1=72.760, Acc@5=90.668, Loss=2.0748]
[10-01 10:30:55] - Train loss: 1.5855 | Acc@1: 86.4553 | Acc@5: 95.4867
[10-01 10:30:55] - Val   loss: 1.9147 | Acc@1: 76.3180 | Acc@5: 92.7120
[10-01 10:30:56] - Acc@1 76.318 Acc@5 92.712
[10-01 10:30:56] - Total time: 21h 22.9m

exp48
Последние эксперименты сложновато сравнивать из-за сильного оверфита. Начиная с этого эксперимента буду дополнительно включать cutmix для регуляризации. это exp47 + cutmix
Cutmix отлично спасает от оверфита. Лосс на трейне резко поднялся, а на валидации наоборот упал

exp47 + cutmix
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_IR", "Pre_IR"]                                                                                              
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  head_width: 2560                                                                                                                                 
  norm_act: leaky_relu                                                                                                                             
  stem_type: s2d                                                                                                                                   
  layers: [1, 2, 6, 5]                                                                                                                             
  channels: [128, 192, 640, 1024]                                                                                                                  
  mobilenetv3_head: False                                                                                                                          
                                                                                                                                                   
cutmix: 1.0                                                                                                                                          


Epoch 89/90. training: 2504it [13:53,  3.00it/s, Acc@1=78.895, Acc@5=92.467, Loss=2.1141]
Epoch 89/90. validating: 101it [00:19,  5.22it/s, Acc@1=80.836, Acc@5=95.448, Loss=1.6855]
[10-01 10:16:42] - Train loss: 2.1165 | Acc@1: 78.8613 | Acc@5: 92.4580
[10-01 10:16:42] - Val   loss: 1.8302 | Acc@1: 77.4960 | Acc@5: 93.6140
[10-01 10:16:42] - Epoch 89: best loss improved from 1.8303 to 1.8302
[10-01 10:16:42] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:55,  3.00it/s, Acc@1=78.801, Acc@5=92.440, Loss=2.1155]
Epoch 90/90. validating: 101it [00:19,  5.31it/s, Acc@1=74.144, Acc@5=91.776, Loss=1.9747]
[10-01 10:30:57] - Train loss: 2.1051 | Acc@1: 79.0235 | Acc@5: 92.5364
[10-01 10:30:57] - Val   loss: 1.8301 | Acc@1: 77.5100 | Acc@5: 93.6200
[10-01 10:30:57] - Epoch 90: best loss improved from 1.8302 to 1.8301
[10-01 10:30:58] - Acc@1 77.510 Acc@5 93.620
[10-01 10:30:58] - Total time: 21h 22.7m

exp49
заменил в exp48 3й stage 6 x 640 => 10 x 480
по результатам сложно что-то сказать. работает вроде бы примерно так же как exp48, может чуть-чуть хуже. но при этом побыстрее. опять таки разница в том числе может быть из-за скачка 480 -> 1024, который теряет больше инфы

upd. ответ на вопрос почему плохо работает можно получить с помощью двух дополнительных экспериментов. поставить в конец поменьше фильтров, чтобы скачок был не такой большой и сравнить. можно поставить например 768. см. exp51 & exp52

еще важность глубины vs ширины можно сравнить поставив в конец меньше блоков (например 2) и тоже сравнив. скорее всего это будут exp53 & exp54

exp48 but deeper instead of wider
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_IR", "Pre_IR"]                                                                                              
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  head_width: 2560                                                                                                                                 
  norm_act: leaky_relu                                                                                                                             
  stem_type: s2d                                                                                                                                   
  layers: [1, 2, 10, 5]                                                                                                                            
  channels: [128, 192, 480, 1024]                                                                                                                  
  mobilenetv3_head: False

Epoch 89/90. training: 2504it [12:47,  3.26it/s, Acc@1=78.830, Acc@5=92.449, Loss=2.1163]
Epoch 89/90. validating: 101it [00:19,  5.26it/s, Acc@1=80.788, Acc@5=95.320, Loss=1.6900]
[10-03 05:07:04] - Train loss: 2.1189 | Acc@1: 78.7062 | Acc@5: 92.4229
[10-03 05:07:04] - Val   loss: 1.8320 | Acc@1: 77.3180 | Acc@5: 93.5620
[10-03 05:07:04] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [12:48,  3.26it/s, Acc@1=79.011, Acc@5=92.560, Loss=2.0976]
Epoch 90/90. validating: 101it [00:18,  5.40it/s, Acc@1=73.828, Acc@5=91.756, Loss=1.9738]
[10-03 05:20:12] - Train loss: 2.1104 | Acc@1: 78.8178 | Acc@5: 92.4644
[10-03 05:20:12] - Val   loss: 1.8317 | Acc@1: 77.3120 | Acc@5: 93.5360
[10-03 05:20:14] - Acc@1 77.312 Acc@5 93.536
[10-03 05:20:14] - Total time: 20h 3.9m

exp50
важный эксперимент. попробовал идею из статьи про ReXNet (см. выше) про увеличение количества фильтров каждый блок по чуть-чуть вместо одного резкого скачка. у этой сетки вышло меньше параметров 16.71M vs 21M в exp49 и хуже качество. опять таки не понятно из-за чего. дело ли в меньшем количестве параметров? или в слишком маленьком количестве фильров в начале stage 3?

возможно я еще не правильно делаю увеличение фильров. нужно будет снова просмотреть статью про ReXNet в поисках интересных идея

exp49 + increase filters each step
# but with gradualy increasing number of filters each block                                                                                          
# This model has only 16.71M Params vs 21M in exp49                                                                                                  
                                                                                                                                                   
name : exp50.GENet_no_dim_red_ctmx_deeper_steps                                                                                                      
arch : BNet                                                                                                                                          
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_IR", "Pre_IR"]                                                                                              
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True, "filter_steps": 32},                          
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True, "filter_steps": 80},                          
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  head_width: 2560                                                                                                                                 
  norm_act: leaky_relu                                                                                                                             
  stem_type: s2d                                                                                                                                   
  layers: [1, 2, 10, 5]                                                                                                                            
  # 224 + 32 * 9 = 512                                                                                                                             
  # 704 + 80 * 4 = 1024 - same as before                                                                                                           
  channels: [128, 192, 224, 704]                                                                                                                   
  mobilenetv3_head: False                                                                                                                          

Epoch 89/90. training: 2504it [11:24,  3.66it/s, Acc@1=77.162, Acc@5=91.697, Loss=2.1943]
Epoch 89/90. validating: 101it [00:18,  5.51it/s, Acc@1=80.420, Acc@5=95.288, Loss=1.7088]
[10-03 03:06:30] - Train loss: 2.1823 | Acc@1: 77.3762 | Acc@5: 91.8050
[10-03 03:06:30] - Val   loss: 1.8564 | Acc@1: 76.8460 | Acc@5: 93.3800
[10-03 03:06:30] - Epoch 89: best loss improved from 1.8565 to 1.8564
[10-03 03:06:31] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [11:24,  3.66it/s, Acc@1=77.726, Acc@5=91.970, Loss=2.1569]
Epoch 90/90. validating: 101it [00:17,  5.63it/s, Acc@1=73.296, Acc@5=91.468, Loss=2.0037]
[10-03 03:18:14] - Train loss: 2.1695 | Acc@1: 77.5699 | Acc@5: 91.9056
[10-03 03:18:14] - Val   loss: 1.8561 | Acc@1: 76.8620 | Acc@5: 93.3840
[10-03 03:18:14] - Epoch 90: best loss improved from 1.8564 to 1.8561
[10-03 03:18:15] - Acc@1 76.862 Acc@5 93.384
[10-03 03:18:15] - Total time: 17h 35.8m

exp51
похож на 48 & 49, только сделал последний stage тоньше. 14.27M params

Deep 3rd stage
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_IR", "Pre_IR"]                                                                                              
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  head_width: 2560                                                                                                                                 
  norm_act: leaky_relu                                                                                                                             
  stem_type: s2d                                                                                                                                   
  layers: [1, 2, 10, 5]                                                                                                                            
  channels: [128, 192, 480, 640]                                                                                                                   
  mobilenetv3_head: False                                                                                                                          


Epoch 89/90. training: 2504it [12:31,  3.33it/s, Acc@1=75.995, Acc@5=91.148, Loss=2.2274]
Epoch 89/90. validating: 101it [00:18,  5.37it/s, Acc@1=80.724, Acc@5=95.320, Loss=1.6948]
[10-04 07:32:31] - Train loss: 2.2190 | Acc@1: 75.9496 | Acc@5: 91.1647
[10-04 07:32:31] - Val   loss: 1.8385 | Acc@1: 77.2700 | Acc@5: 93.5800
[10-04 07:32:31] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [12:29,  3.34it/s, Acc@1=75.959, Acc@5=91.145, Loss=2.2261]
Epoch 90/90. validating: 101it [00:18,  5.50it/s, Acc@1=73.820, Acc@5=91.844, Loss=1.9815]
[10-04 07:45:20] - Train loss: 2.2274 | Acc@1: 75.8621 | Acc@5: 91.1374
[10-04 07:45:20] - Val   loss: 1.8379 | Acc@1: 77.2880 | Acc@5: 93.5840
[10-04 07:45:20] - Epoch 90: best loss improved from 1.8381 to 1.8379
[10-04 07:45:21] - Acc@1 77.288 Acc@5 93.584
[10-04 07:45:21] - Total time: 19h 56.6

exp52
нужно сравнивать с exp51. нужен был для понимания exp49 vs exp48
14.52M params

Wide 3rd stage
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_IR", "Pre_IR"]                                                                                              
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  head_width: 2560                                                                                                                                 
  norm_act: leaky_relu                                                                                                                             
  stem_type: s2d                                                                                                                                   
  layers: [1, 2, 6, 5]                                                                                                                             
  channels: [128, 192, 640, 640]                                                                                                                   
  mobilenetv3_head: False                                                                                                                          


Epoch 89/90. training: 2504it [13:05,  3.19it/s, Acc@1=75.819, Acc@5=91.075, Loss=2.2206]
Epoch 89/90. validating: 101it [00:18,  5.41it/s, Acc@1=80.372, Acc@5=95.244, Loss=1.7018]
[10-04 08:32:51] - Train loss: 2.2257 | Acc@1: 75.7942 | Acc@5: 91.0592
[10-04 08:32:51] - Val   loss: 1.8447 | Acc@1: 77.1080 | Acc@5: 93.4140
[10-04 08:32:51] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:05,  3.19it/s, Acc@1=76.137, Acc@5=91.212, Loss=2.2048]
Epoch 90/90. validating: 101it [00:18,  5.56it/s, Acc@1=73.852, Acc@5=91.608, Loss=1.9868]
[10-04 08:46:15] - Train loss: 2.2147 | Acc@1: 76.0806 | Acc@5: 91.1929
[10-04 08:46:15] - Val   loss: 1.8441 | Acc@1: 77.1040 | Acc@5: 93.4320
[10-04 08:46:15] - Epoch 90: best loss improved from 1.8445 to 1.8441
[10-04 08:46:19] - Acc@1 77.104 Acc@5 93.432
[10-04 08:46:19] - Total time: 20h 57.6m

exp53
пытаюсь ответить на вопрос. помогает ли MLP на верху сети. в exp52 в голове было 640 -> 2560, заменил на 640 -> 1536 -> 2560 + hard swish активацию потому что она лучше сохраняет ранк (идея из ReXNet). стало на 3М параметров больше (17.56M) и как будто чуть-чуть лучше, но возможно дело только в swish
для истории оставлю, как выглядит голова

self.head = nn.Sequential( # like Mbln v3 head. GAP first, then MLP convs
                last_norm,
                FastGlobalAvgPool2d(flatten=True),
                nn.Linear(channels[3], head_width[0]),
                nn.BatchNorm1d(head_width[0]),
                pt.modules.activations.activation_from_name(head_norm_act),
                nn.Linear(head_width[0], head_width[1]),
                nn.BatchNorm1d(head_width[1]),
                pt.modules.activations.activation_from_name(head_norm_act),
                nn.Linear(head_width[1], num_classes),
            )

Wide 3d stage with 2L MLP
name : exp53.GEnet_wider_mlp2                                                                                                                        
arch : BNet                                                                                                                                          
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_IR", "Pre_IR"]                                                                                              
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  norm_act: leaky_relu                                                                                                                             
  stem_type: s2d                                                                                                                                   
  layers: [1, 2, 6, 5]                                                                                                                             
  channels: [128, 192, 640, 640]                                                                                                                   
  mobilenetv3_head: False                                                                                                                          
  head_width: [1536, 2560]                                                                                                                         
  head_type: mlp_2                                                                                                                                 
  head_norm_act: swish_hard

Epoch 89/90. training: 2504it [13:56,  2.99it/s, Acc@1=79.916, Acc@5=92.758, Loss=2.1880]
Epoch 89/90. validating: 101it [00:21,  4.68it/s, Acc@1=80.000, Acc@5=94.944, Loss=1.7498]
[10-06 13:05:07] - Train loss: 2.1865 | Acc@1: 79.8614 | Acc@5: 92.7484
[10-06 13:05:07] - Val   loss: 1.9143 | Acc@1: 76.2480 | Acc@5: 92.7240
[10-06 13:05:07] - Epoch 89: best loss improved from 1.9145 to 1.9143
[10-06 13:05:07] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:02,  3.20it/s, Acc@1=79.643, Acc@5=92.681, Loss=2.1912]
Epoch 90/90. validating: 101it [00:18,  5.47it/s, Acc@1=72.508, Acc@5=90.524, Loss=2.0784]
[10-06 13:18:28] - Train loss: 2.1872 | Acc@1: 79.7169 | Acc@5: 92.6993
[10-06 13:18:28] - Val   loss: 1.9142 | Acc@1: 76.2440 | Acc@5: 92.7400
[10-06 13:18:28] - Epoch 90: best loss improved from 1.9143 to 1.9142
[10-06 13:18:29] - Acc@1 76.244 Acc@5 92.740
[10-06 13:18:29] - Total time: 20h 3.0m

exp54
похоже на exp52 & 53 но с 3х слойным MLP на верху. 640 -> 2560, заменил на 640 -> 1024 -> 1536 -> 2560 18.81M params.

для истории оставлю как выглядит голова -

self.head = nn.Sequential( # like Mbln v3 head. GAP first, then MLP convs
                last_norm,
                FastGlobalAvgPool2d(flatten=True),
                nn.Linear(channels[3], head_width[0]),
                nn.BatchNorm1d(head_width[0]),
                pt.modules.activations.activation_from_name(head_norm_act),
                nn.Linear(head_width[0], head_width[1]),
                nn.BatchNorm1d(head_width[1]),
                pt.modules.activations.activation_from_name(head_norm_act),
                nn.Linear(head_width[1], head_width[2]),
                nn.BatchNorm1d(head_width[2]),
                pt.modules.activations.activation_from_name(head_norm_act),
                nn.Linear(head_width[2], num_classes),
            )

Wide 3d stage with 3L MLP
name : exp54.GEnet_wider_mlp3                                                                                                                        
arch : BNet                                                                                                                                          
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_IR", "Pre_IR"]                                                                                              
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
      {"bottle_ratio": 1, "force_residual": True, "dw_str2_kernel_size": 9, "force_expansion": True},                                              
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  norm_act: leaky_relu                                                                                                                             
  stem_type: s2d                                                                                                                                   
  layers: [1, 2, 6, 5]                                                                                                                             
  channels: [128, 192, 640, 640]                                                                                                                   
  mobilenetv3_head: False                                                                                                                          
  head_width: [1024, 1536, 2560]                                                                                                                   
  head_type: mlp_3                                                                                                                                 
  head_norm_act: swish_hard                                                                                                                        


Epoch 89/90. training: 2504it [13:56,  2.99it/s, Acc@1=79.062, Acc@5=92.308, Loss=2.2058]
Epoch 89/90. validating: 101it [00:21,  4.61it/s, Acc@1=80.248, Acc@5=94.916, Loss=1.7398]
[10-06 13:05:06] - Train loss: 2.2128 | Acc@1: 79.0271 | Acc@5: 92.3409
[10-06 13:05:06] - Val   loss: 1.9001 | Acc@1: 76.3000 | Acc@5: 92.8280
[10-06 13:05:06] - Epoch 89: best loss improved from 1.9006 to 1.9001
[10-06 13:05:06] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:03,  3.20it/s, Acc@1=79.307, Acc@5=92.530, Loss=2.2127]
Epoch 90/90. validating: 101it [00:18,  5.42it/s, Acc@1=72.384, Acc@5=90.748, Loss=2.0597]
[10-06 13:18:29] - Train loss: 2.2111 | Acc@1: 79.1769 | Acc@5: 92.4477
[10-06 13:18:29] - Val   loss: 1.8995 | Acc@1: 76.3180 | Acc@5: 92.8420
[10-06 13:18:29] - Epoch 90: best loss improved from 1.9001 to 1.8995
[10-06 13:18:30] - Acc@1 76.318 Acc@5 92.842
[10-06 13:18:30] - Total time: 20h 2.9m

exp???
пока перечитывал ReXNet paper возникла идея как улучшить голову и одновременно ускорить все. если у тебя есть representational bottleneck в голове, то можно вместо увеличения количества филтров в stage 4 воткнуть наверх GAP + MLP на пару слоёв, отличие от идеи в Mobilenet V3 - несколько таких слоёв (плюс судя по статье очень важно туда swish воткнуть)

@bonlime
Copy link
Owner Author

bonlime commented Oct 8, 2020

Spoiler Template
To be added

последние эксперименты очень сложно сравнивать, хочется как-то улучшить (ускорить) пайплайн тренировки. для этого попробую включить weight standadization

exp55
такой же как exp48 + weight standadization. удивительно, что результаты примерно такие же! никакого улучшения или ускорения тренировки. сначала даже подумал что это где-то баг спрятался, но нет, все нормально. Надо бы еще сравнить GN vs GN + WS, чтобы убедиться. Сделал потом инференс в jupyter, посмотрел на распределения весов - они очень похожие что с, что без WS. т.е. даже без насильного форса распределения к нулю, оно все равно получается zero-mean для весов. прикольно

Mean & Std для сетки обученной с WS и без

image
image

same as exp48 + weight standardization
Epoch 89/90. training: 2504it [13:07,  3.18it/s, Acc@1=79.199, Acc@5=92.638, Loss=2.0848]
Epoch 89/90. validating: 101it [00:19,  5.24it/s, Acc@1=80.728, Acc@5=95.240, Loss=1.6944]
[10-07 14:31:22] - Train loss: 2.0938 | Acc@1: 79.1780 | Acc@5: 92.6180
[10-07 14:31:22] - Val   loss: 1.8337 | Acc@1: 77.5100 | Acc@5: 93.6300
[10-07 14:31:22] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:06,  3.18it/s, Acc@1=79.036, Acc@5=92.564, Loss=2.1079]
Epoch 90/90. validating: 101it [00:18,  5.36it/s, Acc@1=74.356, Acc@5=92.060, Loss=1.9733]
[10-07 14:44:48] - Train loss: 2.1082 | Acc@1: 79.0800 | Acc@5: 92.5379
[10-07 14:44:48] - Val   loss: 1.8341 | Acc@1: 77.5300 | Acc@5: 93.6340
[10-07 14:44:49] - Acc@1 77.530 Acc@5 93.634
[10-07 14:44:49] - Total time: 20h 20.5m

exp56
Такая же сетка как в exp48 & exp55 + WS, с оптимизатором AdamW. поднял LR до 0.002 и зачем-то еще поднял weight decay до 1e-4. оно быстрее сходится в начале, но потом становится хуже. может быть amsgrad улучшит результат?

same as exp48 + WS + AdamW
Epoch 89/90. training: 2504it [13:02,  3.20it/s, Acc@1=80.479, Acc@5=93.135, Loss=2.1360]
Epoch 89/90. validating: 101it [00:19,  5.31it/s, Acc@1=79.412, Acc@5=94.648, Loss=1.7994]
[10-08 03:18:57] - Train loss: 2.1317 | Acc@1: 80.4139 | Acc@5: 93.0954
[10-08 03:18:57] - Val   loss: 1.9745 | Acc@1: 75.5100 | Acc@5: 92.3880
[10-08 03:18:57] - Epoch 90 | lr 1.65e-06
Epoch 90/90. training: 2504it [13:02,  3.20it/s, Acc@1=80.381, Acc@5=93.132, Loss=2.1275]
Epoch 90/90. validating: 101it [00:18,  5.44it/s, Acc@1=71.592, Acc@5=90.128, Loss=2.1495]
[10-08 03:32:18] - Train loss: 2.1256 | Acc@1: 80.5021 | Acc@5: 93.1611
[10-08 03:32:18] - Val   loss: 1.9744 | Acc@1: 75.5000 | Acc@5: 92.3840
[10-08 03:32:18] - Model params: 21.57M
[10-08 03:32:19] - Acc@1 75.500 Acc@5 92.384
[10-08 03:32:19] - Total time: 20h 4.4m

exp57
Такая же сетка как в exp48 & exp55 & exp56 + WS + модный оптимизатор AdamP, который якобы борется с увеличением норм весов. по результатам сильно лучше чем у AdamW и похоже на SGD

same as exp48 + WS + AdamP
Epoch 89/90. training: 2504it [14:10,  2.94it/s, Acc@1=79.993, Acc@5=93.132, Loss=2.1224]
Epoch 89/90. validating: 101it [00:19,  5.30it/s, Acc@1=80.864, Acc@5=95.396, Loss=1.7209]
[10-08 04:59:23] - Train loss: 2.1225 | Acc@1: 79.9306 | Acc@5: 93.1243
[10-08 04:59:23] - Val   loss: 1.8680 | Acc@1: 77.5120 | Acc@5: 93.5980
[10-08 04:59:23] - Epoch 90 | lr 1.65e-06
Epoch 90/90. training: 2504it [14:11,  2.94it/s, Acc@1=80.120, Acc@5=93.171, Loss=2.1101]
Epoch 90/90. validating: 101it [00:18,  5.44it/s, Acc@1=74.176, Acc@5=91.788, Loss=2.0149]
[10-08 05:13:54] - Train loss: 2.1157 | Acc@1: 80.0770 | Acc@5: 93.1377
[10-08 05:13:54] - Val   loss: 1.8678 | Acc@1: 77.5100 | Acc@5: 93.5840
[10-08 05:13:54] - Model params: 21.57M
[10-08 05:13:55] - Acc@1 77.510 Acc@5 93.584
[10-08 05:13:55] - Total time: 21h 57.7m
TB для exp48, exp55-57

(там есть одна опечатка, синий график это на самом деле AdamP, а не adam как написано)
Screenshot from 2020-10-08 13-57-58

То что AdamP работает это хорошо. Нужно теперь попробовать потюнить параметры. Авторы статьи про Novograd предлагали какие-то невозможноые 0.12 WD для AdamW. можно попробовать обучить с таким параметром
Еще нужно попробовать результаты с Novograd и Novograd + WS. upd. заметил, что на графике лосса для AdamP есть изгиб в начале во время warmup, скорее всего это индикатор того, что LR слишком большой

exp58
такой же как exp57, только wd=1e-3, а не 3e-5. Сходится точно так же

exp59 & exp60
такой же сетап как в exp48 + Novograd и значения для LR из статьи. результаты очень плохие. кажется, что LR нужно поднимать на порядок, чтобы оно нормально работало. WD=0.002, LR=0.007. Нужно попробовать еще раз с WD=1e-3 и LR=0.1 (это в 15 раз больше нынешнего, может хоть так сойдётся). Еще вспомнил, что когда-то уже экспериментировал с Novograd + ResNet50, тогда ставил WD=0.02 и LR=0.07, оно сходилось пободрее, но все равно не доучилось. Может попробовать поставить очень-очень большой LR?

Novograd w/ & w/o WS
Without WS:

Epoch 89/90. training: 2504it [13:07,  3.18it/s, Acc@1=50.274, Acc@5=73.067, Loss=3.3964]
Epoch 89/90. validating: 101it [00:19,  5.27it/s, Acc@1=63.828, Acc@5=86.312, Loss=2.3973]
[10-09 08:04:16] - Train loss: 3.3730 | Acc@1: 50.5753 | Acc@5: 73.3497
[10-09 08:04:16] - Val   loss: 2.6165 | Acc@1: 59.0180 | Acc@5: 82.0040
[10-09 08:04:16] - Epoch 90 | lr 5.78e-06
Epoch 90/90. training: 2504it [13:06,  3.18it/s, Acc@1=50.782, Acc@5=73.602, Loss=3.3532]
Epoch 90/90. validating: 101it [00:18,  5.43it/s, Acc@1=54.220, Acc@5=77.680, Loss=2.8339]
[10-09 08:17:42] - Train loss: 3.3631 | Acc@1: 50.6839 | Acc@5: 73.4715
[10-09 08:17:42] - Val   loss: 2.6148 | Acc@1: 59.0480 | Acc@5: 81.9960
[10-09 08:17:42] - Epoch 90: best loss improved from 2.6155 to 2.6148
[10-09 08:17:43] - Model params: 21.57M
[10-09 08:17:43] - Acc@1 59.048 Acc@5 81.996
[10-09 08:17:43] - Total time: 20h 12.7m

With WS. 
Epoch 89/90. training: 2504it [14:00,  2.98it/s, Acc@1=49.825, Acc@5=72.687, Loss=3.4116]
Epoch 89/90. validating: 101it [00:19,  5.25it/s, Acc@1=63.204, Acc@5=86.012, Loss=2.4101]
[10-09 09:36:27] - Train loss: 3.4002 | Acc@1: 49.9944 | Acc@5: 72.8332
[10-09 09:36:27] - Val   loss: 2.6385 | Acc@1: 58.5020 | Acc@5: 81.4900
[10-09 09:36:27] - Epoch 90 | lr 5.78e-06
Epoch 90/90. training: 2504it [13:59,  2.98it/s, Acc@1=50.394, Acc@5=73.239, Loss=3.3571]
Epoch 90/90. validating: 101it [00:18,  5.40it/s, Acc@1=53.820, Acc@5=77.000, Loss=2.8648]
[10-09 09:50:46] - Train loss: 3.3740 | Acc@1: 50.2419 | Acc@5: 73.0610
[10-09 09:50:46] - Val   loss: 2.6367 | Acc@1: 58.4900 | Acc@5: 81.5140
[10-09 09:50:46] - Model params: 21.57M
[10-09 09:50:46] - Acc@1 58.490 Acc@5 81.514
[10-09 09:50:46] - Total time: 21h 46.2m

exp61
Novograd + очень большой LR. поставил LR=0.05, wd=0.002, в итоге нормально обучилось до качества близкого к результатам в exp48 и exp57. использовать ли Novograd дальше - хз

Novograd + high LR
Epoch 89/90. training: 2504it [13:05,  3.19it/s, Acc@1=76.637, Acc@5=91.273, Loss=2.1704]
Epoch 89/90. validating: 101it [00:19,  5.31it/s, Acc@1=80.392, Acc@5=95.340, Loss=1.7001]
[10-10 10:54:38] - Train loss: 2.1731 | Acc@1: 76.5962 | Acc@5: 91.2336
[10-10 10:54:38] - Val   loss: 1.8355 | Acc@1: 77.3000 | Acc@5: 93.5280
[10-10 10:54:38] - Epoch 90 | lr 4.13e-05
Epoch 90/90. training: 2504it [13:07,  3.18it/s, Acc@1=76.459, Acc@5=91.116, Loss=2.1761]
Epoch 90/90. validating: 101it [00:18,  5.41it/s, Acc@1=74.224, Acc@5=91.752, Loss=1.9717]
[10-10 11:08:04] - Train loss: 2.1718 | Acc@1: 76.5817 | Acc@5: 91.1909
[10-10 11:08:04] - Val   loss: 1.8359 | Acc@1: 77.3180 | Acc@5: 93.5520
[10-10 11:08:04] - Model params: 21.57M
[10-10 11:08:05] - Acc@1 77.318 Acc@5 93.552
[10-10 11:08:05] - Total time: 20h 4.7m

exp62
Всё так же как в exp48 + SGDP. заметно медленее учится, чуть похуже на трейне, чуть получше на валидации. нужно еще посмотреть на нормы весов

SGDP
Epoch 89/90. training: 2504it [13:52,  3.01it/s, Acc@1=78.027, Acc@5=92.104, Loss=2.1500]
Epoch 89/90. validating: 101it [00:18,  5.33it/s, Acc@1=81.056, Acc@5=95.500, Loss=1.6780]
[10-10 14:18:50] - Train loss: 2.1416 | Acc@1: 78.1241 | Acc@5: 92.1455
[10-10 14:18:50] - Val   loss: 1.8195 | Acc@1: 77.6880 | Acc@5: 93.7560
[10-10 14:18:50] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:52,  3.01it/s, Acc@1=78.357, Acc@5=92.185, Loss=2.1300]                                                            
Epoch 90/90. validating: 101it [00:18,  5.49it/s, Acc@1=74.328, Acc@5=92.012, Loss=1.9606]                                                           
[10-10 14:33:01] - Train loss: 2.1316 | Acc@1: 78.2709 | Acc@5: 92.1758                                                                              
[10-10 14:33:01] - Val   loss: 1.8192 | Acc@1: 77.6840 | Acc@5: 93.7580                                                                              
[10-10 14:33:01] - Epoch 90: best loss improved from 1.8193 to 1.8192                                                                                
[10-10 14:33:01] - Model params: 21.57M                                                                                                              
[10-10 14:33:02] - Acc@1 77.684 Acc@5 93.758                                                                                                         
[10-10 14:33:02] - Total time: 21h 16.0m

exp63
No dimensionality reduction (похоже на exp48 и далее), но в блоке стоят PW-PW-DW вместо PW-DW-PW. Тоже хорошо работает, на трейне заметно лучше, на валидации чуть хуже, возможно с такой последовательностью, сетке проще оверфититься . Нужно будет попробовать еще DW->PW->PW (ожидаю, что оно будет работать хуже)

BNet PW-PW-DW
# close to exp48
# but in last stages block changed to PW -> PW -> DW instead of PW -> DW -> PW as in Inverted
# Idea is to check which order works best. It's slightly slower than before because both
# PW convs are performed on high resolution
model_params:                                                                                                                                        
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]                                                                                                  
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Custom_2", "Pre_Custom_2"]                                                                                  
  stage_args: [                                                                                                                                    
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},                                                             
      {"bottle_ratio": 1, "dw_str2_kernel_size": 9},                                                                                               
      {"bottle_ratio": 1, "dw_str2_kernel_size": 9},                                                                                               
  ]                                                                                                                                                
  stem_width: 32                                                                                                                                   
  head_width: 2560                                                                                                                                 
  norm_act: leaky_relu                                                                                                                             
  stem_type: s2d                                                                                                                                   
  layers: [1, 2, 6, 5]                                                                                                                             
  channels: [128, 192, 640, 1024]                                                                                                                  
  head_type: "default"                                                                                                                             

Epoch 89/90. training: 2504it [14:14,  2.93it/s, Acc@1=80.276, Acc@5=93.064, Loss=2.0694]
Epoch 89/90. validating: 101it [00:19,  5.20it/s, Acc@1=80.908, Acc@5=95.484, Loss=1.6936]
[10-10 17:11:21] - Train loss: 2.0689 | Acc@1: 80.3573 | Acc@5: 93.0898
[10-10 17:11:21] - Val   loss: 1.8485 | Acc@1: 77.2520 | Acc@5: 93.4180
[10-10 17:11:21] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [14:14,  2.93it/s, Acc@1=80.386, Acc@5=93.061, Loss=2.0646]
Epoch 90/90. validating: 101it [00:18,  5.35it/s, Acc@1=73.620, Acc@5=91.360, Loss=2.0028]
[10-10 17:25:55] - Train loss: 2.0692 | Acc@1: 80.3214 | Acc@5: 93.0284
[10-10 17:25:55] - Val   loss: 1.8482 | Acc@1: 77.2560 | Acc@5: 93.4240
[10-10 17:25:55] - Model params: 21.57M
[10-10 17:25:55] - Acc@1 77.256 Acc@5 93.424
[10-10 17:25:55] - Total time: 22h 3.0m

exp64
Собрал сетку из каких-то своих внутренних представлений о том, что должно работать, а что нет. Вышла очень маленькой и в 2 раза быстрее чем в экспериментах выше. качество, очевидно, тоже просело. возможно такой вариант сетки назову потом small. Здесь используется PW-PW-DW блок как и в эксперименте выше.

BNet small
# close to exp48 and exp63 in some sense but also very different
# * using PW -> PW -> DW blocks
# * using totally different number of layers/channels in each stage
# still using default SGD optimizer because previous runs hasn't completed and it's hard to make
# conclusions whether or not SGDP works
# 7.15M params. 5350 imgs/sec forward

model_params:
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Custom_2", "Pre_Custom_2"]
  stage_args: [
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},
      {"bottle_ratio": 1, "dw_str2_kernel_size": 9},
      {"bottle_ratio": 1, "dw_str2_kernel_size": 9},
  ]
  stem_width: 32
  head_width: 2560
  norm_act: leaky_relu
  stem_type: s2d
  layers: [2, 4, 8, 2]
  channels: [64, 128, 256, 512]
  head_type: default

Epoch 89/90. training: 2503it [09:07,  4.57it/s, Acc@1=71.299, Acc@5=88.381, Loss=2.4868]
Epoch 89/90. validating: 101it [00:15,  6.42it/s, Acc@1=78.612, Acc@5=94.200, Loss=1.8217]
[10-11 14:09:08] - Train loss: 2.4745 | Acc@1: 71.5265 | Acc@5: 88.5513
[10-11 14:09:08] - Val   loss: 1.9810 | Acc@1: 74.7780 | Acc@5: 92.0320
[10-11 14:09:08] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [09:08,  4.57it/s, Acc@1=72.074, Acc@5=88.882, Loss=2.4454]
Epoch 90/90. validating: 101it [00:15,  6.65it/s, Acc@1=70.888, Acc@5=89.836, Loss=2.1395]
[10-11 14:18:32] - Train loss: 2.4627 | Acc@1: 71.8076 | Acc@5: 88.7137
[10-11 14:18:32] - Val   loss: 1.9804 | Acc@1: 74.7460 | Acc@5: 92.0180
[10-11 14:18:32] - Epoch 90: best loss improved from 1.9808 to 1.9804
[10-11 14:18:32] - Model params: 7.15M
[10-11 14:18:32] - Acc@1 74.746 Acc@5 92.018
[10-11 14:18:32] - Total time: 13h 51.9m

exp65
похоже на BNet small из exp64, но с линейным увеличением количества фильтров в каждом блоке в stage 3 & stage 4. на 2М параметров больше и работает, понятное дело, тоже получше. если учесть что количество фильтров в начале не особо менялось, кажется будто основной bottleneck именно в количестве фильтров в stage3 & stage4

BNet small steps
# close to exp64                                                                                                                                     
# * using PW -> PW -> DW blocks
# * using totally different number of layers/channels in each stage
# * (!) using filter steps to gradually increase filter size 
# 9M params. 4700 imgs/sec forward

model_params:
  stage_fns: ["simpl", "simpl", "simpl", "simpl"]
  block_fns: ["Pre_XX", "Pre_XX", "Pre_Custom_2", "Pre_Custom_2"]
  stage_args: [
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},
      {"dim_reduction": "stride & expand", "bottle_ratio": 1, "force_residual": True},
      {"bottle_ratio": 1, "dw_str2_kernel_size": 9, "filter_steps": 32},
      {"bottle_ratio": 1, "dw_str2_kernel_size": 9, "filter_steps": 128},
  ]
  stem_width: 32
  head_width: 2560
  norm_act: leaky_relu
  stem_type: s2d
  layers: [2, 4, 8, 2]
  channels: [64, 128, 256, 512]
  head_type: default

Epoch 89/90. training: 2503it [09:37,  4.34it/s, Acc@1=73.482, Acc@5=89.733, Loss=2.3709]
Epoch 89/90. validating: 101it [00:16,  6.04it/s, Acc@1=79.324, Acc@5=94.808, Loss=1.7822]
[10-11 05:03:53] - Train loss: 2.3547 | Acc@1: 73.7636 | Acc@5: 89.8882
[10-11 05:03:53] - Val   loss: 1.9363 | Acc@1: 75.5580 | Acc@5: 92.6720
[10-11 05:03:53] - Epoch 89: best loss improved from 1.9368 to 1.9363
[10-11 05:03:53] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [09:36,  4.34it/s, Acc@1=73.339, Acc@5=89.646, Loss=2.3805]
Epoch 90/90. validating: 101it [00:15,  6.42it/s, Acc@1=71.760, Acc@5=90.556, Loss=2.0907]
[10-11 05:13:46] - Train loss: 2.3722 | Acc@1: 73.4334 | Acc@5: 89.7098
[10-11 05:13:46] - Val   loss: 1.9366 | Acc@1: 75.5420 | Acc@5: 92.6920
[10-11 05:13:46] - Model params: 8.94M
[10-11 05:13:47] - Acc@1 75.542 Acc@5 92.692
[10-11 05:13:47] - Total time: 15h 16.8m  

exp66
Sigmoid как лосс. в остальном то же самое что в exp48. Это без sigmoid trick для последнего bias

Sigmoid
Epoch 89/90. training: 2503it [13:22,  3.12it/s, Acc@1=77.565, Acc@5=91.133, Loss=0.4660]
Epoch 89/90. validating: 101it [00:18,  5.36it/s, Acc@1=80.556, Acc@5=95.012, Loss=0.3076]
[10-12 07:21:15] - Train loss: 0.4639 | Acc@1: 77.5453 | Acc@5: 91.1490
[10-12 07:21:15] - Val   loss: 0.3566 | Acc@1: 77.1400 | Acc@5: 93.1200
[10-12 07:21:15] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:21,  3.12it/s, Acc@1=77.250, Acc@5=90.983, Loss=0.4638]
Epoch 90/90. validating: 101it [00:18,  5.50it/s, Acc@1=73.748, Acc@5=91.204, Loss=0.4054]
[10-12 07:34:55] - Train loss: 0.4657 | Acc@1: 77.1482 | Acc@5: 90.9519
[10-12 07:34:55] - Val   loss: 0.3563 | Acc@1: 77.1540 | Acc@5: 93.1000
[10-12 07:34:55] - Model params: 21.57M
[10-12 07:34:56] - Acc@1 77.154 Acc@5 93.100
[10-12 07:34:56] - Total time: 20h 36.9m

exp67
то же самое что в exp66 + sigmoid trick (последний bias=-4.5). Быстрее сходится в начале, но по итогу обучается не лучше. Т.е. это хорошая идея, но нужно пофиксить проблемы с плохим обучением в конце. Это точно связано с лоссом (но возможно и с оптимизатором)

Sigmoid + sigmoid trick
Epoch 89/90. training: 2503it [13:38,  3.06it/s, Acc@1=77.392, Acc@5=91.072, Loss=0.4619]
Epoch 89/90. validating: 101it [00:19,  5.31it/s, Acc@1=80.260, Acc@5=94.984, Loss=0.3012]
[10-14 03:56:23] - Train loss: 0.4629 | Acc@1: 77.3676 | Acc@5: 91.0727
[10-14 03:56:23] - Val   loss: 0.3498 | Acc@1: 76.8200 | Acc@5: 93.1200
[10-14 03:56:23] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:37,  3.06it/s, Acc@1=77.413, Acc@5=91.072, Loss=0.4645]
Epoch 90/90. validating: 101it [00:18,  5.41it/s, Acc@1=73.352, Acc@5=91.232, Loss=0.3985]
[10-14 04:10:20] - Train loss: 0.4676 | Acc@1: 77.2198 | Acc@5: 90.9881
[10-14 04:10:20] - Val   loss: 0.3499 | Acc@1: 76.8120 | Acc@5: 93.1100
[10-14 04:10:20] - Model params: 21.57M
[10-14 04:10:21] - Acc@1 76.812 Acc@5 93.110
[10-14 04:10:21] - Total time: 21h 1.5m

exp68
как exp48 + Reduced Focal. если считать среднее, Focal loss очень маленький, поэтому поставил reduction=sum. Из-за этого на первых эпохах лосс ~1000, что очень много и сетка два раза скатилась в nan из-за overflow. пофиксил это уменьшеним LR в 20 раз. alpha=-1, что бы не увеличивать вес у фона. когда запускал эксперимент это казалось хорошей идеей, но оно в итоге очень сильно оверфитнулось, так что возможно alpha важен и нужен. Тут есть sigmoid trick, он чуть ускоряет сходимость в начале (но вообще focal и так сходится быстрее всех лоссов, на 3й эпохе accuracy уже 50%+).

Reduced Focal
sigmoid_trick: True                                                                                                                                  
criterion: focal                                                                                                                                     
criterion_params:                                                                                                                                    
  combine_thr: 0.5                                                                                                                                 
  alpha: -1                                                                                                                                        
  reduction: sum
smooth: false # False for sigmoid

Epoch 89/90. training: 2503it [12:16,  3.40it/s, Acc@1=81.578, Acc@5=92.146, Loss=238.8729]
Epoch 89/90. validating: 101it [00:13,  7.51it/s, Acc@1=79.072, Acc@5=92.548, Loss=211.1063]
[10-14 10:07:19] - Train loss: 239.6074 | Acc@1: 81.4918 | Acc@5: 92.1108
[10-14 10:07:19] - Val   loss: 246.8679 | Acc@1: 75.3500 | Acc@5: 90.1000
[10-14 10:07:19] - Epoch 90 | lr 8.25e-06
Epoch 90/90. training: 2504it [12:17,  3.40it/s, Acc@1=81.718, Acc@5=92.217, Loss=240.5084]
Epoch 90/90. validating: 101it [00:12,  7.79it/s, Acc@1=71.584, Acc@5=87.640, Loss=282.8043]
[10-14 10:19:50] - Train loss: 240.9019 | Acc@1: 81.5328 | Acc@5: 92.1246
[10-14 10:19:50] - Val   loss: 247.0057 | Acc@1: 75.3380 | Acc@5: 90.1000
[10-14 10:19:50] - Model params: 21.57M
[10-14 10:19:50] - Acc@1 75.338 Acc@5 90.100
[10-14 10:19:50] - Total time: 18h 54.0m

exp69
как exp68 + label smoothing. изначально казалось, что он точно не нужен для sigmoid, но после обсуждения с @monashev решил добавить в качестве регуляризации. как регуляризация работает so-so. лосс на трейне ниже, но лосс на валидации тоже ниже :c

Reduced Focal + smooth
Epoch 89/90. training: 2503it [12:15,  3.40it/s, Acc@1=80.853, Acc@5=91.798, Loss=245.1541]
Epoch 89/90. validating: 101it [00:13,  7.55it/s, Acc@1=78.720, Acc@5=92.204, Loss=216.1674]
[10-15 05:31:37] - Train loss: 250.5881 | Acc@1: 80.5330 | Acc@5: 91.6442
[10-15 05:31:37] - Val   loss: 251.4391 | Acc@1: 74.8580 | Acc@5: 89.7460
[10-15 05:31:37] - Epoch 90 | lr 8.25e-06
Epoch 90/90. training: 2504it [12:15,  3.40it/s, Acc@1=80.491, Acc@5=91.608, Loss=252.2074]
Epoch 90/90. validating: 101it [00:12,  7.85it/s, Acc@1=70.984, Acc@5=87.300, Loss=285.4043]
[10-15 05:44:06] - Train loss: 253.3561 | Acc@1: 80.4152 | Acc@5: 91.5692
[10-15 05:44:06] - Val   loss: 250.2975 | Acc@1: 74.8480 | Acc@5: 89.7620
[10-15 05:44:06] - Model params: 21.57M
[10-15 05:44:08] - Acc@1 74.848 Acc@5 89.762
[10-15 05:44:08] - Total time: 18h 45.2m

Вдруг осознал, что в экспериментах выше используется cutmix, возможно из-за этого лосс такой большой на трейне! не понятно хорошо ли вообще так делать, может нужно тогда считать KLD поверх вместо focal? или может нужно подобрать alpha (для cutmix) побольше, чтобы куски картинок были побольше и label бинаризовать?

Можно попробовать поучить модель из exp64 & exp65, там сильно меньше параметров, оверфит не должен беспокоить


exp70
как exp69 но с alpha. Как и ожидалось, это работает как некая регуляризация и поэтому слабее оверфитит.

Focal + alpha
sigmoid_trick: True                                                                                                                                                                                         
criterion: focal                                                                                                                                                                                            
criterion_params:                                                                                                                                                                                           
  combine_thr: 0.5                                                                                                                                                                                        
  alpha: 0.25                                                                                                                                                                                             
  reduction: sum                                                                                                                                                                                          

Epoch 89/90. training: 2503it [12:19,  3.39it/s, Acc@1=79.255, Acc@5=91.077, Loss=160.1886]
Epoch 89/90. validating: 101it [00:14,  7.18it/s, Acc@1=79.184, Acc@5=92.824, Loss=76.2642]
[10-16 04:26:15] - Train loss: 158.6523 | Acc@1: 79.3386 | Acc@5: 91.1305
[10-16 04:26:15] - Val   loss: 86.7702 | Acc@1: 75.5320 | Acc@5: 90.5400
[10-16 04:26:15] - Epoch 90 | lr 8.25e-06
Epoch 90/90. training: 2504it [12:19,  3.38it/s, Acc@1=79.470, Acc@5=91.184, Loss=156.7629]
Epoch 90/90. validating: 101it [00:13,  7.49it/s, Acc@1=71.860, Acc@5=88.240, Loss=97.2557]
[10-16 04:38:49] - Train loss: 155.8026 | Acc@1: 79.5755 | Acc@5: 91.2220
[10-16 04:38:49] - Val   loss: 86.7757 | Acc@1: 75.5280 | Acc@5: 90.5200
[10-16 04:38:49] - Model params: 21.57M
[10-16 04:38:49] - Acc@1 75.528 Acc@5 90.520
[10-16 04:38:49] - Total time: 18h 51.5m

exp71
как exp70 + Novograd optimizer. Авторы статьи утверждали, что LR нужно ставить где-то между Adam и SGD, но тут LR в 10 раз больше чем в exp70 (0.1 vs 0.01) и этого мало, сетка очень медленно сходится. В. exp72 поставил LR=0.4 и стало гораздо лучше. В целом про эксперимент - всё равно очень сильно оверфитится :(

Еще из интересного - с Novograd лосс на валидации ниже, но метрика тоже Acc@1 ниже. Acc@5 тоже ниже, но не сильно

Focal + Alpha + Novograd
optim: novograd
sigmoid_trick: True
criterion: focal
criterion_params:
  combine_thr: 0.5
  alpha: 0.25
  reduction: sum

Epoch 89/90. training: 2503it [12:12,  3.42it/s, Acc@1=73.171, Acc@5=87.946, Loss=178.0623]                                                                                                                  
Epoch 89/90. validating: 101it [00:13,  7.54it/s, Acc@1=77.768, Acc@5=92.632, Loss=71.4735]                                                                                                                  
[10-16 05:23:28] - Train loss: 179.9818 | Acc@1: 73.1021 | Acc@5: 87.9162                                                                                                                                    
[10-16 05:23:28] - Val   loss: 81.0909 | Acc@1: 73.5660 | Acc@5: 90.0540                                                                                                                                     
[10-16 05:23:28] - Epoch 90 | lr 8.25e-05                                                                                                                                                                    
Epoch 90/90. training: 2504it [12:13,  3.42it/s, Acc@1=72.713, Acc@5=87.718, Loss=184.4917]                                                                                                                  
Epoch 90/90. validating: 101it [00:12,  7.81it/s, Acc@1=69.392, Acc@5=87.452, Loss=90.5979]                                                                                                                  
[10-16 05:35:54] - Train loss: 183.6849 | Acc@1: 72.8161 | Acc@5: 87.7443                                                                                                                                    
[10-16 05:35:54] - Val   loss: 80.9826 | Acc@1: 73.5700 | Acc@5: 90.0440                                                                                                                                     
[10-16 05:35:54] - Model params: 21.57M                                                                                                                                                                      
[10-16 05:35:55] - Acc@1 73.570 Acc@5 90.044                                                                                                                                                                 
[10-16 05:35:55] - Total time: 18h 50.3m 

@bonlime
Copy link
Owner Author

bonlime commented Oct 16, 2020

Spoiler Template
To be added

Пытаюсь уйти от CE к другим лоссам

пока они всё очень сильно оверфитятся. Видимо ambigiouty которое вносит CE служило хорошей регуляризацией. Есть два варианта - либо добавить dropout/dropconnect, либо переехать со своими экспериментами на модель поменьше. Второй вариант выглядит проще

exp70-exp80
Здесь не будет каких-то детальных, логов, просто словами опишу что делал и что работало/не работало.
Если коротко - ничего не работало. Пытался использовать KLD, BCE, разные варианты Focal, всё очень плохо и медленно обучается, видимо никуда от CCE в ImageNet не деться.
Пытался добавить рандомную интерполяцию как аугментацию и jitter аугментацию, но они обе по отдельности только ухудшают тренировку. лосс на трейне становится лишь чуть хуже, а вот на валидации всё становится сильно хуже. Единственный плюс - качество на валидации перестаёт зависеть от типа интерполяции, это может быть большим плюсом для реальных задач.
Jitter всё еще не работает. когда-то давно пытался включать его после resize, но там картинки прям совсем в кашу из пикселей превращаются, сейчас пытался добавить перед resize, чтобы всё хоть чуть-чуть сгладилось, оно и правда сглаживается, но видимо слишком сильно регуляризирует (или просто даёт картинки из совсем другого распределения). Хотя сейчас перепроверил, у меня не было отдельно эксперимента с jitter = True и random_interpolation=False, нужно будет попробовать!

Вся идея попробовать sigmoid пришла из статьи Are we done with Imagenet? но авторы не выложили код и не понятно как именно они обучались с сигмоидой, что оно им так докидывало.

Еще пытался использовать Novograd, если поставить очень большой LR (0.1 что очень много для adaptive методов) то оно учится примерно до такого же качества как с SGD, что неплохо

exp82
Прочитал, что вместо использования label smoothing можно добавить параметр температуры в CCE и с помощью него регулировать уверенность предсказаний. в этом exp T=0.1, smooth=False. работает хуже чем в оригинале из-за очень сильного оверфита. нужно попробовать тот же эксперимент но со smooth=True
идея из статьи When Does Label Smoothing Help?

exp48 + CCE + Temperature=0.1
criterion_params:
temperature: 0.1

cutmix: 1.0
weight_decay : 3e-5
# smooth: false # false for exp82
ctwist: true
# very short period of ~3 epoch for ema: 0.9993 ** (2500 * 3) ~= 5e-3
ema_decay: 0.9993

# lr should be BS/256 * 0.1
phases : [
  {"ep": 0, "sz": 224, "bs": 256},
  {"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},
  {"ep": [8, 90], "lr": [0.2, 0], "mom": 0.9, "mode": "cos"},
]

Epoch 89/90. training: 2503it [13:27,  3.10it/s, Acc@1=80.464, Acc@5=93.062, Loss=1.1918]
Epoch 89/90. validating: 101it [00:18,  5.43it/s, Acc@1=79.724, Acc@5=94.860, Loss=0.7964]
[10-31 08:26:41] - Train loss: 1.1971 | Acc@1: 80.3969 | Acc@5: 93.0314
[10-31 08:26:41] - Val   loss: 0.9661 | Acc@1: 76.2140 | Acc@5: 92.7420
[10-31 08:26:41] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:27,  3.10it/s, Acc@1=80.154, Acc@5=92.923, Loss=1.2080]
Epoch 90/90. validating: 101it [00:18,  5.59it/s, Acc@1=72.684, Acc@5=90.664, Loss=1.1355]
[10-31 08:40:27] - Train loss: 1.2152 | Acc@1: 80.0942 | Acc@5: 92.8924
[10-31 08:40:27] - Val   loss: 0.9661 | Acc@1: 76.2020 | Acc@5: 92.7700
[10-31 08:40:27] - Model params: 21.57M        
[10-31 08:40:28] - Acc@1 76.202 Acc@5 92.770                   
[10-31 08:40:28] - Total time: 20h 39.8m

повторил эксперимент выше с smooth=False. как видно это сильно регуляризирует в плане лосса и качество на валидации заметно лучше чем в варианте выше, но всё равно как будто хуже чем exp48.

exp48 + CCE + Temperature=0.1 + smooth
Epoch 89/90. training: 2503it [13:46,  3.03it/s, Acc@1=80.406, Acc@5=93.151, Loss=2.1034]
Epoch 89/90. validating: 101it [00:19,  5.25it/s, Acc@1=80.740, Acc@5=95.144, Loss=1.7388]
[11-03 04:01:14] - Train loss: 2.1147 | Acc@1: 80.1818 | Acc@5: 93.0761
[11-03 04:01:14] - Val   loss: 1.8886 | Acc@1: 77.1900 | Acc@5: 93.2920
[11-03 04:01:14] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:46,  3.03it/s, Acc@1=79.968, Acc@5=92.983, Loss=2.1238]
Epoch 90/90. validating: 101it [00:18,  5.38it/s, Acc@1=73.664, Acc@5=91.440, Loss=2.0380]
[11-03 04:15:20] - Train loss: 2.1178 | Acc@1: 80.0714 | Acc@5: 93.0148
[11-03 04:15:20] - Val   loss: 1.8884 | Acc@1: 77.2100 | Acc@5: 93.2900
[11-03 04:15:20] - Model params: 21.57M
[11-03 04:15:21] - Acc@1 77.210 Acc@5 93.290
[11-03 04:15:21] - Total time: 21h 21.6m

exp83
Добавил Gaussian Blur аугментацию (для этого пришлось пересесть на новый релиз DALI, который вышел 20 часов назад, кек. Забыл включить в этом эксперименте smooth, но работает заметно лучше чем exp82, вывод - это хорошая аугментация, можно оставить.

exp48 + Blur
blur: true

cutmix: 1.0
weight_decay : 3e-5
# smooth: false # false for exp82
ctwist: true
# very short period of ~3 epoch for ema: 0.9993 ** (2500 * 3) ~= 5e-3
ema_decay: 0.9993

# lr should be BS/256 * 0.1
phases : [
  {"ep": 0, "sz": 224, "bs": 256},
  {"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},
  {"ep": [8, 90], "lr": [0.2, 0], "mom": 0.9, "mode": "cos"},
]

Epoch 89/90. training: 2503it [16:23,  2.54it/s, Acc@1=78.342, Acc@5=92.212, Loss=1.2685]                                                             
Epoch 89/90. validating: 101it [00:19,  5.18it/s, Acc@1=80.484, Acc@5=95.164, Loss=0.7507]                                                            
[10-31 10:21:56] - Train loss: 1.2621 | Acc@1: 78.3775 | Acc@5: 92.2247                                                                               
[10-31 10:21:56] - Val   loss: 0.9054 | Acc@1: 76.9520 | Acc@5: 93.3680                                                                               
[10-31 10:21:56] - Epoch 90 | lr 1.65e-04                                                                                                             
Epoch 90/90. training: 2504it [16:26,  2.54it/s, Acc@1=78.196, Acc@5=92.154, Loss=1.2753]                                                             
Epoch 90/90. validating: 101it [00:19,  5.07it/s, Acc@1=73.444, Acc@5=91.560, Loss=1.0600]                                                            
[10-31 10:38:43] - Train loss: 1.2819 | Acc@1: 78.1197 | Acc@5: 92.1305                                                                               
[10-31 10:38:43] - Val   loss: 0.9054 | Acc@1: 76.9660 | Acc@5: 93.3600                                                                               
[10-31 10:38:43] - Model params: 21.57M                                                                                                               
[10-31 10:38:44] - Acc@1 76.966 Acc@5 93.360                                                                                                          
[10-31 10:38:44] - Total time: 21h 41.1m

повторил эксперимент выше со smooth=True, сильно регулиризирует, валидация лучше. но как будто все равно хуже чем exp48.
upd. после повторения exp48 видно, что нормально оно работает, так что теперь будет blur: true по дефолту!

exp48 + Blur + smooth
Epoch 89/90. training: 2503it [13:47,  3.03it/s, Acc@1=78.079, Acc@5=92.096, Loss=2.1431]
Epoch 89/90. validating: 101it [00:19,  5.16it/s, Acc@1=80.548, Acc@5=95.280, Loss=1.6945]
[11-03 04:05:48] - Train loss: 2.1534 | Acc@1: 77.9282 | Acc@5: 92.0183
[11-03 04:05:48] - Val   loss: 1.8339 | Acc@1: 77.1120 | Acc@5: 93.5560
[11-03 04:05:48] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [14:30,  2.88it/s, Acc@1=77.196, Acc@5=91.671, Loss=2.1822]
Epoch 90/90. validating: 101it [00:19,  5.20it/s, Acc@1=73.676, Acc@5=91.800, Loss=1.9737]
[11-03 04:20:38] - Train loss: 2.1695 | Acc@1: 77.5135 | Acc@5: 91.8176
[11-03 04:20:38] - Val   loss: 1.8344 | Acc@1: 77.1080 | Acc@5: 93.5540
[11-03 04:20:38] - Model params: 21.57M
[11-03 04:20:39] - Acc@1 77.108 Acc@5 93.554
[11-03 04:20:39] - Total time: 21h 23.3m

exp48 (again)
результат выше намекают, что нужно снова запустить exp48, чтобы посмотреть какое качество получится при текущем коде.
вышло чуть хуже чем раньше по лоссу и acc@1, но примерно так же по acc@5, значит код не сломан, ура!

exp48 (again)
Epoch 89/90. training: 2503it [13:53,  3.00it/s, Acc@1=78.806, Acc@5=92.428, Loss=2.1194]
Epoch 89/90. validating: 101it [00:19,  5.30it/s, Acc@1=80.868, Acc@5=95.432, Loss=1.6887]
[11-01 14:50:07] - Train loss: 2.1231 | Acc@1: 78.6401 | Acc@5: 92.3581
[11-01 14:50:07] - Val   loss: 1.8339 | Acc@1: 77.2540 | Acc@5: 93.6480
[11-01 14:50:07] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:40,  3.05it/s, Acc@1=78.772, Acc@5=92.430, Loss=2.1268]
Epoch 90/90. validating: 101it [00:18,  5.44it/s, Acc@1=73.672, Acc@5=91.884, Loss=1.9793]
[11-01 15:04:06] - Train loss: 2.1195 | Acc@1: 78.8330 | Acc@5: 92.4460
[11-01 15:04:06] - Val   loss: 1.8342 | Acc@1: 77.2640 | Acc@5: 93.6520
[11-01 15:04:06] - Model params: 21.57M                                                                                                               
[11-01 15:04:09] - Acc@1 77.264 Acc@5 93.652                                                                     
[11-01 15:04:09] - Total time: 21h 2.1m 

exp84
exp48 + blur + temp. по сути объединение exp82 & 83 в один.

exp48 + Blur + Temp + smooth
Epoch 89/90. training: 2503it [13:53,  3.00it/s, Acc@1=79.250, Acc@5=92.642, Loss=2.1554]
Epoch 89/90. validating: 101it [00:19,  5.28it/s, Acc@1=80.448, Acc@5=95.160, Loss=1.7482]
[11-03 09:11:14] - Train loss: 2.1652 | Acc@1: 79.0706 | Acc@5: 92.5653
[11-03 09:11:14] - Val   loss: 1.8981 | Acc@1: 76.9520 | Acc@5: 93.1720
[11-03 09:11:14] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:52,  3.01it/s, Acc@1=78.874, Acc@5=92.430, Loss=2.1801]
Epoch 90/90. validating: 101it [00:18,  5.43it/s, Acc@1=73.488, Acc@5=91.192, Loss=2.0481]
[11-03 09:25:26] - Train loss: 2.1706 | Acc@1: 78.9673 | Acc@5: 92.5004
[11-03 09:25:26] - Val   loss: 1.8981 | Acc@1: 76.9860 | Acc@5: 93.1820
[11-03 09:25:26] - Model params: 21.57M
[11-03 09:25:26] - Acc@1 76.986 Acc@5 93.182
[11-03 09:25:26] - Total time: 23h 31.9m

exp85
попытка как-то изменить дефолтный LR schedule, заменив его на warm restarts. из-за того что LR=0.4 а не 0.2 как обычно, уже к 60й эпохе получил такие же результаты как обычно за 90. но за последние 30 эпох результат не сильно улучшился :c возможный вывод - хорошая идея поднять дефолтный LR в два раза.

BNet reset
phases : [                                                                                                                                           
  {"ep": 0, "sz": 224, "bs": 256},                                                                                                                 
  {"ep": [0, 6], "lr": [0, 0.4], "mom": 0.95},                                                                                                     
  {"ep": [6, 60], "lr": [0.4, 0], "mode": "cos"},                                                                                                  
  {"ep": [60, 90], "lr": [0.01, 0], "mode": "cos"},                                                                                                
]            
Epoch 60/90. training: 2503it [13:53,  3.00it/s, Acc@1=74.609, Acc@5=90.443, Loss=2.2765] 
Epoch 60/90. validating: 101it [00:18,  5.40it/s, Acc@1=74.220, Acc@5=92.236, Loss=1.9527]
[11-04 01:19:41] - Train loss: 2.2765 | Acc@1: 74.5169 | Acc@5: 90.3970
[11-04 01:19:41] - Val   loss: 1.8253 | Acc@1: 77.3800 | Acc@5: 93.7920
[11-04 01:19:41] - Epoch 61 | lr 8.46e-05                                                                                                              
Epoch 89/90. training: 2503it [13:46,  3.03it/s, Acc@1=77.693, Acc@5=91.985, Loss=2.1583]
Epoch 89/90. validating: 101it [00:19,  5.22it/s, Acc@1=81.036, Acc@5=95.472, Loss=1.6834]
[11-04 08:10:57] - Train loss: 2.1522 | Acc@1: 77.8565 | Acc@5: 92.0423
[11-04 08:10:57] - Val   loss: 1.8129 | Acc@1: 77.7800 | Acc@5: 93.9280
[11-04 08:10:57] - Epoch 90 | lr 6.16e-05
Epoch 90/90. training: 2504it [14:23,  2.90it/s, Acc@1=77.939, Acc@5=92.012, Loss=2.1401]
Epoch 90/90. validating: 101it [00:18,  5.38it/s, Acc@1=74.548, Acc@5=92.388, Loss=1.9421]
[11-04 08:25:40] - Train loss: 2.1498 | Acc@1: 77.9024 | Acc@5: 91.9953
[11-04 08:25:40] - Val   loss: 1.8127 | Acc@1: 77.7980 | Acc@5: 93.9200
[11-04 08:25:40] - Epoch 90: best loss improved from 1.8129 to 1.8127
[11-04 08:25:40] - Model params: 21.57M
[11-04 08:25:41] - Acc@1 77.798 Acc@5 93.920
[11-04 08:25:41] - Total time: 22h 35.3m

exp86
Normalized CE. смешной эксперимент, начал читать статью про angular лоссы, не дочитал, но увидел что они там предлагают какую-то нормализованную CE и запустил эксперимент, в котором нормализую логиты перед softmax. проблема в том, что нормализовывал их на единичную сферу, а надо было на сферу чуть побольше, но всё равно. Лосс практически не упал по сравнению с началом тренировки, но accuracy получилось удивительно высокое. и это как будто хорошо защищает от overfit. попробовать ArcFace норм идея. но сначала нужно почитать статьи, которые фиксят его проблемы

Normalized CE
Epoch 89/90. training: 2503it [16:18,  2.56it/s, Acc@1=72.725, Acc@5=86.219, Loss=6.2849]
Epoch 89/90. validating: 101it [00:19,  5.20it/s, Acc@1=78.448, Acc@5=92.412, Loss=6.1837]
[11-04 17:22:55] - Train loss: 6.2844 | Acc@1: 72.7285 | Acc@5: 86.1958
[11-04 17:22:55] - Val   loss: 6.2154 | Acc@1: 74.7220 | Acc@5: 90.0080
[11-04 17:22:55] - Epoch 89: best loss improved from 6.2154 to 6.2154
[11-04 17:22:56] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [16:20,  2.55it/s, Acc@1=73.049, Acc@5=86.363, Loss=6.2798]
Epoch 90/90. validating: 101it [00:19,  5.24it/s, Acc@1=70.920, Acc@5=87.632, Loss=6.2471]
[11-04 17:39:36] - Train loss: 6.2831 | Acc@1: 72.8597 | Acc@5: 86.2751
[11-04 17:39:36] - Val   loss: 6.2154 | Acc@1: 74.6740 | Acc@5: 90.0240
[11-04 17:39:36] - Model params: 21.57M
[11-04 17:39:36] - Acc@1 74.674 Acc@5 90.024
[11-04 17:39:36] - Total time: 23h 4.5m

exp88
поставил exp87 выше чем 88, потому что так логичнее. Не дочитав статьи про angular лосс решил провести эксперимент по мотивам exp86. как видно, лосс там не сильно падает, это происходит из-за того, что единичная сфера ограничивает минимальный лосс даже для правильно классифицированных примеров. см. статью про AdaCos для точной формулы. решил попробовать Norm + Temp=0.1 чтобы уменьшить лосс, но нормировал не фичи и матрицы весов. Еще уменьшил ширину головы до 256, с идеей что angular лучше работает в маленьком пространстве. Работает сильно хуже чем в exp86 и exp88, где реализован правильный A-Softmax. вывод - нужно делать как в статьях, нормализовывая эмбеддинги и веса, а не косинусы.

Norm + Temperature
  head_width: 256 # originally in was 2560
  head_norm_act: none
criterion_params:
  normalize: true
  temperature: 0.1
Epoch 89/90. training: 2503it [15:49,  2.64it/s, Acc@1=79.805, Acc@5=91.182, Loss=1.4865]
Epoch 89/90. validating: 101it [00:18,  5.35it/s, Acc@1=79.172, Acc@5=93.776, Loss=1.3644]
[11-08 16:49:21] - Train loss: 1.4868 | Acc@1: 79.8130 | Acc@5: 91.1656
[11-08 16:49:21] - Val   loss: 1.6291 | Acc@1: 76.0000 | Acc@5: 91.4660
[11-08 16:49:21] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [15:41,  2.66it/s, Acc@1=79.672, Acc@5=91.171, Loss=1.4893]
Epoch 90/90. validating: 101it [00:18,  5.49it/s, Acc@1=72.856, Acc@5=89.176, Loss=1.8935]
[11-08 17:05:21] - Train loss: 1.4881 | Acc@1: 79.7178 | Acc@5: 91.1625
[11-08 17:05:21] - Val   loss: 1.6291 | Acc@1: 76.0200 | Acc@5: 91.4800
[11-08 17:05:21] - Model params: 16.90M
[11-08 17:05:24] - Acc@1 76.020 Acc@5 91.480
[11-08 17:05:24] - Total time: 21h 55.8m

exp87
ArcFace. Работает сильно лучше exp88. см. exp89 для детального сравнения.

ArcFace (emb=256)
  head_width: 256 # originally in was 2560
  head_norm_act: none
Epoch 89/90. training: 2503it [15:49,  2.64it/s, Acc@1=79.805, Acc@5=91.182, Loss=1.4865]
Epoch 89/90. validating: 101it [00:18,  5.35it/s, Acc@1=79.172, Acc@5=93.776, Loss=1.3644]
[11-08 16:49:21] - Train loss: 1.4868 | Acc@1: 79.8130 | Acc@5: 91.1656
[11-08 16:49:21] - Val   loss: 1.6291 | Acc@1: 76.0000 | Acc@5: 91.4660
[11-08 16:49:21] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [15:41,  2.66it/s, Acc@1=79.672, Acc@5=91.171, Loss=1.4893]
Epoch 90/90. validating: 101it [00:18,  5.49it/s, Acc@1=72.856, Acc@5=89.176, Loss=1.8935]
[11-08 17:05:21] - Train loss: 1.4881 | Acc@1: 79.7178 | Acc@5: 91.1625
[11-08 17:05:21] - Val   loss: 1.6291 | Acc@1: 76.0200 | Acc@5: 91.4800
[11-08 17:05:21] - Model params: 16.90M
[11-08 17:05:24] - Acc@1 76.020 Acc@5 91.480
[11-08 17:05:24] - Total time: 21h 55.8m

exp89
Angular-Softmax. нужно сравнивать с exp76. по сравнению с ним, работает значительно лучше, всё из-за того, что сделано по уму. Работает примерно на том же уровне что и ArcFace, разница незначительна. как видно, сильно переобучается. Кажется, что дефолтный BNet с такой узкой головой бы гораздо сильнее просел по качеству. это идея для эксперимента но в будущем.

Angular Softmax
Epoch 89/90. training: 2503it [13:45,  3.03it/s, Acc@1=80.710, Acc@5=92.310, Loss=0.9378]
Epoch 89/90. validating: 101it [00:18,  5.37it/s, Acc@1=79.608, Acc@5=94.116, Loss=0.9038]
[11-08 12:49:55] - Train loss: 0.9377 | Acc@1: 80.7350 | Acc@5: 92.3072
[11-08 12:49:55] - Val   loss: 1.0862 | Acc@1: 76.0600 | Acc@5: 91.9060
[11-08 12:49:55] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:45,  3.03it/s, Acc@1=80.704, Acc@5=92.262, Loss=0.9386]
Epoch 90/90. validating: 101it [00:18,  5.54it/s, Acc@1=72.528, Acc@5=89.700, Loss=1.2685]
[11-08 13:03:59] - Train loss: 0.9382 | Acc@1: 80.7454 | Acc@5: 92.2795
[11-08 13:03:59] - Val   loss: 1.0862 | Acc@1: 76.0500 | Acc@5: 91.9120
[11-08 13:03:59] - Model params: 16.90M
[11-08 13:03:59] - Acc@1 76.050 Acc@5 91.912
[11-08 13:03:59] - Total time: 23h 41.4m

exp90
exp89 + cutmix. интуитивно кажется, что cutmix очень плохая аугментация для angular лоссов, потому что постоянно смешиваются случайные классы и на смешанных картинках сетка не может достичь низкого лосса ни при каком условии. но с другой стороны, who cares, буду смотреть на это как на очередную сильную регуляризацию.
Работает сильно лучше чем exp89. чуть хуже чем exp48, но нужно делать скидку на ширину головы (тут на 5М параметров меньше). Считаю эксперимент успешным

A-Softmax + cutmix
Epoch 89/90. training: 2503it [13:36,  3.07it/s, Acc@1=75.384, Acc@5=89.663, Loss=1.5914]
Epoch 89/90. validating: 101it [00:19,  5.27it/s, Acc@1=80.212, Acc@5=94.816, Loss=0.8513]
[11-10 06:58:55] - Train loss: 1.5841 | Acc@1: 75.4045 | Acc@5: 89.6570
[11-10 06:58:55] - Val   loss: 1.0250 | Acc@1: 76.8720 | Acc@5: 92.7460
[11-10 06:58:55] - Epoch 89: best loss improved from 1.0251 to 1.0250
[11-10 06:58:55] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:37,  3.06it/s, Acc@1=75.344, Acc@5=89.691, Loss=1.5897]
Epoch 90/90. validating: 101it [00:18,  5.40it/s, Acc@1=73.528, Acc@5=90.688, Loss=1.1986]
[11-10 07:12:51] - Train loss: 1.5928 | Acc@1: 75.2722 | Acc@5: 89.6274
[11-10 07:12:51] - Val   loss: 1.0251 | Acc@1: 76.8780 | Acc@5: 92.7480
[11-10 07:12:51] - Model params: 16.90M
[11-10 07:12:52] - Acc@1 76.878 Acc@5 92.748
[11-10 07:12:52] - Total time: 21h 17.3m

Запустил тот же конфиг но embedding_size = 128. интересно посмотреть, на сколько из-за этого упадёт качество (и упадёт ли вообще), кажется что с таким маленьким количеством классов, 256 может быть даже много.
Качество примерно такое же как и с 256, что значит что 256 не нужно.

A-Softmax + cutmix + emb 128
[11-11 05:31:53] - Epoch 89 | lr 4.58e-04
[11-11 05:45:47] - Train loss: 1.6215 | Acc@1: 75.0090 | Acc@5: 89.3813
[11-11 05:45:47] - Val   loss: 1.0377 | Acc@1: 76.7260 | Acc@5: 92.7180
[11-11 05:45:47] - Epoch 89: best loss improved from 1.0381 to 1.0377
[11-11 05:45:47] - Epoch 90 | lr 1.65e-04
[11-11 05:59:42] - Train loss: 1.6177 | Acc@1: 74.9387 | Acc@5: 89.3578
[11-11 05:59:42] - Val   loss: 1.0376 | Acc@1: 76.7260 | Acc@5: 92.7220
[11-11 05:59:42] - Epoch 90: best loss improved from 1.0377 to 1.0376
[11-11 05:59:42] - Model params: 16.64M
[11-11 05:59:43] - Acc@1 76.726 Acc@5 92.722
[11-11 05:59:43] - Total time: 21h 37.0m

Запустил с прям очень маленьким embedding = 64, падение по качеству очень маленькое

A-Softmax + cutmix + emb 64
[11-11 19:40:16] - Train loss: 1.6929 | Acc@1: 73.9992 | Acc@5: 88.5876
[11-11 19:40:16] - Val   loss: 1.0606 | Acc@1: 76.6880 | Acc@5: 92.3080
[11-11 19:40:16] - Epoch 89: best loss improved from 1.0610 to 1.0606
[11-11 19:40:16] - Epoch 90 | lr 1.65e-04
[11-11 19:56:14] - Train loss: 1.7164 | Acc@1: 73.8119 | Acc@5: 88.4599
[11-11 19:56:14] - Val   loss: 1.0606 | Acc@1: 76.6780 | Acc@5: 92.3100
[11-11 19:56:14] - Epoch 90: best loss improved from 1.0606 to 1.0606
[11-11 19:56:15] - Model params: 16.51M
[11-11 19:56:17] - Acc@1 76.678 Acc@5 92.310
[11-11 19:56:17] - Total time: 22h 46.8m

exp92
Arc - Softmax. Почти то же самое что Angular Softmax, но с - arccos ( cos (theta)), в теории должно лучше сходиться. Embedding - 256.т.к. значения arccos могут быть больше 1, уменьшил scale до 1 / 0.15 = 6.(6)

Arc Softmax
criterion_params: {temperature: 0.15}
[11-10 16:27:46] - Epoch 89 | lr 4.58e-04
[11-10 16:41:54] - Train loss: 1.8420 | Acc@1: 73.8341 | Acc@5: 87.5725
[11-10 16:41:54] - Val   loss: 1.1496 | Acc@1: 76.0900 | Acc@5: 91.1780
[11-10 16:41:54] - Epoch 89: best loss improved from 1.1502 to 1.1496
[11-10 16:41:54] - Epoch 90 | lr 1.65e-04
[11-10 16:57:49] - Train loss: 1.8384 | Acc@1: 73.6800 | Acc@5: 87.4934
[11-10 16:57:49] - Val   loss: 1.1495 | Acc@1: 76.0840 | Acc@5: 91.1800
[11-10 16:57:49] - Epoch 90: best loss improved from 1.1496 to 1.1495
[11-10 16:57:49] - Model params: 16.90M
[11-10 16:57:50] - Acc@1 76.084 Acc@5 91.180
[11-10 16:57:50] - Total time: 21h 14.1m
Arc Softmax + Embedding 64
Epoch 89/90. training: 2503it [13:46,  3.03it/s, Acc@1=73.310, Acc@5=87.166, Loss=1.8870]
Epoch 89/90. validating: 101it [00:18,  5.38it/s, Acc@1=79.532, Acc@5=93.512, Loss=0.9568]
[11-11 18:14:15] - Train loss: 1.8801 | Acc@1: 73.2704 | Acc@5: 87.0995
[11-11 18:14:15] - Val   loss: 1.1596 | Acc@1: 76.1140 | Acc@5: 90.9620
[11-11 18:14:15] - Epoch 89: best loss improved from 1.1600 to 1.1596
[11-11 18:14:15] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training: 2504it [13:45,  3.03it/s, Acc@1=73.519, Acc@5=87.253, Loss=1.8515]
Epoch 90/90. validating: 101it [00:18,  5.54it/s, Acc@1=72.708, Acc@5=88.412, Loss=1.3621]
[11-11 18:28:20] - Train loss: 1.8853 | Acc@1: 73.2185 | Acc@5: 87.0526
[11-11 18:28:20] - Val   loss: 1.1595 | Acc@1: 76.1060 | Acc@5: 90.9600
[11-11 18:28:20] - Epoch 90: best loss improved from 1.1596 to 1.1595
[11-11 18:28:20] - Model params: 16.51M
[11-11 18:28:20] - Acc@1 76.106 Acc@5 90.960
[11-11 18:28:20] - Total time: 21h 9.0m

exp93
Arc - Softmax + Angle Center loss. добавил член, который дополнительно штрафует за отклонение от центра. вес для нового лосса поставил 1. идея в явном уменьшении intra-class distance. Embedding 256. работает хуже чем без center loss. есть три возможные причины - 1) дольше сходится 2) слишком большой вес для доп. члена 3) нужно использовать идею из A Comprehensive Study on Center Loss for Deep Face Recognition и не штрафовать если расстояние меньше какого-то порога

Spoiler Template
[11-10 16:30:22] - Epoch 89 | lr 4.58e-04
[11-10 16:44:31] - Train loss: 2.3200 | Acc@1: 72.9741 | Acc@5: 86.7050
[11-10 16:44:31] - Val   loss: 1.4490 | Acc@1: 75.8240 | Acc@5: 90.3940
[11-10 16:44:31] - Epoch 89: best loss improved from 1.4494 to 1.4490
[11-10 16:44:32] - Epoch 90 | lr 1.65e-04
[11-10 16:58:40] - Train loss: 2.3336 | Acc@1: 72.9550 | Acc@5: 86.7019
[11-10 16:58:40] - Val   loss: 1.4488 | Acc@1: 75.8360 | Acc@5: 90.3840
[11-10 16:58:40] - Epoch 90: best loss improved from 1.4490 to 1.4488
[11-10 16:58:40] - Model params: 16.90M
[11-10 16:58:41] - Acc@1 75.836 Acc@5 90.384
[11-10 16:58:41] - Total time: 21h 15.2m

exp??

Spoiler Template
To be added
exp??
Spoiler Template
To be added

ИДЕИ

  • Уменьшить вес center loss члена в exp92
  • добавить margin к arc-softmax и arc-softmax-center
  • попробовать сумму a-softmax и arc-softmax. идея что первый лучше оптимизирует в начале, а второй в конце

@bonlime
Copy link
Owner Author

bonlime commented Dec 22, 2020

Spoiler Template
To be added

Новый цикл экспериментов, цель - выяснить как использовать Novograd и затестить одну новую аугу от Ильи

exp97
бейзлайн. интересно сколько может выдать дубовый R50, если поучить его подольше и с большим количеством регуляризаций. шедулинг cycle cosine, скорее всего один длинный cosine будет работать примерно так же, но мне хочется именно cycle.

в итоге регуляризации сработали хорошо - сеть очень далеко от оверфита, который наблюдается при обучении бейзлайна. из минусов - во время одной из смены lr поскольку не было warmup, точность сильно упала и так и не восстановилась до конца, поэтому результаты такие же как если бы учил 90 эпох :c

R50 + reg + long training
# default ResNet50 with almost all possible augmentations and regularizations + trained for very long time
# the idea is to check the best obtainable quality 
# config is tuned for 2 GPUs

name : exp97.R50_hard_reg_base
arch : resnet50
model_params : 
drop_rate: 0.2
drop_connect_rate: 0.2

weight_decay : 3e-5
cutmix : 1.0
smooth: True
ctwist : True
blur: true
crop_method: full
ema_decay: 0.9997 # using EMA instead of Lookahead

phases : [
{"ep": 0, "sz": 224, "bs": 256},
{"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},
{"ep": [8, 100], "lr": [0.2, 0], "mode": "cos"},
{"ep": [100, 150], "lr": [0.02, 0], "mode": "cos"},
{"ep": [150, 200], "lr": [0.02, 0], "mode": "cos"},
]

Epoch 199/200. training: 2503it [18:52,  2.21it/s, Acc@1=71.435, Acc@5=88.727, Loss=2.4223]
Epoch 199/200. validating: 101it [00:31,  3.25it/s, Acc@1=80.668, Acc@5=95.276, Loss=1.6923]
[12-25 01:48:19] - Train loss: 2.4181 | Acc@1: 71.5346 | Acc@5: 88.7588
[12-25 01:48:19] - Val   loss: 1.8230 | Acc@1: 77.4420 | Acc@5: 93.6340
[12-25 01:48:19] - Epoch 199: best loss improved from 1.8231 to 1.8230
[12-25 01:48:19] - Epoch 200 | lr 4.44e-05
Epoch 200/200. training: 2503it [18:35,  2.24it/s, Acc@1=70.987, Acc@5=88.445, Loss=2.4524]
Epoch 200/200. validating: 101it [00:29,  3.44it/s, Acc@1=74.192, Acc@5=92.016, Loss=1.9542]
[12-25 02:07:24] - Train loss: 2.4373 | Acc@1: 71.2615 | Acc@5: 88.5853
[12-25 02:07:24] - Val   loss: 1.8235 | Acc@1: 77.4360 | Acc@5: 93.6420
[12-25 02:07:24] - Model params: 25.56M
[12-25 02:07:26] - Acc@1 77.436 Acc@5 93.642
[12-25 02:07:26] - Total time: 60h 41.9m

exp98
Прежде чем пробовать Novograd, интересно что будет если очень сильно поднять WD (тут он в 40 раз выше чем в exp97). ожидаю, что будет учиться медленнее, но в итоге качество выйдет выше, потому что с такой регуляризацией оно не сможет оверфитнуться.

как и выше, из-за отсутствия warmup в какой-то момент лосс сильно скакнул и не восстановился. в конце качество чуть хуже чем в exp97, НО performance gap между вал и трейном выше. поэтому если бы я тюнил условные 500 эпох, этот вариант почти наверняка был бы лучше. да и в целом тот факт что оно нормально обучается с таким большим wd это классно

R50 + high WD
# same as 97 but wd increased to 0.002

name : exp98.R50_hard_reg_base_high_wd
arch : resnet50
model_params : 
drop_rate: 0.2
drop_connect_rate: 0.2

cutmix : 1.0
smooth: True
ctwist : True
blur: true
crop_method: full
ema_decay: 0.9997 # using EMA instead of Lookahead

weight_decay : 0.002 # 40x times higher than in exp97
optim: fused_sgd
optim_params: # want SGDW behaviour
wd_after_momentum: True

phases : [
{"ep": 0, "sz": 224, "bs": 256},
{"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},
{"ep": [8, 100], "lr": [0.2, 0], "mode": "cos"},
{"ep": [100, 150], "lr": [0.02, 0], "mode": "cos"},
{"ep": [150, 200], "lr": [0.02, 0], "mode": "cos"},ц
]

Epoch 199/200. training: 2503it [18:48,  2.22it/s, Acc@1=68.633, Acc@5=87.144, Loss=2.5238]
Epoch 199/200. validating: 101it [00:25,  3.98it/s, Acc@1=80.024, Acc@5=95.192, Loss=1.7061]
[12-25 01:54:34] - Train loss: 2.5360 | Acc@1: 68.4841 | Acc@5: 87.0170
[12-25 01:54:34] - Val   loss: 1.8344 | Acc@1: 76.8020 | Acc@5: 93.5640
[12-25 01:54:34] - Epoch 200 | lr 4.44e-05
Epoch 200/200. training: 2503it [18:23,  2.27it/s, Acc@1=68.604, Acc@5=86.993, Loss=2.5429]
Epoch 200/200. validating: 101it [00:25,  3.99it/s, Acc@1=73.604, Acc@5=91.932, Loss=1.9628]
[12-25 02:13:25] - Train loss: 2.5357 | Acc@1: 68.6075 | Acc@5: 87.0516
[12-25 02:13:25] - Val   loss: 1.8346 | Acc@1: 76.7940 | Acc@5: 93.5580
[12-25 02:13:25] - Model params: 25.56M
[12-25 02:13:26] - Acc@1 76.794 Acc@5 93.558
[12-25 02:13:26] - Total time: 60h 33.8m

exp99
решил вернуться к adacos, но в этот раз добавил еще и margin. результаты интересные. 1) очень хорошо работает, близко к exp48, но тут на 5М параметров меньше 2) adaptive часть adacos вообще не работает. почему-то с margin B batch (мера inter class distance) постоянно очень высокая и не собирается падать, чтобы лосс вообще работал, пришлось ограничить макс. S фиксированным числом, иначе не сходилось. пока не могу понять в чём проблема. в самом ли лоссе или в моей реализации
Adacos + margin

Adacos + margin (0.2)
  head_width: 128 # need much smaller for angular losses 2560
  # in exp.99 realized that we may need a better head! need to investigate this moment
  head_type: default
  head_norm_act: none # only for exp87
criterion: adacos
criterion_params:
  margin: 0.2


Epoch 89/90. validating: 101it [00:17, 5.90it/s, Acc@1=80.472, Acc@5=93.880, Loss=2.1644]
[12-26 12:20:29] - Train loss: 2.8462 | Acc@1: 76.3154 | Acc@5: 88.7966
[12-26 12:20:29] - Val   loss: 2.5252 | Acc@1: 77.0280 | Acc@5: 91.9380
[12-26 12:20:29] - Epoch 89: best loss improved from 2.5254 to 2.5252
[12-26 12:20:29] - Epoch 90 | lr 1.65e-04
Epoch 90/90. training:  16% 396/2503 [02:27<14:10,  2.48it/s, Acc@1=78.621, Acc@5=90.703, Loss=2.5073][12-26 12:22:58] -
Running B: 188609.11. Running theta: 0.76. Running S: 20.00
Epoch 90/90. training:  56% 1396/2503 [08:53<07:04,  2.61it/s, Acc@1=74.321, Acc@5=87.376, Loss=3.0162][12-26 12:29:23] -
Running B: 200736.11. Running theta: 0.75. Running S: 20.00
Epoch 90/90. training:  96% 2396/2503 [15:18<00:41,  2.60it/s, Acc@1=76.157, Acc@5=89.091, Loss=2.6989][12-26 12:35:48] -
Running B: 172138.70. Running theta: 0.76. Running S: 20.00
Epoch 90/90. training: 2504it [15:58,  2.61it/s, Acc@1=76.454, Acc@5=88.870, Loss=2.8326]
Epoch 90/90. validating: 101it [00:19,  5.11it/s, Acc@1=73.616, Acc@5=90.004, Loss=2.8854]
[12-26 12:36:48] - Train loss: 2.8434 | Acc@1: 76.4061 | Acc@5: 88.8176
[12-26 12:36:48] - Val   loss: 2.5252 | Acc@1: 77.0420 | Acc@5: 91.9400
[12-26 12:36:48] - Model params: 16.64M
[12-26 12:36:49] - Acc@1 77.042 Acc@5 91.940
[12-26 12:36:49] - Total time: 25h 45.0m

exp100 (юху!)
В моей модели последние слои выглядят так:
conv1x1 -> norm (no act) -> GAP <== this is already an embedding
есть два альтернативных варианта:
GAP -> FC -> norm <== this is an embedding - Mobilenet v3 head + norm (exp100)
GAP -> FC <== this is an embedding - Mobilenet v3 head original (exp101)

exp101 почему-то завис на 70й эпохе, поэтому финальных результатов по нему нет, но по сравнению с exp100 работало чуть хуже. Уже после конца эксперимента задумался, что может нужно ставить affine=False в голове

upd. решил посмотрть как делать другие. У Ильи идет GAP -> FC -> BatchNorm d1, говорит что так работает лучше чем без norm.
в MoCo v1 берут тупо выход FC, в MoCov2 добавляют 2 layer MLP: FC - ReLU - FC (hidden size 2048 - как ширина последнего слоя в resnet) и это им очень сильно докидывает по качеству. это хоть и добавляет 4М лишних параметов, во время валидации они выкидвают этот MLP и смотрят только на projection (в терминах BYOL projection это выход послденго FC, а prediction это FC + MLP, prediction нужен, чтобы для лосса делать эмбеддинги поближе, моё интуитивное понимание, что без prediction, часть параметров основной сети занимается как раз вот этим матчингом предикшнов, чего нам не очень хочется).

в BYOL делают очень похоже на MoCov2 с двумя отличиями - hidden size 4096 (в два раза жирнее, но опять таки он не используется во время валидации) и MLP: FC - BN - ReLU - FC. в untitled blog пишут что BN критически важен и без него не будет работать, потому что он делает не явный contrastive

Adacos Margin + Mobilnet head
[12-28 08:01:31] - Epoch 90 | lr 1.65e-04
[12-28 08:17:23] - Running B: 208025.92. Running theta: 0.73. Running S: 20.00
Epoch 90/90. training: 2504it [16:33,  2.52it/s, Acc@1=76.567, Acc@5=88.957, Loss=2.8292]
Epoch 90/90. validating: 101it [00:21,  4.70it/s, Acc@1=73.204, Acc@5=89.464, Loss=2.8979]
[12-28 08:18:26] - Train loss: 2.8405 | Acc@1: 76.4747 | Acc@5: 88.8893
[12-28 08:18:26] - Val   loss: 2.5298 | Acc@1: 76.7200 | Acc@5: 91.7740
[12-28 08:18:26] - Epoch 90: best loss improved from 2.5308 to 2.5298
[12-28 08:18:27] - Model params: 16.64M
[12-28 08:18:28] - Acc@1 76.720 Acc@5 91.774
[12-28 08:18:28] - Total time: 24h 41.6m

exp102

  • MLP in head which is only active during training. Idea is to add parameters which help training
    but don't slowdown inference
    Head looks like:
    In train: conv1x1 (1024, 256) -> GAP -> FC (256 -> 4096) -> BN -> ReLU -> FC (4096, 256) <= embedding
    In val: conv1x1 (1024, 256) -> GAP <= embedding
    I'm not sure this would work but still want to try
    в итоге оно учится, но очевидно что на валидации даёт фигню, потому что центры классов до и после доп.головы не совпадают. возможно если доучить и потом построить центры классов как центры для train примеров это будет работать, но сейчас нет желания этим заниматься

exp103

  • MLP head after GAP: conv1x1 -> GAP -> BN -> Act -> FC
MLP head after GAP
  head_type: mlp_bn_fc # conv1x1 -> GAP -> BN -> Act -> FC
  head_norm_act: swish_hard # hswish to avoid loss of information
criterion: a-softmax
criterion_params:
  temperature: 0.1 # scale is inside CCE
[12-29 16:00:31] - Epoch 90 | lr 1.65e-04
[12-29 16:17:56] - Train loss: 1.6111 | Acc@1: 75.1764 | Acc@5: 89.5536
[12-29 16:17:56] - Val   loss: 1.0210 | Acc@1: 77.0500 | Acc@5: 92.8080
[12-29 16:17:56] - Epoch 90: best loss improved from 1.0211 to 1.0210
[12-29 16:17:57] - Model params: 17.95M
[12-29 16:17:58] - Acc@1 77.050 Acc@5 92.808
[12-29 16:17:58] - Total time: 25h 30.2m

exp104

  • MLP head after GAP, diffent from 103 because there is final norm: conv1x1 -> GAP -> BN -> Act -> FC -> BN

по итогу exp104 работает чуть лучше чем exp103, на нём и остановимся, но достоверность результатов низкая

MLP with final norm
  head_type: mlp_bn_fc_bn # conv1x1 -> GAP -> BN -> Act -> FC -> BN
  head_norm_act: swish_hard # hswish to avoid loss of information

criterion: a-softmax
criterion_params:
  temperature: 0.1 # scale is inside CCE

[12-29 18:37:32] - Epoch 90 | lr 1.65e-04
[12-29 18:56:09] - Train loss: 1.6170 | Acc@1: 74.9274 | Acc@5: 89.4424
[12-29 18:56:09] - Val   loss: 1.0226 | Acc@1: 76.9440 | Acc@5: 92.7260
[12-29 18:56:09] - Model params: 17.95M
[12-29 18:56:10] - Acc@1 76.944 Acc@5 92.726
[12-29 18:56:10] - Total time: 27h 14.7m

exp105
no norm in head: conv1x1 -> GAP
train loss чуть выше, val loss чуть ниже (после 50и эпох) чем в exp103, но буквально чуть-чуть. но стоит учесть что параметров тут тоже на 2М меньше, поэтому возможно что результат значимый

Default no norm
head_type: default_nonorm # conv1x1 -> GAP
  head_norm_act: none # not used with default_nonorm head

criterion: a-softmax
criterion_params:
  temperature: 0.1 # scale is inside CCE

[12-30 21:08:40] - Epoch 47 | lr 1.13e-01
[12-30 21:23:57] - Train loss: 2.2654 | Acc@1: 60.5302 | Acc@5: 80.8098
[12-30 21:23:57] - Val   loss: 1.1509 | Acc@1: 73.6520 | Acc@5: 91.2900

exp106
его почему-то нет

exp107

Spoiler Template
To be added

exp108
R50 (resnet50) Hard Red - похож на 97, попытка поучить R50 подольше с бОльшим количеством регуляризаций
Опять накосячил со scheduler, warmup в середине не сработал, качество сильно упало на 90-95 эпохе и вернулось к тем же значениям только к ~115 эпохе. регуляризации помогают, сетка гораздо меньше оверфитится

R50 Hard Reg Base
arch : resnet50
model_params : 
drop_rate: 0.1
drop_connect_rate: 0.1

weight_decay : 3e-5
cutmix : 1.0
smooth: True
ctwist : True
blur: true
crop_method: full
ema_decay: 0.9993 # using EMA instead of Lookahead

phases : [
{"ep": 0, "sz": 224, "bs": 256},
{"ep": [0, 8], "lr": [0, 0.2], "mom": 0.9},
{"ep": [8, 90], "lr": [0.2, 0], "mode": "cos"},
# {"ep": [90, 95], "lr": [0.02, 0]}, - училось вот с таким вариантом
{"ep": [90, 95], "lr": [0, 0.02]},
{"ep": [95, 120], "lr": [0.02, 0], "mode": "cos"},
]

[01-11 17:06:04] - Epoch 90 | lr 1.65e-04
[01-11 17:22:04] - Train loss: 2.4435 | Acc@1: 70.6287 | Acc@5: 88.2824
[01-11 17:22:04] - Val   loss: 1.8560 | Acc@1: 76.6160 | Acc@5: 93.3100

[01-12 01:07:32] - Epoch 120 | lr 1.77e-04
[01-12 01:23:35] - Train loss: 2.3915 | Acc@1: 72.2584 | Acc@5: 89.2017
[01-12 01:23:35] - Val   loss: 1.8399 | Acc@1: 76.8520 | Acc@5: 93.4540
[01-12 01:23:35] - Model params: 25.56M
[01-12 01:23:35] - Acc@1 76.852 Acc@5 93.454
[01-12 01:23:35] - Total time: 32h 12.1m

exp109
R50 + Hard Reg + SE-var3 attention (GAP -> conv1x1 -> sigmoid)
Тут заметно больше параметров, потому что в SE reduction не 4 как я думал, а 8 (!), поэтому если в SE ~3M доп. параметров, то тут ~24M
Сетка сильнее оверфитится, но не сильно лучше работает, не понимаю в чём дело. по качеству даже хуже чем SE что прям странно

R50 + Hard Reg + SE-var3
[01-11 20:37:12] - Epoch 90 | lr 1.65e-04
[01-11 20:55:29] - Train loss: 2.3783 | Acc@1: 73.2948 | Acc@5: 89.6698
[01-11 20:55:29] - Val   loss: 1.8296 | Acc@1: 77.0880 | Acc@5: 93.6420

[01-12 05:45:09] - Epoch 120 | lr 1.77e-04
[01-12 06:03:19] - Train loss: 2.3068 | Acc@1: 75.0707 | Acc@5: 90.5739
[01-12 06:03:19] - Val   loss: 1.8200 | Acc@1: 77.4600 | Acc@5: 93.6720
[01-12 06:03:19] - Model params: 45.69M
[01-12 06:03:19] - Acc@1 77.460 Acc@5 93.672
[01-12 06:03:19] - Total time: 36h 42.2m

exp110
R50 + Hard Reg + SE
всего 3М лишних параметров, а работает заметно лучше чем SE-var3. очень странно ((

R50 + Hard Reg + SE
Для сравнения с exp111 & exp112 прикладываю результаты после 90 эпох
[01-11 23:33:45] - Epoch 90 | lr 1.65e-04
[01-11 23:51:53] - Train loss: 2.3715 | Acc@1: 72.9695 | Acc@5: 89.6153
[01-11 23:51:53] - Val   loss: 1.8135 | Acc@1: 77.5260 | Acc@5: 93.7700

[01-12 09:03:05] - Epoch 120 | lr 1.77e-04
[01-12 09:23:29] - Train loss: 2.3132 | Acc@1: 74.5208 | Acc@5: 90.4480
[01-12 09:23:29] - Val   loss: 1.8006 | Acc@1: 77.8480 | Acc@5: 94.0400
[01-12 09:23:29] - Model params: 28.09M
[01-12 09:23:29] - Acc@1 77.848 Acc@5 94.040
[01-12 09:23:29] - Total time: 39h 59.2m

exp111
R50 + Hard Reg + ECA
хотя конфиг и на 120 эпох, но я учил только 90, потому что нужно было ребутнуть сервак

R50 + Hard Reg + ECA
[01-13 14:38:27] - Epoch 90 | lr 1.65e-04
[01-13 14:56:35] - Train loss: 2.3476 | Acc@1: 73.0016 | Acc@5: 89.5411
[01-13 14:56:35] - Val   loss: 1.7983 | Acc@1: 77.6180 | Acc@5: 93.9180

exp112
R50 + Hard Reg + ECA (with kernel size=9) это не должно влиять на скорость инференса, но может дать лучше качество за счёт крошечного количества параметров. качество по итогу не лучше. random seed ли это? хз. но лучше не пытать судьбу

R50 + Hard Reg + ECA (with kernel size=9)
[01-14 12:54:45] - Epoch 91 | lr 1.83e-05
[01-14 13:12:52] - Train loss: 2.3598 | Acc@1: 72.8702 | Acc@5: 89.4777
[01-14 13:12:52] - Val   loss: 1.8029 | Acc@1: 77.4080 | Acc@5: 93.8320

Выводы после серии экспериментов 108-112:

Лучше всего работает ECA (но честно говоря я до сих пор не понимю почему). SE близко, но сильнее оверфитит. SE-var3 не смотря на всю заманчивость идеи оказался нерабочим (

exp113
нашел новый вариант attention - FCANet (обзор статьи выше). сначала реализовал с багом, поэтому пришлось перезапускать дважды. Результаты ниже чуть хуже чем SE что противоречит статье. еще раз внимательно посмотрел на их код, они используют Global Sum вместо Global Mean, возможно поэтому у них лучше, нужно будет это проверить

R50 + Hard Reg + FCA
[01-22 17:04:23] - Epoch 90 | lr 1.65e-04                                                  
[01-22 17:23:27] - Train loss: 2.3781 | Acc@1: 72.7870 | Acc@5: 89.5151                     
[01-22 17:23:27] - Val   loss: 1.8219 | Acc@1: 77.3680 | Acc@5: 93.7620                    

[01-23 02:43:26] - Epoch 120 | lr 1.77e-04
[01-23 03:02:29] - Train loss: 2.3156 | Acc@1: 74.3831 | Acc@5: 90.3479
[01-23 03:02:29] - Val   loss: 1.8119 | Acc@1: 77.6780 | Acc@5: 93.8120
[01-23 03:02:30] - Model params: 28.09M
[01-23 03:02:30] - Acc@1 77.678 Acc@5 93.812
[01-23 03:02:30] - Total time: 41h 22.7m

exp114

Spoiler Template
To be added

exp115

Spoiler Template
To be added

@zakajd
Copy link
Collaborator

zakajd commented Dec 24, 2020

Перенос обзора статей из репозитория по HUAWEI DIGIX Contest

  1. 1st Place Solution to Google Landmark Retrieval 2020
  • Used GAP after extractor model
  • Reduced feature dimension to 512
  • Applied cosine softmax to classify a number of classes, scale value was automatically determined by fixed adacos. Margin value was set to 0
  • weighted CE to deal with imbalanced classes,
  • Progressive increase in image sizes reliably boosted scores

Screenshot 2020-09-10 at 02 33 48

Note: In Google Landmarks task was only to generate good features. No post-processing was allowed, so it's not covered here.

  1. 2nd Place Solution to Google Landmark Retrieval Competition 2020
  • Used concatenation of features from 2 models as an ensembling technique
  • arcmargin loss
  • Progressive resize

image

  1. 3rd Place Solution to “Google Landmark Retrieval 2020”
  • Post- processing methods: DBA [1] , QE [12] and re-rank.
  • Used Corner-Cutmix. Reasoning:
    1. Important features are often in the centre, so don't want to cover it.
    2. Networks learns to look at image in different scales, which is useful for real-life scenarios

image

  1. Triplet loss
    Often mentioned in earlier papers.
    Takes a triplet (baseline (anchor) input, positive (truthy) input and a negative (falsy) input). Tries to make embeddings for simmilar object close to each other and for not-simmilar further. Distance is Euclidian.

image

  1. Fine-tuning CNN Image Retrieval with No Human Annotation 2018
    Introduced Generalized Mean Pooling (GeM)
  • Fine-tuning models trained on ImageNet on query data boosts performance
  • Learning the whitening through the training data works better, than performing it on short representations But it's slower
  • Hard-positive mining could boost performance and is unresearched area of study. Hard-negative mining is a standard process [6], [16]
  • Typical architectures for metric learning: two-branch siamese [39], [40], [41] and triplet networks [42], [43], [44]. They employ matching and non-matching pairs to perform the training.
  • Last layer in CNN should be ReLU, so that all features are non-negative
  • GeM is the same thing as LPPooling with L2 normalization afterwards. GeM power parameter is learned, but in practice close to 3.
  • Contrastive loss generalizes better and converges at higher performance than the triplet loss (see formula below)

image

This part I didn't fully understand, so will leave here for the future

It has recently become a standard policy to combine CNN global image descriptors with simple average query expansion (AQE) [10], [11], [12], [27]. An initial query is issued by Euclidean search and AQE acts on the top-ranked nQE images by average pooling of their descriptors. Herein, we argue that tuning nQE to work well across different datasets is not easy. AQE corresponds to a weighted average where nQE descriptors have unit weight and all the rest zero. We generalize this scheme and we propose performing weighted averaging, where the weight of the i-th ranked image is given by (f(q)^T f (i))^\alpha . The similarity of each retrieved image matters. We show in our experiments that AQE is difficult to tune for datasets of different statistics, while this is not the case with the proposed approach. We refer to this approach as α-weighted query expansion (αQE). The proposed αQE reduces to AQE for α = 0.

  1. Three things everyone should know to improve object retrieval

using a square root (Hellinger) kernel instead of the standard Euclidean dis- tance to measure the similarity between SIFT descriptors leads to a dramatic performance boost

  1. [Two-stage Discriminative Re-ranking for Large-scale Landmark Retrieval]
    (https://arxiv.org/pdf/2003.11211.pdf)
    Another paper with
    Code: https://github.com/lyakaap/Landmark2019-1st-and-3rd-Place-Solution
    This is winning solution of Google Landmark Retrieval Challenge 2019
  • GeM for pooling

  • Feature size: 512

  • Training with "soft" augs first, then with "hard"

  • Split images by aspect ration to avoid strong resize distortions

  • Bigger images at the end

  • Concat different models descriptors into single vector (512 * 6 = 3072)

  • TTA: Scale factors, desciptors are then averaged.
    - Scales: [1 / 2 ** (1 / 2), 1.0, 2 ** (1 / 2)]

  • Similarity search: brute-force euclidean search with L2-normalized descriptors

  • Re-ranking:

    1. AQE - average embeddings of top-ranked images retrieved by an initial query, and use the averaged embedding as a new query.
    2. alpha QE - weighted average of descriptors of top-ranked images. Heavier weights are put on as the rank gets higher.

Cosine softmax losses impose L2-constraint to the features which restricts them to lie on a hypersphere of a fixed radius

Didn't understand:

  • Discriminative Re-ranking
  • Soft-voting with spatial verification

WHAT IS THE BEST PRACTICE FOR CNNS APPLIED TO VISUAL INSTANCE RETRIEVAL?
Paper from 2016 containing distilled wisdom from ancient times.

  • Use feature maps after the non-linear activations (ReLU) so that the elements in each feature map are all non-negative.

In our multi-scale approach, the regional vectors from each scale are simply added together and l2-normalized to form the scale-level feature vectors. This works better than concatenating them to form long vector

  1. CosFace: Large Margin Cosine Loss for Deep Face Recognition 2018
    LMCL loss

image

  1. ArcFace: Additive Angular Margin Loss for Deep Face Recognition 2019
    Very similar to CosFace and experiments are not very convincing. So it makes sence to always try both.

image

After the last convolutional layer, we explore the BN [14]-Dropout [31]-FC-BN structure to get the final 512-D embedding feature.

Here is good illustration how all this works (taken from Subcenter ArcFace page)
subcenterarcfaceframework

How to initialise weights in ArcFace / CosFace loss?

We found that initializing the softmax classifier weight with normal distribution std=0.001 generally leads to better performance. It is also important to use larger learning rate for the classifier if underlying CNN is already pretrained.

In code from last year winners used xavier_uniform_

Metrics:
Acc@1
mAP@10

Cumulative Matching Characteristics (CMC) are not defined in case of multi-gallery-shot (multiple correct answers for one image). I'll do same as in Market-1501 dataset: find position of the first correct image and ignore everything else.
image

  1. Image Retrieval Based on Learning to Rank and Multiple Loss
  • Query Expansion can drastically boost performance. AQE and alphaQE are analyzed and later shows better and more stable results. alpha=5, nQE=50. Discriptors for all those images are summed and renormalized and used in a new search.
  • Model architecture: Remove last pooling and Fully Connected layers. Add GeM pooling, Lw whitening (didn't understand) and L2 regularisation.
  • Multi-scale evaluation at test time. Resize images, collect features and sum them (or concatenate?)
  1. 6th Place Solution Google Landmark Retrieval Challenge 2018

Our network consists of the convolutional layers of ResNet101 pre-trained on ImageNet, followed by generalized-mean pooling (GeM), l2 normalization, a fully-connected (FC) layer, and a final l2 normalization.

I liked how strongly diffusion boosted their scores on both public / private datasets. Definitely a thing to try in the future.

We use diffusion, a graph-based query expansion technique, to perform retrieval. We initially construct an affinity matrix with reciprocal k-nearest neighbors (k=50), and then initiate diffusion by the 5 Euclidean nearest neighbors of the query descriptor.

  1. 1st Place Solution Google Landmark Retrieval Challenge 2018

In the MAC architecture, the last convolutional layer of ResNeXt is followed by a max-pooling layer, L2-normalization layer and PCA+Whitening layer.

https://github.com/facebookresearch/faiss
Library for efficient search in large vector spaces. May be not relevant now, but would definitely help if number of vectors were much bigger.

  1. Landmark Retrieval via Local Guidance and Global Expansion

The pipeline of our image retrieval system is illustrated in Fig. 1. It consists of five key steps: (1) Deep local feature (DELF) search. (2) Sptatial verification (RANSAC) on top-100 results of (1). (3) Deep image retrieval (DIR) search with database-side feature augmentation (DBA). (4) Query expansion with top-5 results of (3) and the results of (2) with inlier > 40. (5) Re-ranking by regional diffusion. In the next sections, we go over the details of the different components of our pipeline, and also explain how they tie together.

One more iteration of paper readings.
14. A Metric Learning Reality Check

The trunk model is an ImageNet pretrained BN-Inception network, with output embedding size of 128. BatchNorm parameters are frozen during training, to reduce overfitting.

  • Embeddings are L2 normalized before computing the loss, and during evaluation.
  • Use MAP@R metric and show it to correlate with performance better, than other methods.
  • Training and validation sets are always class-disjoint, so optimizing for validation set performance should be a good proxy for accuracy on open-set tasks.
  • ArcFace is best on 2 datasets and almost the best on another. See table

image

Optimal parameters for different datasets. Margin is 20-40x bigger, than what is used in my experiments.
image

Batch normalization layer is vital just before the L2-normalized features multiplication by the weights. It is indeed mentioned in the original article, but I didn't pay attention at first, and ArcFace started working for me only after I added it.

  1. A Benchmark on Tricks for Large-scale Image Retrieval
  • Train datasetwas noisy, so used DBSCAN for filtering. Trained model with some decent performance, then for each class clustered all images and took biggest group, discarding all others. Used this data for training.
  • Another approach is to cluster all test data, assign synthetic group labels and use this data jointly with train. Slightly boosts performance due to large number of image noise.
  • The PCA/Whitening improved mAP a bit more when the output dimension was set to 1024.
  • Extracting features from image with different scale (1, sqrt(2), 1/sqrt(2)) helps improve performance. They can be combined by concatenation + L2 norm, sum-aggragation + L2 norm and used individually with results for different scales combined at rank predictions.

Here is a long list of papers I didn't have time to read / implement:

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

2 participants