{"id":30274,"date":"2019-10-31T21:34:36","date_gmt":"2019-10-31T18:34:36","guid":{"rendered":"https:\/\/prohoster.info\/blog\/quick-draw-doodle-recognition-kak-podruzhit-r-c-i-nejrosetki\/"},"modified":"2019-10-31T21:34:36","modified_gmt":"2019-10-31T18:34:36","slug":"quick-draw-doodle-recognition-kak-podruzhit-r-c-i-nejrosetki","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/quick-draw-doodle-recognition-kak-podruzhit-r-c-i-nejrosetki","title":{"rendered":"Quick Draw Doodle Recognition: Wie man R, C++ und neuronale Netzwerke in Einklang bringt","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Quick Draw Doodle Recognition: \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c R, C++ \u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0438\" src=\"\/wp-content\/uploads\/2019\/03\/104e8910366cc377c0aa05982efa7353.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u041e\u0441\u0435\u043d\u044c\u044e \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u043d\u0430 Kaggle \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u043a\u043e\u043d\u043a\u0443\u0440\u0441 \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u0440\u0443\u043a\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a Quick Draw Doodle Recognition, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 R-\u0449\u0438\u043a\u043e\u0432 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/artem_klevtsov\/\">\u0410\u0440\u0442\u0435\u043c\u0430 \u041a\u043b\u0435\u0432\u0446\u043e\u0432\u0430<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/konhis\/\">\u0424\u0438\u043b\u0438\u043f\u043f\u0430 \u0423\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0432\u0430<\/a><\/noindex> \u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/ogurtsov\/\">\u0410\u043d\u0434\u0440\u0435\u044f \u041e\u0433\u0443\u0440\u0446\u043e\u0432\u0430<\/a><\/noindex>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/440666\/\">\u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/a><\/noindex>.<\/p>\n<p>\u0421 \u0444\u0430\u0440\u043c\u043e\u043c \u043c\u0435\u0434\u0430\u043b\u0435\u043a \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043d\u0435 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e \u0440\u044f\u0434\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u043d\u0430 \u041a\u0430\u0433\u043b\u0435 \u0438 \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u0435\u0449\u0435\u0439 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0443. \u0421\u0440\u0435\u0434\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 \u0442\u0435\u043c: \u043d\u0435\u043b\u0435\u0433\u043a\u0430\u044f \u0436\u0438\u0437\u043d\u044c \u0431\u0435\u0437 <strong>OpenCV<\/strong>, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 JSON-\u043e\u0432 (\u043d\u0430 \u044d\u0442\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043d\u0430 \u0421++ \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438\u043b\u0438 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430 R \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c <strong>Rcpp<\/strong>), \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u0434\u043e\u043a\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u043c \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u0438\u0434\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/artemklevtsov\/swarm-quickdraw-doodle-recognition\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a><\/noindex>.<\/p>\n<h3>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435:<\/h3>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"#section1\">\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 CSV \u0432 \u0431\u0430\u0437\u0443 MonetDB<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#section2\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0431\u0430\u0442\u0447\u0435\u0439<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#section3\">\u0418\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0430\u0442\u0447\u0435\u0439 \u0438\u0437 \u0411\u0414<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#section4\">\u0412\u044b\u0431\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#section5\">\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#section6\">\u0414\u043e\u043a\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#section7\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 GPU \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 Google Cloud <\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#section8\">\u0412\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/a><\/noindex><\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4 id=\"section1\">1. \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 CSV \u0432 \u0431\u0430\u0437\u0443 MonetDB<\/h4>\n<p><\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0430 \u0432 \u0432\u0438\u0434\u0435 340 CSV-\u0444\u0430\u0439\u043b\u043e\u0432 (\u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0441), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 JSON-\u044b \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0442\u043e\u0447\u0435\u043a. \u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0432 \u044d\u0442\u0438 \u0442\u043e\u0447\u043a\u0438 \u043b\u0438\u043d\u0438\u044f\u043c\u0438, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 256\u0445256 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0442\u043a\u0430, \u0431\u044b\u043b\u0430 \u043b\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c, \u0434\u0432\u0443\u0445\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u044b \u043f\u0440\u043e\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u0440\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430, \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0444\u0430\u0439\u043b\u0430. \u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u0441\u0438\u0442 7.4 \u0413\u0431 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 20 \u0413\u0431 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438, \u043f\u043e\u043b\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 240 \u0413\u0431. \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u0447\u0442\u043e \u043e\u0431\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0439. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 50 \u043c\u043b\u043d. \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u0438\u043b\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0441\u0440\u0430\u0437\u0443 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043d\u043e \u043d\u0435\u0440\u0435\u043d\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u043c, \u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u043b\u0438\u0442\u044c \u0432\u0441\u0435 CSV-\u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430 <em>train_simplified.zip<\/em> \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 &#171;\u043d\u0430 \u043b\u0435\u0442\u0443&#187; \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0430\u0442\u0447\u0430.<\/p>\n<p><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0421\u0423\u0411\u0414 \u0431\u044b\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u0435\u0431\u044f \u0437\u0430\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u0432\u0448\u0430\u044f <strong>MonetDB<\/strong>, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f R \u0432 \u0432\u0438\u0434\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 <strong><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/MonetDB\/MonetDBLite-R\">MonetDBLite<\/a><\/noindex><\/strong>. \u041f\u0430\u043a\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f embedded-\u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437 R-\u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0442\u0430\u043c \u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u043d\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">con &lt;- DBI::dbConnect(drv = MonetDBLite::MonetDBLite(), Sys.getenv(\"DBDIR\"))<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0432\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b: \u043e\u0434\u043d\u0443 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u0440\u0443\u0433\u0443\u044e \u0434\u043b\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 (\u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432):<\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446<\/b><\/p>\n<pre><code class=\"plaintext\">if (!DBI::dbExistsTable(con, \"doodles\")) {\n  DBI::dbCreateTable(\n    con = con,\n    name = \"doodles\",\n    fields = c(\n      \"countrycode\" = \"char(2)\",\n      \"drawing\" = \"text\",\n      \"key_id\" = \"bigint\",\n      \"recognized\" = \"bool\",\n      \"timestamp\" = \"timestamp\",\n      \"word\" = \"text\"\n    )\n  )\n}\n\nif (!DBI::dbExistsTable(con, \"upload_log\")) {\n  DBI::dbCreateTable(\n    con = con,\n    name = \"upload_log\",\n    fields = c(\n      \"id\" = \"serial\",\n      \"file_name\" = \"text UNIQUE\",\n      \"uploaded\" = \"bool DEFAULT false\"\n    )\n  )\n}<\/code><\/pre>\n<p><\/p>\n<p>\u0421\u0430\u043c\u044b\u043c \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0411\u0414 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u044f\u043c\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 CSV-\u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 SQL \u2014 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>COPY OFFSET 2 INTO tablename FROM path USING DELIMITERS ',','n','\"' NULL AS '' BEST EFFORT<\/code>, \u0433\u0434\u0435 <code>tablename<\/code> \u2014 \u0438\u043c\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 <code>path<\/code> \u2014 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443. \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0430\u0440\u0445\u0438\u0432\u043e\u043c \u0431\u044b\u043b\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e, \u0447\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>unzip<\/code> \u0432 R \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0440\u044f\u0434\u043e\u043c \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 <code>unzip<\/code> (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>getOption(\"unzip\")<\/code>). <\/p>\n<p>\n<b class=\"spoiler_title\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0431\u0430\u0437\u0443<\/b><\/p>\n<pre><code class=\"plaintext\">#' @title \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\n#'\n#' @description\n#' \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 CSV-\u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 ZIP-\u0430\u0440\u0445\u0438\u0432\u0430 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0445 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445\n#'\n#' @param con \u041e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043a\u043b\u0430\u0441\u0441 `MonetDBEmbeddedConnection`).\n#' @param tablename \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.\n#' @oaram zipfile \u041f\u0443\u0442\u044c \u043a ZIP-\u0430\u0440\u0445\u0438\u0432\u0443.\n#' @oaram filename \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0432\u043d\u0443\u0440\u0438 ZIP-\u0430\u0440\u0445\u0438\u0432\u0430.\n#' @param preprocess \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u0438\u0437\u0432\u043b\u0435\u0447\u0451\u043d\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443.\n#'   \u0414\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 `data` (\u043e\u0431\u044a\u0435\u043a\u0442 `data.table`).\n#'\n#' @return `TRUE`.\n#'\nupload_file &lt;- function(con, tablename, zipfile, filename, preprocess = NULL) {\n  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n  checkmate::assert_class(con, \"MonetDBEmbeddedConnection\")\n  checkmate::assert_string(tablename)\n  checkmate::assert_string(filename)\n  checkmate::assert_true(DBI::dbExistsTable(con, tablename))\n  checkmate::assert_file_exists(zipfile, access = \"r\", extension = \"zip\")\n  checkmate::assert_function(preprocess, args = c(\"data\"), null.ok = TRUE)\n\n  # \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430\n  path &lt;- file.path(tempdir(), filename)\n  unzip(zipfile, files = filename, exdir = tempdir(), \n        junkpaths = TRUE, unzip = getOption(\"unzip\"))\n  on.exit(unlink(file.path(path)))\n\n  # \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438\n  if (!is.null(preprocess)) {\n    .data &lt;- data.table::fread(file = path)\n    .data &lt;- preprocess(data = .data)\n    data.table::fwrite(x = .data, file = path, append = FALSE)\n    rm(.data)\n  }\n\n  # \u0417\u0430\u043f\u0440\u043e\u0441 \u043a \u0411\u0414 \u043d\u0430 \u0438\u043c\u043f\u043e\u0440\u0442 CSV\n  sql &lt;- sprintf(\n    \"COPY OFFSET 2 INTO %s FROM '%s' USING DELIMITERS ',','n','\"' NULL AS '' BEST EFFORT\",\n    tablename, path\n  )\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0411\u0414\n  DBI::dbExecute(con, sql)\n\n  # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443\n  DBI::dbExecute(con, sprintf(\"INSERT INTO upload_log(file_name, uploaded) VALUES('%s', true)\",\n                              filename))\n\n  return(invisible(TRUE))\n}<\/code><\/pre>\n<p><\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 \u0411\u0414, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>preprocess<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p><\/p>\n<p>\u041a\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u0430\u0437\u0443:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0417\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u0430\u0437\u0443<\/b><\/p>\n<pre><code class=\"plaintext\"># \u0421\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438\nfiles &lt;- unzip(zipfile, list = TRUE)$Name\n\n# \u0421\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u0435\u0441\u043b\u0438 \u0447\u0430\u0441\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432 \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430\nto_skip &lt;- DBI::dbGetQuery(con, \"SELECT file_name FROM upload_log\")[[1L]]\nfiles &lt;- setdiff(files, to_skip)\n\nif (length(files) &gt; 0L) {\n  # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440\n  tictoc::tic()\n  # \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0431\u0430\u0440\n  pb &lt;- txtProgressBar(min = 0L, max = length(files), style = 3)\n  for (i in seq_along(files)) {\n    upload_file(con = con, tablename = \"doodles\", \n                zipfile = zipfile, filename = files[i])\n    setTxtProgressBar(pb, i)\n  }\n  close(pb)\n  # \u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440\n  tictoc::toc()\n}\n\n# 526.141 sec elapsed - \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 SSD-&gt;SSD\n# 558.879 sec elapsed - \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 USB-&gt;SSD<\/code><\/pre>\n<p><\/p>\n<p>\u0412\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u044b\u0445 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043d\u0430\u043a\u043e\u043f\u0438\u0442\u0435\u043b\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e SSD \u0438\u043b\u0438 \u0441 \u0444\u043b\u0435\u0448\u043a\u0438 (\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0444\u0430\u0439\u043b) \u043d\u0430 SSD (\u0411\u0414) \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0435\u043d\u0435\u0435 10 \u043c\u0438\u043d\u0443\u0442.<\/p>\n<p><\/p>\n<p>\u0415\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0441 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430-\u0438\u043d\u0434\u0435\u043a\u0441\u0430 (<code>ORDERED INDEX<\/code>) \u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0431\u0430\u0442\u0447\u0435\u0439:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430<\/b><\/p>\n<pre><code class=\"plaintext\">message(\"Generate lables\")\ninvisible(DBI::dbExecute(con, \"ALTER TABLE doodles ADD label_int int\"))\ninvisible(DBI::dbExecute(con, \"UPDATE doodles SET label_int = dense_rank() OVER (ORDER BY word) - 1\"))\n\nmessage(\"Generate row numbers\")\ninvisible(DBI::dbExecute(con, \"ALTER TABLE doodles ADD id serial\"))\ninvisible(DBI::dbExecute(con, \"CREATE ORDERED INDEX doodles_id_ord_idx ON doodles(id)\"))<\/code><\/pre>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0442\u0447\u0430 \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <code>doodles<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 3 \u0442\u0440\u044e\u043a\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f ID \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f. \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f ID \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u0438\u043f <code>bigint<\/code>, \u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u0440\u0430\u0432\u043d\u044b\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u043e\u043c\u0443 \u043d\u043e\u043c\u0435\u0440\u0443, \u0432 \u0442\u0438\u043f <code>int<\/code>. \u041f\u043e\u0438\u0441\u043a \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0412\u0442\u043e\u0440\u044b\u043c \u0442\u0440\u044e\u043a\u043e\u043c \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>ORDERED INDEX<\/code> \u2014 \u043a \u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u0438\u0448\u043b\u0438 \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0432 \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.monetdb.org\/Documentation\/Manuals\/SQLreference\/Indices\">\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b<\/a><\/noindex>. \u0422\u0440\u0435\u0442\u0438\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043b \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0421\u0443\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>PREPARE<\/code> \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u0443\u0447\u0438 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043d\u043e \u043d\u0430 \u0434\u0435\u043b\u0435 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c <code>SELECT<\/code> \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p><\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 450 \u041c\u0431 \u041e\u0417\u0423. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043e\u0440\u043e\u0447\u0430\u0442\u044c \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u044b \u0432\u0435\u0441\u043e\u043c \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u0438\u043a\u0438, \u0447\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u0440\u0443\u0442\u043e.<\/p>\n<p><\/p>\n<p>\u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043c\u0435\u0440\u044b \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f (\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445) \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u0431\u0430\u0442\u0447\u0435\u0439 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<pre><code class=\"plaintext\">library(ggplot2)\n\nset.seed(0)\n# \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\ncon &lt;- DBI::dbConnect(MonetDBLite::MonetDBLite(), Sys.getenv(\"DBDIR\"))\n\n# \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\nprep_sql &lt;- function(batch_size) {\n  sql &lt;- sprintf(\"PREPARE SELECT id FROM doodles WHERE id IN (%s)\",\n                 paste(rep(\"?\", batch_size), collapse = \",\"))\n  res &lt;- DBI::dbSendQuery(con, sql)\n  return(res)\n}\n\n# \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445\nfetch_data &lt;- function(rs, batch_size) {\n  ids &lt;- sample(seq_len(n), batch_size)\n  res &lt;- DBI::dbFetch(DBI::dbBind(rs, as.list(ids)))\n  return(res)\n}\n\n# \u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430\nres_bench &lt;- bench::press(\n  batch_size = 2^(4:10),\n  {\n    rs &lt;- prep_sql(batch_size)\n    bench::mark(\n      fetch_data(rs, batch_size),\n      min_iterations = 50L\n    )\n  }\n)\n# \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\ncols &lt;- c(\"batch_size\", \"min\", \"median\", \"max\", \"itr\/sec\", \"total_time\", \"n_itr\")\nres_bench[, cols]\n\n#   batch_size      min   median      max `itr\/sec` total_time n_itr\n#        &lt;dbl&gt; &lt;bch:tm&gt; &lt;bch:tm&gt; &lt;bch:tm&gt;     &lt;dbl&gt;   &lt;bch:tm&gt; &lt;int&gt;\n# 1         16   23.6ms  54.02ms  93.43ms     18.8        2.6s    49\n# 2         32     38ms  84.83ms 151.55ms     11.4       4.29s    49\n# 3         64   63.3ms 175.54ms 248.94ms     5.85       8.54s    50\n# 4        128   83.2ms 341.52ms 496.24ms     3.00      16.69s    50\n# 5        256  232.8ms 653.21ms 847.44ms     1.58      31.66s    50\n# 6        512  784.6ms    1.41s    1.98s     0.740       1.1m    49\n# 7       1024  681.7ms    2.72s    4.06s     0.377      2.16m    49\n\nggplot(res_bench, aes(x = factor(batch_size), y = median, group = 1)) +\n  geom_point() +\n  geom_line() +\n  ylab(\"median time, s\") +\n  theme_minimal()\n\nDBI::dbDisconnect(con, shutdown = TRUE)<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Quick Draw Doodle Recognition: \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c R, C++ \u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0438\" src=\"\/wp-content\/uploads\/2019\/03\/5d6af164c6d256c5bf66042dc8cddf82.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4 id=\"section2\">2. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0431\u0430\u0442\u0447\u0435\u0439<\/h4>\n<p><\/p>\n<p>\u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0431\u0430\u0442\u0447\u0435\u0439 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432:<\/p>\n<p><\/p>\n<ol>\n<li>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 JSON-\u043e\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0441\u0442\u0440\u043e\u043a \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0442\u043e\u0447\u0435\u043a.<\/li>\n<li>\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0446\u0432\u0435\u0442\u043d\u044b\u0445 \u043b\u0438\u043d\u0438\u0439 \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 256&#215;256 \u0438\u043b\u0438 128&#215;128).<\/li>\n<li>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0442\u0435\u043d\u0437\u043e\u0440.<\/li>\n<\/ol>\n<p><\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u0438 kernel-\u043e\u0432 \u043d\u0430 Python \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0448\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 <strong>OpenCV<\/strong>. \u041e\u0434\u0438\u043d \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432 \u043d\u0430 R \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f JSON \u0432 \u0442\u0435\u043d\u0437\u043e\u0440 \u043d\u0430 R<\/b><\/p>\n<pre><code class=\"plaintext\">r_process_json_str &lt;- function(json, line.width = 3, \n                               color = TRUE, scale = 1) {\n  # \u041f\u0430\u0440\u0441\u0438\u043d\u0433 JSON\n  coords &lt;- jsonlite::fromJSON(json, simplifyMatrix = FALSE)\n  tmp &lt;- tempfile()\n  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438\n  on.exit(unlink(tmp))\n  png(filename = tmp, width = 256 * scale, height = 256 * scale, pointsize = 1)\n  # \u041f\u0443\u0441\u0442\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\n  plot.new()\n  # \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0430\n  plot.window(xlim = c(256 * scale, 0), ylim = c(256 * scale, 0))\n  # \u0426\u0432\u0435\u0442\u0430 \u043b\u0438\u043d\u0438\u0439\n  cols &lt;- if (color) rainbow(length(coords)) else \"#000000\"\n  for (i in seq_along(coords)) {\n    lines(x = coords[[i]][[1]] * scale, y = coords[[i]][[2]] * scale, \n          col = cols[i], lwd = line.width)\n  }\n  dev.off()\n  # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 3-\u0445 \u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  res &lt;- png::readPNG(tmp)\n  return(res)\n}\n\nr_process_json_vector &lt;- function(x, ...) {\n  res &lt;- lapply(x, r_process_json_str, ...)\n  # \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 3-\u0445 \u043c\u0435\u0440\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0432 4-\u0445 \u043c\u0435\u0440\u043d\u044b\u0439 \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\n  res &lt;- do.call(abind::abind, c(res, along = 0))\n  return(res)\n}<\/code><\/pre>\n<p><\/p>\n<p>\u0420\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 R \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 PNG, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439\u0441\u044f \u0432 \u041e\u0417\u0423 (\u0432 Linux \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 R \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 <code>\/tmp<\/code>, \u0441\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432 \u041e\u0417\u0423). \u0417\u0430\u0442\u0435\u043c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 0 \u0434\u043e 1. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0435\u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0439 BMP \u0431\u044b\u043b \u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d \u0432 raw-\u043c\u0430\u0441\u0441\u0438\u0432 \u0441 hex-\u043a\u043e\u0434\u0430\u043c\u0438 \u0446\u0432\u0435\u0442\u043e\u0432.<\/p>\n<p><\/p>\n<p>\u041f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">zip_file &lt;- file.path(\"data\", \"train_simplified.zip\")\ncsv_file &lt;- \"cat.csv\"\nunzip(zip_file, files = csv_file, exdir = tempdir(), \n      junkpaths = TRUE, unzip = getOption(\"unzip\"))\ntmp_data &lt;- data.table::fread(file.path(tempdir(), csv_file), sep = \",\", \n                              select = \"drawing\", nrows = 10000)\narr &lt;- r_process_json_str(tmp_data[4, drawing])\ndim(arr)\n# [1] 256 256   3\nplot(magick::image_read(arr))<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Quick Draw Doodle Recognition: \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c R, C++ \u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0438\" src=\"\/wp-content\/uploads\/2019\/03\/315e164c4d0c722e73ecc8e99b3bb2c1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u0421\u0430\u043c \u0431\u0430\u0442\u0447 \u0431\u0443\u0434\u0435\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">res &lt;- r_process_json_vector(tmp_data[1:4, drawing], scale = 0.5)\nstr(res)\n # num [1:4, 1:128, 1:128, 1:3] 1 1 1 1 1 1 1 1 1 1 ...\n # - attr(*, \"dimnames\")=List of 4\n #  ..$ : NULL\n #  ..$ : NULL\n #  ..$ : NULL\n #  ..$ : NULL<\/code><\/pre>\n<p><\/p>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0431\u0430\u0442\u0447\u0435\u0439 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u043a\u043e\u043b\u043b\u0435\u0433, \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0432 \u043c\u043e\u0449\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <strong>OpenCV<\/strong>. \u041d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0434\u043b\u044f R \u043d\u0435 \u0431\u044b\u043b\u043e (\u043d\u0435\u0442 \u0435\u0433\u043e \u0438 \u0441\u0435\u0439\u0447\u0430\u0441), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043d\u0430 C++ \u0441 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u0432 \u043a\u043e\u0434 \u043d\u0430 R \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <strong>Rcpp<\/strong>.<\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p><strong>OpenCV<\/strong> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u043d\u0438\u0439. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0443.<\/p>\n<p>\n<\/li>\n<li>\n<p><strong>xtensor<\/strong> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043d\u043e\u0433\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u0438 \u0442\u0435\u043d\u0437\u043e\u0440\u0430\u043c\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0435 \u0432 \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u044b\u0439 R-\u043f\u0430\u043a\u0435\u0442. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u043d\u043e\u0433\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438, \u043f\u0440\u0438\u0447\u0451\u043c \u043a\u0430\u043a \u0432 row major, \u0442\u0430\u043a \u0438 \u0432 column major \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<p>\n<\/li>\n<li>\n<p><strong>ndjson<\/strong> \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON. \u0414\u0430\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 <strong>xtensor<\/strong> \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0435\u0451 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<p>\n<\/li>\n<li>\n<p><strong>RcppThread<\/strong> \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u0437 JSON-\u043e\u0432. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u044d\u0442\u0438\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c. \u041e\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e <strong>RcppParallel<\/strong> \u043f\u0430\u043a\u0435\u0442 \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430 (interrupt).<\/p>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e <strong>xtensor<\/strong> \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u043a\u043e\u0439: \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0442\u0437\u044b\u0432\u0447\u0438\u0432\u044b\u043c\u0438 \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u043b\u0438 \u043d\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u0421 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446 OpenCV \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\u044b xtensor, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f 3-\u0445 \u043c\u0435\u0440\u043d\u044b\u0445 \u0442\u0435\u043d\u0437\u043e\u0440\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 4-\u0445 \u043c\u0435\u0440\u043d\u044b\u0439 \u0442\u0435\u043d\u0437\u043e\u0440 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 (\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u0430\u0442\u0447).<\/p>\n<p>\n<b class=\"spoiler_title\">\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f Rcpp, xtensor \u0438 RcppThread<\/b><\/p>\n<p><noindex>https:\/\/thecoatlessprofessor.com\/programming\/unofficial-rcpp-api-documentation<\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.0.1\/d7\/dbd\/group__imgproc.html\">https:\/\/docs.opencv.org\/4.0.1\/d7\/dbd\/group__imgproc.html<\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xtensor.readthedocs.io\/en\/latest\/\">https:\/\/xtensor.readthedocs.io\/en\/latest\/<\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/xtensor.readthedocs.io\/en\/latest\/file_loading.html#loading-json-data-into-xtensor\">https:\/\/xtensor.readthedocs.io\/en\/latest\/file_loading.html#loading-json-data-into-xtensor<\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/cran.r-project.org\/web\/packages\/RcppThread\/vignettes\/RcppThread-vignette.pdf\">https:\/\/cran.r-project.org\/web\/packages\/RcppThread\/vignettes\/RcppThread-vignette.pdf<\/a><\/noindex><\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0443 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 <strong>Rcpp<\/strong>. \u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u0435\u0439 \u0438 \u0444\u043b\u0430\u0433\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0443\u044e linux-\u0443\u0442\u0438\u043b\u0438\u0442\u0443 <strong>pkg-config<\/strong>.<\/p>\n<p>\n<b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Rcpp-\u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 OpenCV<\/b><\/p>\n<pre><code class=\"plaintext\">Rcpp::registerPlugin(\"opencv\", function() {\n  # \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430\n  pkg_config_name &lt;- c(\"opencv\", \"opencv4\")\n  # \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0443\u0442\u0438\u043b\u0438\u0442\u044b pkg-config\n  pkg_config_bin &lt;- Sys.which(\"pkg-config\")\n  # \u041f\u0440\u043e\u0432\u0440\u0435\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n  checkmate::assert_file_exists(pkg_config_bin, access = \"x\")\n  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a OpenCV \u0434\u043b\u044f pkg-config\n  check &lt;- sapply(pkg_config_name, \n                  function(pkg) system(paste(pkg_config_bin, pkg)))\n  if (all(check != 0)) {\n    stop(\"OpenCV config for the pkg-config not found\", call. = FALSE)\n  }\n\n  pkg_config_name &lt;- pkg_config_name[check == 0]\n  list(env = list(\n    PKG_CXXFLAGS = system(paste(pkg_config_bin, \"--cflags\", pkg_config_name), \n                          intern = TRUE),\n    PKG_LIBS = system(paste(pkg_config_bin, \"--libs\", pkg_config_name), \n                      intern = TRUE)\n  ))\n})<\/code><\/pre>\n<p><\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Rcpp:::.plugins$opencv()$env\n\n# $PKG_CXXFLAGS\n# [1] \"-I\/usr\/include\/opencv\"\n#\n# $PKG_LIBS\n# [1] \"-lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_datasets -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_line_descriptor -lopencv_optflow -lopencv_video -lopencv_plot -lopencv_reg -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_rgbd -lopencv_viz -lopencv_surface_matching -lopencv_text -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_xobjdetect -lopencv_objdetect -lopencv_ml -lopencv_xphoto -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_photo -lopencv_imgproc -lopencv_core\"<\/code><\/pre>\n<p><\/p>\n<p>\u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0442\u0447\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c. \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 (\u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f ndjson):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Sys.setenv(\"PKG_CXXFLAGS\" = paste0(\"-I\", normalizePath(file.path(\"src\"))))<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f JSON \u0432 \u0442\u0435\u043d\u0437\u043e\u0440 \u043d\u0430 \u0421++<\/b><\/p>\n<pre><code class=\"plaintext\">\/\/ [[Rcpp::plugins(cpp14)]]\n\/\/ [[Rcpp::plugins(opencv)]]\n\/\/ [[Rcpp::depends(xtensor)]]\n\/\/ [[Rcpp::depends(RcppThread)]]\n\n#include &lt;xtensor\/xjson.hpp&gt;\n#include &lt;xtensor\/xadapt.hpp&gt;\n#include &lt;xtensor\/xview.hpp&gt;\n#include &lt;xtensor-r\/rtensor.hpp&gt;\n#include &lt;opencv2\/core\/core.hpp&gt;\n#include &lt;opencv2\/highgui\/highgui.hpp&gt;\n#include &lt;opencv2\/imgproc\/imgproc.hpp&gt;\n#include &lt;Rcpp.h&gt;\n#include &lt;RcppThread.h&gt;\n\n\/\/ \u0421\u0438\u043d\u043e\u043d\u0438\u043c\u044b \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432\nusing RcppThread::parallelFor;\nusing json = nlohmann::json;\nusing points = xt::xtensor&lt;double,2&gt;;     \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0451\u043d\u043d\u044b\u0435 \u0438\u0437 JSON \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a\nusing strokes = std::vector&lt;points&gt;;      \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0451\u043d\u043d\u044b\u0435 \u0438\u0437 JSON \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a\nusing xtensor3d = xt::xtensor&lt;double, 3&gt;; \/\/ \u0422\u0435\u043d\u0437\u043e\u0440 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0438\u0437\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\nusing xtensor4d = xt::xtensor&lt;double, 4&gt;; \/\/ \u0422\u0435\u043d\u0437\u043e\u0440 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439\nusing rtensor3d = xt::rtensor&lt;double, 3&gt;; \/\/ \u041e\u0431\u0451\u0440\u0442\u043a\u0430 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 R\nusing rtensor4d = xt::rtensor&lt;double, 4&gt;; \/\/ \u041e\u0431\u0451\u0440\u0442\u043a\u0430 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 R\n\n\/\/ \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b\n\/\/ \u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445\nconst static int SIZE = 256;\n\/\/ \u0422\u0438\u043f \u043b\u0438\u043d\u0438\u0438\n\/\/ \u0421\u043c. https:\/\/en.wikipedia.org\/wiki\/Pixel_connectivity#2-dimensional\nconst static int LINE_TYPE = cv::LINE_4;\n\/\/ \u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445\nconst static int LINE_WIDTH = 3;\n\/\/ \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0435\u0441\u0430\u0439\u0437\u0430\n\/\/ https:\/\/docs.opencv.org\/3.1.0\/da\/d54\/group__imgproc__transform.html#ga5bb5a1fea74ea38e1a5445ca803ff121\nconst static int RESIZE_TYPE = cv::INTER_LINEAR;\n\n\/\/ \u0428\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f OpenCV-\u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\ntemplate &lt;typename T, int NCH, typename XT=xt::xtensor&lt;T,3,xt::layout_type::column_major&gt;&gt;\nXT to_xt(const cv::Mat_&lt;cv::Vec&lt;T, NCH&gt;&gt;&amp; src) {\n  \/\/ \u0420\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0442\u0435\u043d\u0437\u043e\u0440\u0430\n  std::vector&lt;int&gt; shape = {src.rows, src.cols, NCH};\n  \/\/ \u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n  size_t size = src.total() * NCH;\n  \/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 cv::Mat \u0432 xt::xtensor\n  XT res = xt::adapt((T*) src.data, size, xt::no_ownership(), shape);\n  return res;\n}\n\n\/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 JSON \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u043e\u0447\u0435\u043a\nstrokes parse_json(const std::string&amp; x) {\n  auto j = json::parse(x);\n  \/\/ \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c\n  if (!j.is_array()) {\n    throw std::runtime_error(\"'x' must be JSON array.\");\n  }\n  strokes res;\n  res.reserve(j.size());\n  for (const auto&amp; a: j) {\n    \/\/ \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c 2-\u043c\u0435\u0440\u043d\u044b\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c\n    if (!a.is_array() || a.size() != 2) {\n      throw std::runtime_error(\"'x' must include only 2d arrays.\");\n    }\n    \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0442\u043e\u0447\u0435\u043a\n    auto p = a.get&lt;points&gt;();\n    res.push_back(p);\n  }\n  return res;\n}\n\n\/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043b\u0438\u043d\u0438\u0439\n\/\/ \u0426\u0432\u0435\u0442\u0430 HSV\ncv::Mat ocv_draw_lines(const strokes&amp; x, bool color = true) {\n  \/\/ \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0438\u043f \u043c\u0430\u0442\u0440\u0438\u0446\u044b\n  auto stype = color ? CV_8UC3 : CV_8UC1;\n  \/\/ \u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043c\u0430\u0442\u0440\u0438\u0446\u044b\n  auto dtype = color ? CV_32FC3 : CV_32FC1;\n  auto bg = color ? cv::Scalar(0, 0, 255) : cv::Scalar(255);\n  auto col = color ? cv::Scalar(0, 255, 220) : cv::Scalar(0);\n  cv::Mat img = cv::Mat(SIZE, SIZE, stype, bg);\n  \/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043b\u0438\u043d\u0438\u0439\n  size_t n = x.size();\n  for (const auto&amp; s: x) {\n    \/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a \u0432 \u043b\u0438\u043d\u0438\u0438\n    size_t n_points = s.shape()[1];\n    for (size_t i = 0; i &lt; n_points - 1; ++i) {\n      \/\/ \u0422\u043e\u0447\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u0448\u0442\u0440\u0438\u0445\u0430\n      cv::Point from(s(0, i), s(1, i));\n      \/\/ \u0422\u043e\u0447\u043a\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0448\u0442\u0440\u0438\u0445\u0430\n      cv::Point to(s(0, i + 1), s(1, i + 1));\n      \/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043b\u0438\u043d\u0438\u0438\n      cv::line(img, from, to, col, LINE_WIDTH, LINE_TYPE);\n    }\n    if (color) {\n      \/\/ \u041c\u0435\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442 \u043b\u0438\u043d\u0438\u0438\n      col[0] += 180 \/ n;\n    }\n  }\n  if (color) {\n    \/\/ \u041c\u0435\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 RGB\n    cv::cvtColor(img, img, cv::COLOR_HSV2RGB);\n  }\n  \/\/ \u041c\u0435\u043d\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 float32 \u0441 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c [0, 1]\n  img.convertTo(img, dtype, 1 \/ 255.0);\n  return img;\n}\n\n\/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 JSON \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043d\u0437\u043e\u0440\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\nxtensor3d process(const std::string&amp; x, double scale = 1.0, bool color = true) {\n  auto p = parse_json(x);\n  auto img = ocv_draw_lines(p, color);\n  if (scale != 1) {\n    cv::Mat out;\n    cv::resize(img, out, cv::Size(), scale, scale, RESIZE_TYPE);\n    cv::swap(img, out);\n    out.release();\n  }\n  xtensor3d arr = color ? to_xt&lt;double,3&gt;(img) : to_xt&lt;double,1&gt;(img);\n  return arr;\n}\n\n\/\/ [[Rcpp::export]]\nrtensor3d cpp_process_json_str(const std::string&amp; x, \n                               double scale = 1.0, \n                               bool color = true) {\n  xtensor3d res = process(x, scale, color);\n  return res;\n}\n\n\/\/ [[Rcpp::export]]\nrtensor4d cpp_process_json_vector(const std::vector&lt;std::string&gt;&amp; x, \n                                  double scale = 1.0, \n                                  bool color = false) {\n  size_t n = x.size();\n  size_t dim = floor(SIZE * scale);\n  size_t channels = color ? 3 : 1;\n  xtensor4d res({n, dim, dim, channels});\n  parallelFor(0, n, [&amp;x, &amp;res, scale, color](int i) {\n    xtensor3d tmp = process(x[i], scale, color);\n    auto view = xt::view(res, i, xt::all(), xt::all(), xt::all());\n    view = tmp;\n  });\n  return res;\n}<\/code><\/pre>\n<p><\/p>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b <code>src\/cv_xt.cpp<\/code> \u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>Rcpp::sourceCpp(file = \"src\/cv_xt.cpp\", env = .GlobalEnv)<\/code>; \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f <code>nlohmann\/json.hpp<\/code> \u0438\u0437 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nlohmann\/json\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/a><\/noindex>. \u041a\u043e\u0434 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p><code>to_xt<\/code> \u2014 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043a\u043d\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (<code>cv::Mat<\/code>) \u0432 \u0442\u0435\u043d\u0437\u043e\u0440 <code>xt::xtensor<\/code>;<\/p>\n<p>\n<\/li>\n<li>\n<p><code>parse_json<\/code> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0430\u0440\u0441\u0438\u0442 JSON-\u0441\u0442\u0440\u043e\u043a\u0443, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a, \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u044f \u0438\u0445 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440;<\/p>\n<p>\n<\/li>\n<li>\n<p><code>ocv_draw_lines<\/code> \u2014 \u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u0442\u043e\u0447\u0435\u043a \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u043e\u0446\u0432\u0435\u0442\u043d\u044b\u0435 \u043b\u0438\u043d\u0438\u0438;<\/p>\n<p>\n<\/li>\n<li>\n<p><code>process<\/code> \u2014 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0448\u043a\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f;<\/p>\n<p>\n<\/li>\n<li>\n<p><code>cpp_process_json_str<\/code> \u2014 \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>process<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 R-\u043e\u0431\u044a\u0435\u043a\u0442 (\u043c\u043d\u043e\u0433\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432);<\/p>\n<p>\n<\/li>\n<li>\n<p><code>cpp_process_json_vector<\/code> \u2014 \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>cpp_process_json_str<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0414\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0440\u0430\u0437\u043d\u043e\u0446\u0432\u0435\u0442\u043d\u044b\u0445 \u043b\u0438\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0446\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c HSV \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0435\u0439 \u0432 RGB. \u041f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">arr &lt;- cpp_process_json_str(tmp_data[4, drawing])\ndim(arr)\n# [1] 256 256   3\nplot(magick::image_read(arr))<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Quick Draw Doodle Recognition: \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c R, C++ \u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0438\" src=\"\/wp-content\/uploads\/2019\/03\/d56f47a605a33a31cc215743f00cea11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b class=\"spoiler_title\">\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043d\u0430 R \u0438 \u0421++<\/b><\/p>\n<pre><code class=\"plaintext\">res_bench &lt;- bench::mark(\n  r_process_json_str(tmp_data[4, drawing], scale = 0.5),\n  cpp_process_json_str(tmp_data[4, drawing], scale = 0.5),\n  check = FALSE,\n  min_iterations = 100\n)\n# \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\ncols &lt;- c(\"expression\", \"min\", \"median\", \"max\", \"itr\/sec\", \"total_time\", \"n_itr\")\nres_bench[, cols]\n\n#   expression                min     median       max `itr\/sec` total_time  n_itr\n#   &lt;chr&gt;                &lt;bch:tm&gt;   &lt;bch:tm&gt;  &lt;bch:tm&gt;     &lt;dbl&gt;   &lt;bch:tm&gt;  &lt;int&gt;\n# 1 r_process_json_str     3.49ms     3.55ms    4.47ms      273.      490ms    134\n# 2 cpp_process_json_str   1.94ms     2.02ms    5.32ms      489.      497ms    243\n\nlibrary(ggplot2)\n# \u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430\nres_bench &lt;- bench::press(\n  batch_size = 2^(4:10),\n  {\n    .data &lt;- tmp_data[sample(seq_len(.N), batch_size), drawing]\n    bench::mark(\n      r_process_json_vector(.data, scale = 0.5),\n      cpp_process_json_vector(.data,  scale = 0.5),\n      min_iterations = 50,\n      check = FALSE\n    )\n  }\n)\n\nres_bench[, cols]\n\n#    expression   batch_size      min   median      max `itr\/sec` total_time n_itr\n#    &lt;chr&gt;             &lt;dbl&gt; &lt;bch:tm&gt; &lt;bch:tm&gt; &lt;bch:tm&gt;     &lt;dbl&gt;   &lt;bch:tm&gt; &lt;int&gt;\n#  1 r                   16   50.61ms  53.34ms  54.82ms    19.1     471.13ms     9\n#  2 cpp                 16    4.46ms   5.39ms   7.78ms   192.      474.09ms    91\n#  3 r                   32   105.7ms 109.74ms 212.26ms     7.69        6.5s    50\n#  4 cpp                 32    7.76ms  10.97ms  15.23ms    95.6     522.78ms    50\n#  5 r                   64  211.41ms 226.18ms 332.65ms     3.85      12.99s    50\n#  6 cpp                 64   25.09ms  27.34ms  32.04ms    36.0        1.39s    50\n#  7 r                  128   534.5ms 627.92ms 659.08ms     1.61      31.03s    50\n#  8 cpp                128   56.37ms  58.46ms  66.03ms    16.9        2.95s    50\n#  9 r                  256     1.15s    1.18s    1.29s     0.851     58.78s    50\n# 10 cpp                256  114.97ms 117.39ms 130.09ms     8.45       5.92s    50\n# 11 r                  512     2.09s    2.15s    2.32s     0.463       1.8m    50\n# 12 cpp                512  230.81ms  235.6ms 261.99ms     4.18      11.97s    50\n# 13 r                 1024        4s    4.22s     4.4s     0.238       3.5m    50\n# 14 cpp               1024  410.48ms 431.43ms 462.44ms     2.33      21.45s    50\n\nggplot(res_bench, aes(x = factor(batch_size), y = median, \n                      group =  expression, color = expression)) +\n  geom_point() +\n  geom_line() +\n  ylab(\"median time, s\") +\n  theme_minimal() +\n  scale_color_discrete(name = \"\", labels = c(\"cpp\", \"r\")) +\n  theme(legend.position = \"bottom\") <\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Quick Draw Doodle Recognition: \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c R, C++ \u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0438\" src=\"\/wp-content\/uploads\/2019\/03\/0aef3ada4b3a529cedbf7782ddaf1e0d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0438 \u0434\u043e\u0433\u043d\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 C++ \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043d\u0430 R \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c.<\/p>\n<p><\/p>\n<h4 id=\"section3\">3. \u0418\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0430\u0442\u0447\u0435\u0439 \u0438\u0437 \u0411\u0414<\/h4>\n<p><\/p>\n<p>R \u0438\u043c\u0435\u0435\u0442 \u0437\u0430\u0441\u043b\u0443\u0436\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u043f\u0443\u0442\u0430\u0446\u0438\u044e \u044f\u0437\u044b\u043a\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u041e\u0417\u0423, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0434\u043b\u044f \u041f\u0438\u0442\u043e\u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043b\u0435\u0433\u043a\u043e \u0438 \u043d\u0435\u043f\u0440\u0438\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c out-of-core \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f (\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438). \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u0441 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0442\u0430\u043a\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438, \u043e\u0431\u0443\u0447\u0430\u0435\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0441\u043f\u0443\u0441\u043a\u0430 \u0441 \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043e\u0440\u0446\u0438\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439, \u0438\u043b\u0438 \u043c\u0438\u043d\u0438-\u0431\u0430\u0442\u0447\u0443.<\/p>\n<p><\/p>\n<p>\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 Python, \u0438\u043c\u0435\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u043e \u0434\u0430\u043d\u043d\u044b\u043c: \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438, \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c \u0432 \u043f\u0430\u043f\u043a\u0430\u0445, \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c \u0438 \u043f\u0440. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438\u043b\u0438 \u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. \u0412 R \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <strong>keras<\/strong> \u0441 \u0435\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0431\u0435\u043a\u0435\u043d\u0434\u0430\u043c\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u0430\u043a\u0435\u0442\u0430 <strong>reticulate<\/strong>. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438; \u043e\u043d \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 Python \u0438\u0437 R, \u043d\u043e \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 R- \u0438 Python-\u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438, \u0430\u0432\u0442\u043e\u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432.<\/p>\n<p><\/p>\n<p>\u041e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u041e\u0417\u0423 \u043c\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0437\u0430 \u0441\u0447\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f MonetDBLite, \u0432\u0441\u044e &#171;\u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0432\u0443\u044e&#187; \u0440\u0430\u0431\u043e\u0442\u0443 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 Python, \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e \u0434\u0430\u043d\u043d\u044b\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u043d\u0435\u0442 \u043d\u0438 \u043d\u0430 R, \u043d\u0438 \u043d\u0430 Python. \u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043a \u043d\u0435\u043c\u0443 \u043f\u043e \u0441\u0443\u0442\u0438 \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430: \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0431\u0430\u0442\u0447\u0438 \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432 R \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439). \u0420\u0430\u043d\u0435\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u044f\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u044b R \u0432 numpy-\u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u043d\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430 <strong>keras<\/strong> \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u0430\u043c\u0430.<\/p>\n<p><\/p>\n<p>\u0418\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0418\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<pre><code class=\"plaintext\">train_generator &lt;- function(db_connection = con,\n                            samples_index,\n                            num_classes = 340,\n                            batch_size = 32,\n                            scale = 1,\n                            color = FALSE,\n                            imagenet_preproc = FALSE) {\n  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n  checkmate::assert_class(con, \"DBIConnection\")\n  checkmate::assert_integerish(samples_index)\n  checkmate::assert_count(num_classes)\n  checkmate::assert_count(batch_size)\n  checkmate::assert_number(scale, lower = 0.001, upper = 5)\n  checkmate::assert_flag(color)\n  checkmate::assert_flag(imagenet_preproc)\n\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0431\u0440\u0430\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0431\u0430\u0442\u0447\u0435\u0439 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443\n  dt &lt;- data.table::data.table(id = sample(samples_index))\n  # \u041f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430 \u0431\u0430\u0442\u0447\u0435\u0439\n  dt[, batch := (.I - 1L) %\/% batch_size + 1L]\n  # \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043d\u044b\u0435 \u0431\u0430\u0442\u0447\u0438 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c\n  dt &lt;- dt[, if (.N == batch_size) .SD, keyby = batch]\n  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a\n  i &lt;- 1\n  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0442\u0447\u0435\u0439\n  max_i &lt;- dt[, max(batch)]\n\n  # \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438\n  sql &lt;- sprintf(\n    \"PREPARE SELECT drawing, label_int FROM doodles WHERE id IN (%s)\",\n    paste(rep(\"?\", batch_size), collapse = \",\")\n  )\n  res &lt;- DBI::dbSendQuery(con, sql)\n\n  # \u0410\u043d\u0430\u043b\u043e\u0433 keras::to_categorical\n  to_categorical &lt;- function(x, num) {\n    n &lt;- length(x)\n    m &lt;- numeric(n * num)\n    m[x * n + seq_len(n)] &lt;- 1\n    dim(m) &lt;- c(n, num)\n    return(m)\n  }\n\n  # \u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\n  function() {\n    # \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u044d\u043f\u043e\u0445\u0443\n    if (i &gt; max_i) {\n      dt[, id := sample(id)]\n      data.table::setkey(dt, batch)\n      # \u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a\n      i &lt;&lt;- 1\n      max_i &lt;&lt;- dt[, max(batch)]\n    }\n\n    # ID \u0434\u043b\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n    batch_ind &lt;- dt[batch == i, id]\n    # \u0412\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\n    batch &lt;- DBI::dbFetch(DBI::dbBind(res, as.list(batch_ind)), n = -1)\n\n    # \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a\n    i &lt;&lt;- i + 1\n\n    # \u041f\u0430\u0440\u0441\u0438\u043d\u0433 JSON \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    batch_x &lt;- cpp_process_json_vector(batch$drawing, scale = scale, color = color)\n    if (imagenet_preproc) {\n      # \u0428\u043a\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, 1] \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [-1, 1]\n      batch_x &lt;- (batch_x - 0.5) * 2\n    }\n\n    batch_y &lt;- to_categorical(batch$label_int, num_classes)\n    result &lt;- list(batch_x, batch_y)\n    return(result)\n  }\n}<\/code><\/pre>\n<p><\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c \u0441 \u0411\u0414, \u043d\u043e\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u0447\u0438\u0441\u043b\u043e \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u0442\u0447\u0430, \u043c\u0430\u0441\u0448\u0442\u0430\u0431 (<code>scale = 1<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a 256\u0445256 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, <code>scale = 0.5<\/code> \u2014 128\u0445128 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439), \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0446\u0432\u0435\u0442\u043d\u043e\u0441\u0442\u0438 (<code>color = FALSE<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0432 \u043e\u0442\u0442\u0435\u043d\u043a\u0430\u0445 \u0441\u0435\u0440\u043e\u0433\u043e, \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <code>color = TRUE<\/code> \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0442\u0440\u0438\u0445 \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c) \u0438 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433\u0430 \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0439, \u043f\u0440\u0435\u0434\u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 imagenet-\u0435. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0448\u043a\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, 1] \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [-1, 1], \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 <strong>keras<\/strong> \u043c\u043e\u0434\u0435\u043b\u0435\u0439.<\/p>\n<p><\/p>\n<p>\u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <code>data.table<\/code> \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a \u0438\u0437 <code>samples_index<\/code> \u0438 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0431\u0430\u0442\u0447\u0435\u0439, \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0431\u0430\u0442\u0447\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 SQL-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>keras::to_categorical()<\/code>. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u043f\u043e\u043b\u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u043f\u043e\u0445\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u043b\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>steps_per_epoch<\/code> \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>keras::fit_generator()<\/code>, \u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 <code>if (i &gt; max_i)<\/code> \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430.<\/p>\n<p><\/p>\n<p>\u0412\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u0434\u043b\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u0442\u0447\u0430, \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438\u0437 \u0411\u0414 \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0431\u0430\u0442\u0447\u0435\u0439, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 JSON-\u043e\u0432 (\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>cpp_process_json_vector()<\/code>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043d\u0430 C++) \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c. \u0417\u0430\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f one-hot \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0441 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438 \u0441 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 <code>data.table<\/code> \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u2014 \u0431\u0435\u0437 \u044d\u0442\u0438\u0445 &#171;\u0444\u0438\u0448\u0435\u043a&#187; \u043f\u0430\u043a\u0435\u0442\u0430 <strong>data.table<\/strong> \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 R.<\/p>\n<p><\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430 \u043d\u043e\u0443\u0442\u0431\u0443\u0447\u043d\u043e\u043c Core i5 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/b><\/p>\n<pre><code class=\"plaintext\">library(Rcpp)\nlibrary(keras)\nlibrary(ggplot2)\n\nsource(\"utils\/rcpp.R\")\nsource(\"utils\/keras_iterator.R\")\n\ncon &lt;- DBI::dbConnect(drv = MonetDBLite::MonetDBLite(), Sys.getenv(\"DBDIR\"))\n\nind &lt;- seq_len(DBI::dbGetQuery(con, \"SELECT count(*) FROM doodles\")[[1L]])\nnum_classes &lt;- DBI::dbGetQuery(con, \"SELECT max(label_int) + 1 FROM doodles\")[[1L]]\n\n# \u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438\ntrain_ind &lt;- sample(ind, floor(length(ind) * 0.995))\n# \u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438\nval_ind &lt;- ind[-train_ind]\nrm(ind)\n# \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\nscale &lt;- 0.5\n\n# \u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430\nres_bench &lt;- bench::press(\n  batch_size = 2^(4:10),\n  {\n    it1 &lt;- train_generator(\n      db_connection = con,\n      samples_index = train_ind,\n      num_classes = num_classes,\n      batch_size = batch_size,\n      scale = scale\n    )\n    bench::mark(\n      it1(),\n      min_iterations = 50L\n    )\n  }\n)\n# \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\ncols &lt;- c(\"batch_size\", \"min\", \"median\", \"max\", \"itr\/sec\", \"total_time\", \"n_itr\")\nres_bench[, cols]\n\n#   batch_size      min   median      max `itr\/sec` total_time n_itr\n#        &lt;dbl&gt; &lt;bch:tm&gt; &lt;bch:tm&gt; &lt;bch:tm&gt;     &lt;dbl&gt;   &lt;bch:tm&gt; &lt;int&gt;\n# 1         16     25ms  64.36ms   92.2ms     15.9       3.09s    49\n# 2         32   48.4ms 118.13ms 197.24ms     8.17       5.88s    48\n# 3         64   69.3ms 117.93ms 181.14ms     8.57       5.83s    50\n# 4        128  157.2ms 240.74ms 503.87ms     3.85      12.71s    49\n# 5        256  359.3ms 613.52ms 988.73ms     1.54       30.5s    47\n# 6        512  884.7ms    1.53s    2.07s     0.674      1.11m    45\n# 7       1024     2.7s    3.83s    5.47s     0.261      2.81m    44\n\nggplot(res_bench, aes(x = factor(batch_size), y = median, group = 1)) +\n    geom_point() +\n    geom_line() +\n    ylab(\"median time, s\") +\n    theme_minimal()\n\nDBI::dbDisconnect(con, shutdown = TRUE)<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Quick Draw Doodle Recognition: \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c R, C++ \u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0438\" src=\"\/wp-content\/uploads\/2019\/03\/e074867691e2560d19462c206a4909dd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u041e\u0417\u0423, \u043c\u043e\u0436\u043d\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u043c \u0435\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0432 \u044d\u0442\u0443 \u0441\u0430\u043c\u0443\u044e \u041e\u0417\u0423 (\u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 32 \u0413\u0431). \u0412 \u043b\u0438\u043d\u0443\u043a\u0441\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b <code>\/dev\/shm<\/code>, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0434\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043e\u0431\u044a\u0435\u043c\u0430 \u041e\u0417\u0423. \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0432 <code>\/etc\/fstab<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u0438\u0434\u0430 <code>tmpfs \/dev\/shm tmpfs defaults,size=25g 0 0<\/code>. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u0441\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>df -h<\/code>.<\/p>\n<p><\/p>\n<p>\u0418\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u041e\u0417\u0423:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0418\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<pre><code class=\"plaintext\">test_generator &lt;- function(dt,\n                           batch_size = 32,\n                           scale = 1,\n                           color = FALSE,\n                           imagenet_preproc = FALSE) {\n\n  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n  checkmate::assert_data_table(dt)\n  checkmate::assert_count(batch_size)\n  checkmate::assert_number(scale, lower = 0.001, upper = 5)\n  checkmate::assert_flag(color)\n  checkmate::assert_flag(imagenet_preproc)\n\n  # \u041f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430 \u0431\u0430\u0442\u0447\u0435\u0439\n  dt[, batch := (.I - 1L) %\/% batch_size + 1L]\n  data.table::setkey(dt, batch)\n  i &lt;- 1\n  max_i &lt;- dt[, max(batch)]\n\n  # \u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\n  function() {\n    batch_x &lt;- cpp_process_json_vector(dt[batch == i, drawing], \n                                       scale = scale, color = color)\n    if (imagenet_preproc) {\n      # \u0428\u043a\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, 1] \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [-1, 1]\n      batch_x &lt;- (batch_x - 0.5) * 2\n    }\n    result &lt;- list(batch_x)\n    i &lt;&lt;- i + 1\n    return(result)\n  }\n}<\/code><\/pre>\n<p><\/p>\n<h4 id=\"section4\">4. \u0412\u044b\u0431\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438<\/h4>\n<p><\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0439 \u0438\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u0431\u044b\u043b\u0430 <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1704.04861\">mobilenet v1<\/a><\/noindex>, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u044b \u0432 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/352804\/\">\u044d\u0442\u043e\u043c<\/a><\/noindex> \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438. \u041e\u043d\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 <strong>keras<\/strong> \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435 \u0434\u043b\u044f R. \u041d\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0441 \u043e\u0434\u043d\u043e\u043a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435: \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u043d\u0437\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c <code>(batch, height, width, 3)<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u0412 Python \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u0441\u043f\u0435\u0448\u0438\u043b\u0438 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u0441\u043b\u0435\u0434\u0443\u044f \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 (\u0431\u0435\u0437 \u0434\u0440\u043e\u043f\u0430\u0443\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0441\u0442\u044c \u0432 keras-\u043e\u0432\u0441\u043a\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435):<\/p>\n<p>\n<b class=\"spoiler_title\">\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 mobilenet v1<\/b><\/p>\n<pre><code class=\"plaintext\">library(keras)\n\ntop_3_categorical_accuracy &lt;- custom_metric(\n    name = \"top_3_categorical_accuracy\",\n    metric_fn = function(y_true, y_pred) {\n         metric_top_k_categorical_accuracy(y_true, y_pred, k = 3)\n    }\n)\n\nlayer_sep_conv_bn &lt;- function(object, \n                              filters,\n                              alpha = 1,\n                              depth_multiplier = 1,\n                              strides = c(2, 2)) {\n\n  # NB! depth_multiplier !=  resolution multiplier\n  # https:\/\/github.com\/keras-team\/keras\/issues\/10349\n\n  layer_depthwise_conv_2d(\n    object = object,\n    kernel_size = c(3, 3), \n    strides = strides,\n    padding = \"same\",\n    depth_multiplier = depth_multiplier\n  ) %&gt;%\n  layer_batch_normalization() %&gt;% \n  layer_activation_relu() %&gt;%\n  layer_conv_2d(\n    filters = filters * alpha,\n    kernel_size = c(1, 1), \n    strides = c(1, 1)\n  ) %&gt;%\n  layer_batch_normalization() %&gt;% \n  layer_activation_relu() \n}\n\nget_mobilenet_v1 &lt;- function(input_shape = c(224, 224, 1),\n                             num_classes = 340,\n                             alpha = 1,\n                             depth_multiplier = 1,\n                             optimizer = optimizer_adam(lr = 0.002),\n                             loss = \"categorical_crossentropy\",\n                             metrics = c(\"categorical_crossentropy\",\n                                         top_3_categorical_accuracy)) {\n\n  inputs &lt;- layer_input(shape = input_shape)\n\n  outputs &lt;- inputs %&gt;%\n    layer_conv_2d(filters = 32, kernel_size = c(3, 3), strides = c(2, 2), padding = \"same\") %&gt;%\n    layer_batch_normalization() %&gt;% \n    layer_activation_relu() %&gt;%\n    layer_sep_conv_bn(filters = 64, strides = c(1, 1)) %&gt;%\n    layer_sep_conv_bn(filters = 128, strides = c(2, 2)) %&gt;%\n    layer_sep_conv_bn(filters = 128, strides = c(1, 1)) %&gt;%\n    layer_sep_conv_bn(filters = 256, strides = c(2, 2)) %&gt;%\n    layer_sep_conv_bn(filters = 256, strides = c(1, 1)) %&gt;%\n    layer_sep_conv_bn(filters = 512, strides = c(2, 2)) %&gt;%\n    layer_sep_conv_bn(filters = 512, strides = c(1, 1)) %&gt;%\n    layer_sep_conv_bn(filters = 512, strides = c(1, 1)) %&gt;%\n    layer_sep_conv_bn(filters = 512, strides = c(1, 1)) %&gt;%\n    layer_sep_conv_bn(filters = 512, strides = c(1, 1)) %&gt;%\n    layer_sep_conv_bn(filters = 512, strides = c(1, 1)) %&gt;%\n    layer_sep_conv_bn(filters = 1024, strides = c(2, 2)) %&gt;%\n    layer_sep_conv_bn(filters = 1024, strides = c(1, 1)) %&gt;%\n    layer_global_average_pooling_2d() %&gt;%\n    layer_dense(units = num_classes) %&gt;%\n    layer_activation_softmax()\n\n    model &lt;- keras_model(\n      inputs = inputs,\n      outputs = outputs\n    )\n\n    model %&gt;% compile(\n      optimizer = optimizer,\n      loss = loss,\n      metrics = metrics\n    )\n\n    return(model)\n}<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b. \u041c\u043e\u0434\u0435\u043b\u0435\u0439 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e, \u0430 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0431\u044b\u043b\u0438 \u043b\u0438\u0448\u0435\u043d\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 imagenet-\u0435. \u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u043f\u043e\u043c\u043e\u0433\u043b\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>get_config()<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u043c \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0438\u0434\u0435 (<code>base_model_conf$layers<\/code> \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 R-\u043e\u0432\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a), \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>from_config()<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">base_model_conf &lt;- get_config(base_model)\nbase_model_conf$layers[[1]]$config$batch_input_shape[[4]] &lt;- 1L\nbase_model &lt;- from_config(base_model_conf)<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0440\u0443\u0434\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 <strong>keras<\/strong> \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441 \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 imagenet-\u0435 \u0432\u0435\u0441\u0430\u043c\u0438 \u0438\u043b\u0438 \u0431\u0435\u0437 \u043d\u0438\u0445:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440<\/b><\/p>\n<pre><code class=\"plaintext\">get_model &lt;- function(name = \"mobilenet_v2\",\n                      input_shape = NULL,\n                      weights = \"imagenet\",\n                      pooling = \"avg\",\n                      num_classes = NULL,\n                      optimizer = keras::optimizer_adam(lr = 0.002),\n                      loss = \"categorical_crossentropy\",\n                      metrics = NULL,\n                      color = TRUE,\n                      compile = FALSE) {\n  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n  checkmate::assert_string(name)\n  checkmate::assert_integerish(input_shape, lower = 1, upper = 256, len = 3)\n  checkmate::assert_count(num_classes)\n  checkmate::assert_flag(color)\n  checkmate::assert_flag(compile)\n\n  # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 keras\n  model_fun &lt;- get0(paste0(\"application_\", name), envir = asNamespace(\"keras\"))\n  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043f\u0430\u043a\u0435\u0442\u0435\n  if (is.null(model_fun)) {\n    stop(\"Model \", shQuote(name), \" not found.\", call. = FALSE)\n  }\n\n  base_model &lt;- model_fun(\n    input_shape = input_shape,\n    include_top = FALSE,\n    weights = weights,\n    pooling = pooling\n  )\n\n  # \u0415\u0441\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0446\u0432\u0435\u0442\u043d\u043e\u0435, \u043c\u0435\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0432\u0445\u043e\u0434\u0430\n  if (!color) {\n    base_model_conf &lt;- keras::get_config(base_model)\n    base_model_conf$layers[[1]]$config$batch_input_shape[[4]] &lt;- 1L\n    base_model &lt;- keras::from_config(base_model_conf)\n  }\n\n  predictions &lt;- keras::get_layer(base_model, \"global_average_pooling2d_1\")$output\n  predictions &lt;- keras::layer_dense(predictions, units = num_classes, activation = \"softmax\")\n  model &lt;- keras::keras_model(\n    inputs = base_model$input,\n    outputs = predictions\n  )\n\n  if (compile) {\n    keras::compile(\n      object = model,\n      optimizer = optimizer,\n      loss = loss,\n      metrics = metrics\n    )\n  }\n\n  return(model)\n}<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u043a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u0440\u0435\u0434\u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0441\u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c: \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>get_weights()<\/code> \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0435\u0441\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0437 R-\u043e\u0432\u0441\u043a\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 (\u0432\u0437\u044f\u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0434\u0438\u043d \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u043a\u0430\u043d\u0430\u043b \u0438\u043b\u0438 \u0443\u0441\u0440\u0435\u0434\u043d\u0438\u0432 \u0432\u0441\u0435 \u0442\u0440\u0438), \u0430 \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0435\u0441\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043c\u043e\u0434\u0435\u043b\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>set_weights()<\/code>. \u041c\u044b \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0442\u0430\u043a \u0438 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0446\u0432\u0435\u0442\u043d\u044b\u043c\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438.<\/p>\n<p><\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043c\u0430\u0441\u0441\u0443 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u044b \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043b\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c mobilenet \u0432\u0435\u0440\u0441\u0438\u0438 1 \u0438 2, \u0430 \u0442\u0430\u043a\u0436\u0435 resnet34. \u0412 \u044d\u0442\u043e\u043c \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u0435\u0431\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a SE-ResNeXt. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0430 \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u044b \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 (\u043d\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u043c).<\/p>\n<p><\/p>\n<h4 id=\"section5\">5. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/h4>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u044b\u043b \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d \u0432 \u0432\u0438\u0434\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <strong><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/docopt\/docopt.R\">docopt<\/a><\/noindex><\/strong> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">doc &lt;- '\nUsage:\n  train_nn.R --help\n  train_nn.R --list-models\n  train_nn.R [options]\n\nOptions:\n  -h --help                   Show this message.\n  -l --list-models            List available models.\n  -m --model=&lt;model&gt;          Neural network model name [default: mobilenet_v2].\n  -b --batch-size=&lt;size&gt;      Batch size [default: 32].\n  -s --scale-factor=&lt;ratio&gt;   Scale factor [default: 0.5].\n  -c --color                  Use color lines [default: FALSE].\n  -d --db-dir=&lt;path&gt;          Path to database directory [default: Sys.getenv(\"db_dir\")].\n  -r --validate-ratio=&lt;ratio&gt; Validate sample ratio [default: 0.995].\n  -n --n-gpu=&lt;number&gt;         Number of GPUs [default: 1].\n'\nargs &lt;- docopt::docopt(doc)<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u0430\u043a\u0435\u0442 <strong>docopt<\/strong> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <noindex><a rel=\"nofollow\" href=\"http:\/\/docopt.org\/\">http:\/\/docopt.org\/<\/a><\/noindex> \u0434\u043b\u044f R. \u0421 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0432\u0438\u0434\u0430 <code>Rscript bin\/train_nn.R -m resnet50 -c -d \/home\/andrey\/doodle_db<\/code> \u0438\u043b\u0438 <code>.\/bin\/train_nn.R -m resnet50 -c -d \/home\/andrey\/doodle_db<\/code>, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b <code>train_nn.R<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u043c (\u044d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 <code>resnet50<\/code> \u043d\u0430 \u0442\u0440\u0435\u0445\u0446\u0432\u0435\u0442\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 128\u0445128 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 <code>\/home\/andrey\/doodle_db<\/code>). \u0412 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0432\u0438\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0438 \u043b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 <code>mobilenet_v2<\/code> \u0438\u0437 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <strong>keras<\/strong> \u0432 R \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rstudio\/keras\/issues\/714\">\u043d\u0435\u043b\u044c\u0437\u044f<\/a><\/noindex> \u0438\u0437-\u0437\u0430 \u043d\u0435\u0443\u0447\u0442\u0435\u043d\u043d\u044b\u0445 \u0432 R-\u043f\u0430\u043a\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u2014 \u0436\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u043f\u043e\u0444\u0438\u043a\u0441\u044f\u0442.<\/p>\n<p><\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0431\u043e\u043b\u0435\u0435 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432 RStudio (\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u043e\u0442\u043c\u0435\u0442\u0438\u043c \u043f\u0430\u043a\u0435\u0442 <strong><noindex><a rel=\"nofollow\" href=\"https:\/\/tensorflow.rstudio.com\/tools\/tfruns\/articles\/overview.html\">tfruns<\/a><\/noindex><\/strong>). \u041d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043b\u0435\u0433\u043a\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432 \u0434\u043e\u043a\u0435\u0440\u0435 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e RStudio. <\/p>\n<p><\/p>\n<h4 id=\"section6\">6. \u0414\u043e\u043a\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/h4>\n<p><\/p>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043e\u043a\u0435\u0440 \u0441 \u0446\u0435\u043b\u044c\u044e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0440\u0435\u0434\u044b \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0447\u043b\u0435\u043d\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0432 \u043e\u0431\u043b\u0430\u043a\u0435. \u041d\u0430\u0447\u0430\u0442\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u044d\u0442\u0438\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u0434\u043b\u044f R-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0441 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/438796\/\">\u044d\u0442\u043e\u0439<\/a><\/noindex> \u0441\u0435\u0440\u0438\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u0438\u043b\u0438 \u0441 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=3ODGMMVYq78&amp;list=PLQJ7ptkRY-xYLEAC5Y_sKqrJ9RA-U7Dja\">\u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441\u0430<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>\u0414\u043e\u043a\u0435\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u00ab\u0441 \u043d\u0443\u043b\u044f\u00bb, \u0442\u0430\u043a \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445. \u041f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 NVIDIA, CUDA+cuDNN \u0438 \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u2014 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u0451\u043c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u0430, \u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 <code>tensorflow\/tensorflow:1.12.0-gpu<\/code>, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0442\u0443\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 R-\u043f\u0430\u043a\u0435\u0442\u044b.<\/p>\n<p><\/p>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0434\u043e\u043a\u0435\u0440-\u0444\u0430\u0439\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0442\u0430\u043a\u0438\u043c:<\/p>\n<p>\n<b class=\"spoiler_title\">Dockerfile<\/b><\/p>\n<pre><code class=\"plaintext\">FROM tensorflow\/tensorflow:1.12.0-gpu\n\nMAINTAINER Artem Klevtsov &lt;a.a.klevtsov@gmail.com&gt;\n\nSHELL [\"\/bin\/bash\", \"-c\"]\n\nARG LOCALE=\"en_US.UTF-8\"\nARG APT_PKG=\"libopencv-dev r-base r-base-dev littler\"\nARG R_BIN_PKG=\"futile.logger checkmate data.table rcpp rapidjsonr dbi keras jsonlite curl digest remotes\"\nARG R_SRC_PKG=\"xtensor RcppThread docopt MonetDBLite\"\nARG PY_PIP_PKG=\"keras\"\nARG DIRS=\"\/db \/app \/app\/data \/app\/models \/app\/logs\"\n\nRUN source \/etc\/os-release &amp;&amp; \n    echo \"deb https:\/\/cloud.r-project.org\/bin\/linux\/ubuntu ${UBUNTU_CODENAME}-cran35\/\" &gt; \/etc\/apt\/sources.list.d\/cran35.list &amp;&amp; \n    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 &amp;&amp; \n    add-apt-repository -y ppa:marutter\/c2d4u3.5 &amp;&amp; \n    add-apt-repository -y ppa:timsc\/opencv-3.4 &amp;&amp; \n    apt-get update &amp;&amp; \n    apt-get install -y locales &amp;&amp; \n    locale-gen ${LOCALE} &amp;&amp; \n    apt-get install -y --no-install-recommends ${APT_PKG} &amp;&amp; \n    ln -s \/usr\/lib\/R\/site-library\/littler\/examples\/install.r \/usr\/local\/bin\/install.r &amp;&amp; \n    ln -s \/usr\/lib\/R\/site-library\/littler\/examples\/install2.r \/usr\/local\/bin\/install2.r &amp;&amp; \n    ln -s \/usr\/lib\/R\/site-library\/littler\/examples\/installGithub.r \/usr\/local\/bin\/installGithub.r &amp;&amp; \n    echo 'options(Ncpus = parallel::detectCores())' &gt;&gt; \/etc\/R\/Rprofile.site &amp;&amp; \n    echo 'options(repos = c(CRAN = \"https:\/\/cloud.r-project.org\"))' &gt;&gt; \/etc\/R\/Rprofile.site &amp;&amp; \n    apt-get install -y $(printf \"r-cran-%s \" ${R_BIN_PKG}) &amp;&amp; \n    install.r ${R_SRC_PKG} &amp;&amp; \n    pip install ${PY_PIP_PKG} &amp;&amp; \n    mkdir -p ${DIRS} &amp;&amp; \n    chmod 777 ${DIRS} &amp;&amp; \n    rm -rf \/tmp\/downloaded_packages\/ \/tmp\/*.rds &amp;&amp; \n    rm -rf \/var\/lib\/apt\/lists\/*\n\nCOPY utils \/app\/utils\nCOPY src \/app\/src\nCOPY tests \/app\/tests\nCOPY bin\/*.R \/app\/\n\nENV DBDIR=\"\/db\"\nENV CUDA_HOME=\"\/usr\/local\/cuda\"\nENV PATH=\"\/app:${PATH}\"\n\nWORKDIR \/app\n\nVOLUME \/db\nVOLUME \/app\n\nCMD bash\n<\/code><\/pre>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0431\u044b\u043b\u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435; \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 \u043d\u0430 <code>\/bin\/bash<\/code> \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e <code>\/etc\/os-release<\/code>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u041e\u0421 \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p><\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0430\u0448-\u0441\u043a\u0440\u0438\u043f\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439, \u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0438\u043b\u0438 \u0436\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0430\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/b><\/p>\n<pre><code class=\"plaintext\">#!\/bin\/sh\n\nDBDIR=${PWD}\/db\nLOGSDIR=${PWD}\/logs\nMODELDIR=${PWD}\/models\nDATADIR=${PWD}\/data\nARGS=\"--runtime=nvidia --rm -v ${DBDIR}:\/db -v ${LOGSDIR}:\/app\/logs -v ${MODELDIR}:\/app\/models -v ${DATADIR}:\/app\/data\"\n\nif [ -z \"$1\" ]; then\n    CMD=\"Rscript \/app\/train_nn.R\"\nelif [ \"$1\" = \"bash\" ]; then\n    ARGS=\"${ARGS} -ti\"\nelse\n    CMD=\"Rscript \/app\/train_nn.R $@\"\nfi\n\ndocker run ${ARGS} doodles-tf ${CMD}<\/code><\/pre>\n<p><\/p>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0431\u0430\u0448-\u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u0441\u043a\u0440\u0438\u043f\u0442 <code>train_nn.R<\/code> \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e; \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e &#171;bash&#187;, \u0442\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u043e\u0439. \u0412\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432: <code>CMD=\"Rscript \/app\/train_nn.R $@\"<\/code>.<\/p>\n<p><\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438\u0437 \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439.<\/p>\n<p><\/p>\n<h4 id=\"section7\">7. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 GPU \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 Google Cloud<\/h4>\n<p><\/p>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u0448\u0443\u043c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u0441\u043c. \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0443 @Leigh.plt \u0438\u0437 ODS-\u0441\u043b\u0430\u043a\u0430). \u0411\u043e\u0440\u043e\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0431\u0430\u0442\u0447\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0438 \u043c\u044b \u043f\u043e\u0441\u043b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u041f\u041a \u0441 1 GPU \u0440\u0435\u0448\u0438\u043b\u0438 \u043e\u0441\u0432\u043e\u0438\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 GPU \u0432 \u043e\u0431\u043b\u0430\u043a\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 GoogleCloud (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/341446\/\">\u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u044b<\/a><\/noindex>) \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439, \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b\u0445 \u0446\u0435\u043d \u0438 \u0431\u043e\u043d\u0443\u0441\u043d\u044b\u0445 $300. \u041e\u0442 \u0436\u0430\u0434\u043d\u043e\u0441\u0442\u0438 \u0431\u044b\u043b \u0437\u0430\u043a\u0430\u0437\u0430\u043d \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0441 4\u0445V100 \u0441 SSD \u0438 \u043a\u0443\u0447\u0435\u0439 \u041e\u0417\u0423, \u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0414\u0435\u043d\u044c\u0433\u0438 \u0442\u0430\u043a\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043a\u0443\u0448\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e, \u043d\u0430 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u0445 \u0431\u0435\u0437 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0440\u0438\u0442\u044c\u0441\u044f. \u0421 \u0443\u0447\u0435\u0431\u043d\u044b\u043c\u0438 \u0446\u0435\u043b\u044f\u043c\u0438 \u043b\u0443\u0447\u0448\u0435 \u0431\u0440\u0430\u0442\u044c K80. \u0410 \u0432\u043e\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u041e\u0417\u0423 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f \u2014 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 SSD \u043d\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0438\u043b \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439c\u0442\u0432\u0438\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043b\u0438 \u043d\u0430 <code>dev\/shm<\/code>.<\/p>\n<p><\/p>\n<p>\u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043a\u043e\u0434\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 GPU. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 CPU \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u0430\u043a \u043d\u0430 \u041f\u0438\u0442\u043e\u043d\u0435:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">with(tensorflow::tf$device(\"\/cpu:0\"), {\n  model_cpu &lt;- get_model(\n    name = model_name,\n    input_shape = input_shape,\n    weights = weights,\n    metrics =(top_3_categorical_accuracy,\n    compile = FALSE\n  )\n})<\/code><\/pre>\n<p><\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f (\u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e) \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 GPU, \u0438 \u043b\u0438\u0448\u044c \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">model &lt;- keras::multi_gpu_model(model_cpu, gpus = n_gpu)\nkeras::compile(\n  object = model,\n  optimizer = keras::optimizer_adam(lr = 0.0004),\n  loss = \"categorical_crossentropy\",\n  metrics = c(top_3_categorical_accuracy)\n)<\/code><\/pre>\n<p><\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u0435\u043c \u0441 \u0437\u0430\u043c\u043e\u0440\u043e\u0437\u043a\u043e\u0439 \u0432\u0441\u0435\u0445 \u0441\u043b\u043e\u0435\u0432, \u043a\u0440\u043e\u043c\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e, \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043b\u043e\u044f, \u0440\u0430\u0437\u043c\u043e\u0440\u043e\u0437\u043a\u043e\u0439 \u0438 \u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 GPU \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p><\/p>\n<p>\u0417\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u043b\u0435\u0434\u0438\u043b\u0438 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <strong>tensorboard<\/strong>, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0448\u0438\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u043b\u043e\u0433\u043e\u0432 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u044d\u043f\u043e\u0445\u0438:<\/p>\n<p>\n<b class=\"spoiler_title\">\u041a\u043e\u043b\u0431\u044d\u043a\u0438<\/b><\/p>\n<pre><code class=\"plaintext\"># \u0428\u0430\u0431\u043b\u043e\u043d \u0438\u043c\u0435\u043d\u0438 \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u0430\nlog_file_tmpl &lt;- file.path(\"logs\", sprintf(\n  \"%s_%d_%dch_%s.csv\",\n  model_name,\n  dim_size,\n  channels,\n  format(Sys.time(), \"%Y%m%d%H%M%OS\")\n))\n# \u0428\u0430\u0431\u043b\u043e\u043d \u0438\u043c\u0435\u043d\u0438 \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\nmodel_file_tmpl &lt;- file.path(\"models\", sprintf(\n  \"%s_%d_%dch_{epoch:02d}_{val_loss:.2f}.h5\",\n  model_name,\n  dim_size,\n  channels\n))\n\ncallbacks_list &lt;- list(\n  keras::callback_csv_logger(\n    filename = log_file_tmpl\n  ),\n  keras::callback_early_stopping(\n    monitor = \"val_loss\",\n    min_delta = 1e-4,\n    patience = 8,\n    verbose = 1,\n    mode = \"min\"\n  ),\n  keras::callback_reduce_lr_on_plateau(\n    monitor = \"val_loss\",\n    factor = 0.5, # \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c lr \u0432 2 \u0440\u0430\u0437\u0430\n    patience = 4,\n    verbose = 1,\n    min_delta = 1e-4,\n    mode = \"min\"\n  ),\n  keras::callback_model_checkpoint(\n    filepath = model_file_tmpl,\n    monitor = \"val_loss\",\n    save_best_only = FALSE,\n    save_weights_only = FALSE,\n    mode = \"min\"\n  )\n)<\/code><\/pre>\n<p><\/p>\n<h4 id=\"section8\">8. \u0412\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h4>\n<p><\/p>\n<p>\u0420\u044f\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c, \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u044c \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/p>\n<p><\/p>\n<ul>\n<li>\u0432 <strong>keras<\/strong> \u043d\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f (\u0430\u043d\u0430\u043b\u043e\u0433\u0430 <code>lr_finder<\/code> \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <strong>fast.ai<\/strong>); \u043f\u0440\u0438\u043b\u043e\u0436\u0438\u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0441\u0438\u043b\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 R \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/jeremyjordan\/ac0229abd4b2b7000aca1643e88e0f02\">\u044d\u0442\u0443<\/a><\/noindex>;<\/li>\n<li>\u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430, \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 GPU;<\/li>\n<li>\u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 imagenet-\u0435;<\/li>\n<li>\u043d\u0435\u0442 one cycle policy \u0438 discriminative learning rates (\u0441osine annealing \u043f\u043e \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0441\u044c\u0431\u0435 \u0431\u044b\u043b <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rstudio\/keras\/issues\/604#issuecomment-441115962\">\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d<\/a><\/noindex>, \u0441\u043f\u0430\u0441\u0438\u0431\u043e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/skeydan\">skeydan<\/a><\/noindex>).<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0427\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<ul>\n<li>\u041d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e\u043c\u043e\u0449\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u0431\u043e\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u043c\u0438 (\u043a\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0438\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u041e\u0417\u0423) \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0430\u043a\u0435\u0442 <strong>data.table<\/strong> \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0437\u0430 \u0441\u0447\u0435\u0442 in-place \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0438\u0445 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043d\u0430\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0411\u0414 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0434\u0443\u043c\u0430\u0442\u044c \u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0442\u0438\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0432 \u041e\u0417\u0423.<\/li>\n<li>\u041c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 R \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u0438 \u043d\u0430 C++ \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 <strong>Rcpp<\/strong>. \u0415\u0441\u043b\u0438 \u0432\u0434\u043e\u0431\u0430\u0432\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>RcppThread<\/strong> \u0438\u043b\u0438 <strong>RcppParallel<\/strong>, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 R \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/li>\n<li>\u041f\u0430\u043a\u0435\u0442\u043e\u043c <strong>Rcpp<\/strong> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 C++, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0438\u0437\u043b\u043e\u0436\u0435\u043d <noindex><a rel=\"nofollow\" href=\"http:\/\/adv-r.had.co.nz\/Rcpp.html\">\u0437\u0434\u0435\u0441\u044c<\/a><\/noindex>. \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0440\u044f\u0434\u0430 \u043a\u0440\u0443\u0442\u044b\u0445 \u0441\u0438\u0448\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0442\u0438\u043f\u0430 <strong>xtensor<\/strong> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 CRAN, \u0442\u043e \u0435\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0432 R \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 C++. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u2014 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u043d\u0430 \u0421++ \u0432 RStudio.<\/li>\n<li><strong>docopt<\/strong> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0432 \u0442.\u0447. \u043f\u043e\u0434 \u0434\u043e\u043a\u0435\u0440\u043e\u043c. \u0412 RStudio \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0447\u0430\u0441\u043e\u0432\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0441 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u0434\u0430 \u0438 \u0441\u0430\u043c\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 IDE \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0430.<\/li>\n<li>\u0414\u043e\u043a\u0435\u0440 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u041e\u0421 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439.<\/li>\n<li>Google Cloud \u2014 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435, \u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u0434\u0443\u043c\u0447\u0438\u0432\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/li>\n<li>\u0417\u0430\u043c\u0435\u0440\u044f\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0434\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 R \u0438 C++, \u0430 \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c <strong>bench<\/strong> \u2014 \u0435\u0449\u0435 \u0438 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u044d\u0442\u043e\u0442 \u043e\u043f\u044b\u0442 \u0431\u044b\u043b \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c, \u0438 \u043c\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u043e\u0437\u0432\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ods\/blog\/443758\/\">habr.com<\/a><\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041e\u0441\u0435\u043d\u044c\u044e \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u043d\u0430 Kaggle \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u043a\u043e\u043d\u043a\u0443\u0440\u0441 \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u0440\u0443\u043a\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a Quick Draw Doodle Recognition, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 R-\u0449\u0438\u043a\u043e\u0432 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u0410\u0440\u0442\u0435\u043c\u0430 \u041a\u043b\u0435\u0432\u0446\u043e\u0432\u0430, \u0424\u0438\u043b\u0438\u043f\u043f\u0430 \u0423\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0432\u0430 \u0438 \u0410\u043d\u0434\u0440\u0435\u044f \u041e\u0433\u0443\u0440\u0446\u043e\u0432\u0430. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0421 \u0444\u0430\u0440\u043c\u043e\u043c \u043c\u0435\u0434\u0430\u043b\u0435\u043a \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043d\u0435 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-30274","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041e\u0441\u0435\u043d\u044c\u044e \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u043d\u0430 Kaggle \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u043a\u043e\u043d\u043a\u0443\u0440\u0441 \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u0440\u0443\u043a\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a Quick Draw Doodle Recognition, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 R-\u0449\u0438\u043a\u043e\u0432 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u0410\u0440\u0442\u0435\u043c\u0430 \u041a\u043b\u0435\u0432\u0446\u043e\u0432\u0430, \u0424\u0438\u043b\u0438\u043f\u043f\u0430 \u0423\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0432\u0430 \u0438 \u0410\u043d\u0434\u0440\u0435\u044f \u041e\u0433\u0443\u0440\u0446\u043e\u0432\u0430. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0421 \u0444\u0430\u0440\u043c\u043e\u043c \u043c\u0435\u0434\u0430\u043b\u0435\u043a \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043d\u0435 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u043d\u043e\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/quick-draw-doodle-recognition-kak-podruzhit-r-c-i-nejrosetki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Quick Draw Doodle Recognition: \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c R, C++ \u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041e\u0441\u0435\u043d\u044c\u044e \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u043d\u0430 Kaggle \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u043a\u043e\u043d\u043a\u0443\u0440\u0441 \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u0440\u0443\u043a\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a Quick Draw Doodle Recognition, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 R-\u0449\u0438\u043a\u043e\u0432 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u0410\u0440\u0442\u0435\u043c\u0430 \u041a\u043b\u0435\u0432\u0446\u043e\u0432\u0430, \u0424\u0438\u043b\u0438\u043f\u043f\u0430 \u0423\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0432\u0430 \u0438 \u0410\u043d\u0434\u0440\u0435\u044f \u041e\u0433\u0443\u0440\u0446\u043e\u0432\u0430. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0421 \u0444\u0430\u0440\u043c\u043e\u043c \u043c\u0435\u0434\u0430\u043b\u0435\u043a \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043d\u0435 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u043d\u043e\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/quick-draw-doodle-recognition-kak-podruzhit-r-c-i-nejrosetki\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:34:36+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:34:36+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Quick Draw Doodle Recognition: Wie man R, C++ und neuronale Netze kombiniert | ProHoster","description":"Hallo, Habr! Im Herbst letzten Jahres fand auf Kaggle ein Wettbewerb zur Klassifizierung von handgezeichneten Bildern, Quick Draw Doodle Recognition, statt, an dem unter anderem ein Team von R-Programmierern mit Artem Klevtsov, Philipp Upravitelew und Andrey Ogurtzov teilnahm. Wir werden den Wettbewerb nicht ausf\u00fchrlich beschreiben, das wurde bereits in einer k\u00fcrzlich ver\u00f6ffentlichten Ver\u00f6ffentlichung getan. Es hat diesmal nicht f\u00fcr eine Medaille gereicht, aber","canonical_url":"https:\/\/prohoster.info\/de\/blog\/quick-draw-doodle-recognition-kak-podruzhit-r-c-i-nejrosetki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Quick Draw Doodle Recognition: \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c R, C++ \u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0438 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041e\u0441\u0435\u043d\u044c\u044e \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u043d\u0430 Kaggle \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u043a\u043e\u043d\u043a\u0443\u0440\u0441 \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u0440\u0443\u043a\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a Quick Draw Doodle Recognition, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 R-\u0449\u0438\u043a\u043e\u0432 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u0410\u0440\u0442\u0435\u043c\u0430 \u041a\u043b\u0435\u0432\u0446\u043e\u0432\u0430, \u0424\u0438\u043b\u0438\u043f\u043f\u0430 \u0423\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0432\u0430 \u0438 \u0410\u043d\u0434\u0440\u0435\u044f \u041e\u0433\u0443\u0440\u0446\u043e\u0432\u0430. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0421 \u0444\u0430\u0440\u043c\u043e\u043c \u043c\u0435\u0434\u0430\u043b\u0435\u043a \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043d\u0435 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u043d\u043e","og:url":"https:\/\/prohoster.info\/de\/blog\/quick-draw-doodle-recognition-kak-podruzhit-r-c-i-nejrosetki","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:34:36+00:00","article:modified_time":"2019-10-31T18:34:36+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30274","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 00:28:09","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:37:28","updated":"2026-01-21 00:28:09"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/30274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=30274"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/30274\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=30274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=30274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=30274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}