maxfashko 5 Report post Posted June 6, 2016 Приветствую! Расскажу немного о своих трудностях, с которыми я столкнулся при обучении данной сетки: На Tesla m40 пример, приведенный в туториале обучается очень здорово и шустро - все ок! Когда же пытаемся всунуть сетке свои размеченные изображения - F0606 19:20:16.349822 2152 math_functions.cu:123] Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0) CUBLAS_STATUS_MAPPING_ERROR Уперся в стену с созданием файлов "png" аннотации-масок. Как я понимаю обычное RGB изображение "png" нам необходимо перекодировать в градации серого + какой-то режим типо HSV. Предварительно его раскрасив необходимыми цветами: 64 128 64 Animal 192 0 128 Archway 0 128 192 Bicyclist 0 128 64 Bridge 128 0 0 Building 64 0 128 Car 64 0 192 CartLuggagePram 192 128 64 Child 192 192 128 Column_Pole 64 64 128 Fence 128 0 192 LaneMkgsDriv 192 0 64 LaneMkgsNonDriv 128 128 64 Misc_Text 192 0 192 MotorcycleScooter 128 64 64 OtherMoving 64 192 128 ParkingBlock ... 0 0 0 Void Но как бы не пытался я это сделать в Photoshop, у меня не выходит. Сеть не хочет это кушать. Единственное решение, которое может создавать файлы масок-аннотаций - https://github.com/kyamagu/js-segment-annotator После этой тулзы сеть съедает файлы "png" и обучается. Но проблема в том, что мне не нужно размечать данные вручную. У меня уже имеются "вырезанные" файлы. Мне остается только наложить "вырезанные" поверх "исходных" jpg и залить цветами. Но как конвертировать в цвета, которые сеть будет воспринимать и обучаться? RGB разных цветов - отказ Градации серого 25% - отказ Индексированные цвета (3 цвета) - отказ Еще нашел вот такой скрипт, который вроде как должен решить мою проблему, но сеть тоже не ест файлы, которые выходят после скрипта. (Более того, сеть даже не ест файлы аннотации из "родного" датасета CamVid, если ее прогнать через данный скрипт) Как мне это победить? gray.py Share this post Link to post Share on other sites
mrgloom 242 Report post Posted June 7, 2016 Там маски это просто одноканальные png в которых цифры {0,1,...N} поэтому они смотрятся почти черными. 1 Share this post Link to post Share on other sites
maxfashko 5 Report post Posted June 7, 2016 Спасибо! Именно это помогло! Кому нужно - в репозитории имеется около 3к идеально размеченных автоматом данных (больший объем пока не делал) А что с настройками обучения? Оставить все по дефолту? 40к итераций хватит? если у меня будет 10-30к изображений для тренировки? Как выявить наилучший результат при тренировке? https://github.com/Maxfashko/CamVid 2 Share this post Link to post Share on other sites
mrgloom 242 Report post Posted June 8, 2016 Можете сначала попробовать по дефолту или оставить только один encode-decode слой как у меня в примере. Попробую прогнать на ваших данных. Share this post Link to post Share on other sites
maxfashko 5 Report post Posted June 9, 2016 После 10к итераций результат не улучшился, значит ли это, что обучение можно останавливать? Я понимаю так, что меня должны интересовать следующие строки: rain net output #0: accuracy = 0.987271 Train net output #2: per_class_accuracy = 0.967589 Train net output #6: per_class_accuracy = 0.987386 Iteration 40580, loss = 0.0586965 И если показатели хорошие, то останавливать обучение? Share this post Link to post Share on other sites
mrgloom 242 Report post Posted June 9, 2016 Да по сути вас интересуют accuracy и per_class_accuracy и если значения вас устраивают, то можно остановить нажав ctrl+c, по идее потом можно будет продолжить обучение если потребуется имея snapshot весов и solverstate. P.S. у вас 12 классов? или 2 класса и вы не редактировали prototxt? P.P.S вы просматриваете лог с удаленного сервера через ssh на android? Share this post Link to post Share on other sites
maxfashko 5 Report post Posted June 9, 2016 У меня действительно всего 2 класса, ptototxt я не редактировал. Когда запустил обучение поздно обнаружил, что неверно указал лог, и обучение не фиксировалось в логе. По этому я просматриваю не log а подключаясь к кластеру через screen чтобы посмотреть что там творится. Из-за того, что не отредактировал prototxt все обучение на смарку? Share this post Link to post Share on other sites
mrgloom 242 Report post Posted June 9, 2016 Может и нет, т.к. у всех остальных accuracy 1, т.к. они никогда не встречаются. Share this post Link to post Share on other sites
Smorodov 579 Report post Posted June 9, 2016 Лучше переучить. Иначе могут разные неожиданности получаться. Share this post Link to post Share on other sites
maxfashko 5 Report post Posted June 9, 2016 А каким-нибудь образом можно получить кривую зависимостей loss и accuracy имея только обученную модель, но не имея лога? Сейчас переучить не получиться - кластер с м40-вой только на 2 дня погонять давали. В общем обучение можно считать проваленным: При конвертации размеченных цветами аннотированных изображений в {0,1}, в алгоритм закралась ошибка. Какая-то часть данных была размечена как 1- объект 0-фон, а другая чать как 0-объект, 1-фон. Этим объясняется странное поведение при тренировке: две итерации могли идти с точностью в 0.95, а следующие за ней десять итераций, как 0.20, и так до 40000 итерации. Бедняга, все не могла понять, что же от нее хотят Share this post Link to post Share on other sites
Smorodov 579 Report post Posted June 10, 2016 Результат разметки (цвет) напомнил результаты выдаваемые этой прогой: http://www.robots.ox.ac.uk/~szheng/crfasrnndemo стандарт ? GitHub: https://github.com/torrvision/crfasrnn Share this post Link to post Share on other sites
maxfashko 5 Report post Posted June 10, 2016 Цвета разметки брал отсюда http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html. По сути ребята модель тренировали на данном датасете, если я ничего не путаю. Зачем изобретать велосипед Share this post Link to post Share on other sites
maxfashko 5 Report post Posted July 2, 2016 День добрый! А что еще можно попробовать для обучения сетки на сегментацию? Сейчас у меня имеется в распоряжении 4 Tesla m2090 (но это только 5 gb на каждой карточке). Tesla m40 больше не доступна, и врядли в обозримом будущем удастся получить к ней доступ. Как я понимаю на m2090 я не запущу SegNet. Пробывал указать все 4 карты при тренировке ( -gpu 0,1,2,3 ) не понимает. Может на амазоне есть инстансы с карточками по 10 gb и выше памяти? Я что-то не понял тамошних порядков с техническими характеритиками кластеров. Share this post Link to post Share on other sites
BeS 53 Report post Posted July 2, 2016 2 hours ago, maxfashko said: День добрый! А что еще можно попробовать для обучения сетки на сегментацию? Сейчас у меня имеется в распоряжении 4 Tesla m2090 (но это только 5 gb на каждой карточке). Tesla m40 больше не доступна, и врядли в обозримом будущем удастся получить к ней доступ. Как я понимаю на m2090 я не запущу SegNet. Пробывал указать все 4 карты при тренировке ( -gpu 0,1,2,3 ) не понимает. Может на амазоне есть инстансы с карточками по 10 gb и выше памяти? Я что-то не понял тамошних порядков с техническими характеритиками кластеров. Сейчас выгодней купить 1080-ю, чем оплачивать тачки в амазоне (GPU + жесткий диск на амазоне стоят не оправдано дорого). Share this post Link to post Share on other sites
maxfashko 5 Report post Posted July 2, 2016 14 часа назад, BeS сказал: Сейчас выгодней купить 1080-ю, чем оплачивать тачки в амазоне (GPU + жесткий диск на амазоне стоят не оправдано дорого). Понятно. Хочу еще спросить - официальный туториал segnet говорит, что после обучения сети, необходимо проделать следующее: python /Segnet/Scripts/compute_bn_statistics.py /SegNet/Models/segnet_train.prototxt /SegNet/Models/Training/segnet_iter_10000.caffemodel /Segnet/Models/Inference/ # compute BN statistics for SegNet python /SegNet/Scripts/test_segmentation_camvid.py --model /SegNet/Models/segnet_inference.prototxt --weights /SegNet/Models/Inference/test_weights.caffemodel --iter 233 # Test SegNet После этих команд выводятся изображения из тестовой выборки и результаты сегментации. А собственно можно просто взять обученную *.caffemodel и сегментировать любое изображение, после чего сохранить его в указанной директории? Все таки удалось запустить SegNet на одной m2090 А вообще это нормально, что у меня обучение происходит вот так? Уже после 3000 итерации точность довольно неплохая, ошибка тоже небольшая. И еще - подскажите, из-за чего вот эти всплески ошибок происходят? На итерациях 5, 10, 15 тыс. Они ведь получились эквивалентны графику accuracy на тех же итерациях. Это из-за каких-то уникальных особенностей в обучающей выборке - неточности, выбросы и т.д ? Как от них избавиться? Или это нормально? Share this post Link to post Share on other sites
maxfashko 5 Report post Posted July 4, 2016 Товарищи! Есть кто живой?) Кто-нибудь может мне подсказать по поводу кривых обучения? Share this post Link to post Share on other sites
Smorodov 579 Report post Posted July 4, 2016 Это нормально, данные берутся порциями, на одних порциях ошибка одна, на других другая, вот и пляшет. В процессе обучения, по мере улучшения модели, этот забор уменьшается. 1 Share this post Link to post Share on other sites
maxfashko 5 Report post Posted July 4, 2016 11 минуту назад, Smorodov сказал: Это нормально, данные берутся порциями, на одних порциях ошибка одна, на других другая, вот и пляшет. В процессе обучения, по мере улучшения модели, этот забор уменьшается. Спасибо! Думаете есть смысл обучать более 40к итераций? Share this post Link to post Share on other sites
Smorodov 579 Report post Posted July 4, 2016 Тут надо смотреть на тестовую выборку, если точность на ней повышается, то почему бы и не поучить. Share this post Link to post Share on other sites
maxfashko 5 Report post Posted July 6, 2016 В 04.07.2016 at 22:08, Smorodov сказал: Тут надо смотреть на тестовую выборку, если точность на ней повышается, то почему бы и не поучить. Smorodov, насчет теста, я правильно подхожу к тестированию? Делаю следующим образом: В качестве модели указываю ту, на которой тренировался (segnet_train.prototxt) ~/PassArtSegment/Segnet/caffe-segnet/build/tools/caffe test -gpu 0 -model ~/PassArtSegment/SegNet-Tutorial/Models/segnet_train.prototxt - weights ~/PassArtSegment/SegNet-Tutorial/Models/Training/segnet_iter_40000.caffemodel -iter 3000 2>&1 | tee test.log После чего парсим лог и получаем следующие графики точности и ошибки: Ну и если высчитать средние значения из лога то получаю: columnNumber = 2 data = [float(l.split(',')[columnNumber]) for l in open('log.csv', 'r').readlines()] mean = sum(data) / len(data) print(mean) //0.98666 для точности columnNumber = 3 data = [float(l.split(',')[columnNumber]) for l in open('log.csv', 'r').readlines()] mean = sum(data) / len(data) print(mean) //0.013902 для ошибки Это верный подход? Share this post Link to post Share on other sites
Smorodov 579 Report post Posted July 6, 2016 Я конкретно с Segnet-ом не возился, структуру каталогов не очень представляю. Тестирование, я имел ввиду, то что проводится периодически в процессе обучения, задайте для него отдельный кусок данных, в отдельной папке, напрягает "train_data" в названии каталога данных для тестирования. Share this post Link to post Share on other sites
maxfashko 5 Report post Posted August 18, 2016 Приветствую. Может быть у кого-то есть идеи по поводу следующей проблемы? Вот тут парень выложил caffe-segnet для задействовано нескольких gpu. https://github.com/developmentseed/caffe/tree/segnet-multi-gp Я собрал, запустил обучение на трех tesla m2090, но прироста скорости не заметил, 20 итераций по-прежнему выполняются около 40 секунд. К тому же я думал что при использовании нескольких gpu память будет шариться, и я смогу увеличить batch size. Но сеть ведет себя странно: | NVIDIA-SMI 352.39 Driver Version: 352.39 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla M2090 Off | 0000:19:00.0 Off | 0 | | N/A 59C P12 30W / 225W | 10MiB / 5375MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla M2090 Off | 0000:1A:00.0 Off | 0 | | N/A 59C P1 139W / 225W | 4812MiB / 5375MiB | 87% Default | +-------------------------------+----------------------+----------------------+ | 2 Tesla M2090 Off | 0000:1E:00.0 Off | 0 | | N/A 59C P0 159W / 225W | 4457MiB / 5375MiB | 19% Default | +-------------------------------+----------------------+----------------------+ | 3 Tesla M2090 Off | 0000:1F:00.0 Off | 0 | | N/A 59C P0 141W / 225W | 4457MiB / 5375MiB | 0% Default | +-------------------------------+----------------------+----------------------+ Я попытался попытался изменить batch size в segnet_train.prototxt (на m2090 работает только при значении 1, так как всего 5 gb ram) на значение 2 или 3. Но получил сообщение о нехватке памяти. Подскажите пожалуйста, могу ли я увеличить скорость обучения при использовании двух и более gpu? Если да, то что мне необходимо для этого сделать? Могу ли я увеличить upsample layer в segnet_train.prototxt чтобы память шарилась? layer { name: "upsample5" type: "Upsample" bottom: "pool5" top: "pool5_D" bottom: "pool5_mask" upsample_param { scale: 2 upsample_w: 30 upsample_h: 23 } } Я хочу изменить значения upsample_w : 45, upsample_h : 45 для того чтобы нейросеть могла принять на вход изображения 720*720. Возможно ли будет сделать это используя два и более gpu? Share this post Link to post Share on other sites
mrgloom 242 Report post Posted August 18, 2016 Надо сначала понять какая модель параллелизма там. Мне кажется что происходит примерно так : 1. На 1 GPU прогнали batch, проапдейтили веса, повторили. 2. На N GPU прогнали batch для каждого GPU, проапдейтили N раз веса у каждого GPU (порядок не важен?), повторили. Цитата Parallelism: the -gpu flag to the caffe tool can take a comma separated list of IDs to run on multiple GPUs. A solver and net will be instantiated for each GPU so the batch size is effectively multiplied by the number of GPUs. To reproduce single GPU training, reduce the batch size in the network definition accordingly. Т.е. по сути можно увеличить итоговый batch size, оставя на каждом GPU такой же как был до этого на 1 GPU. Caffe и так поддерживает флаг -gpu all, так что непонятно что там в этом форке добавилось. Цитата Могу ли я увеличить upsample layer в segnet_train.prototxt чтобы память шарилась? Если вопрос о том как сложить память всех GPU в 1 кусок, то думаю так просто это нельзя сделать. Это можно было бы сделать если первые k1 слоев лежали на первом GPU, k2 последующих на втором GPU и т.д. но я не знаю как это сделать в Caffe. Share this post Link to post Share on other sites
maxfashko 5 Report post Posted August 18, 2016 Все понял. Родная caffe-segnet не поддерживает multiple gpu. Что-то там изменили. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted August 23, 2016 Кстати тут вроде описано про модель https://github.com/BVLC/caffe/blob/master/docs/multigpu.md Цитата The current implementation uses a tree reduction strategy. e.g. if there are 4 GPUs in the system, 0:1, 2:3 will exchange gradients, then 0:2 (top of the tree) will exchange gradients, 0 will calculate updated model, 0->2, and then 0->1, 2->3. Так что не совсем так как я сказал. Share this post Link to post Share on other sites