{"id":319855,"date":"2021-03-18T15:05:36","date_gmt":"2021-03-18T15:05:36","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=319855"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=319855","title":{"rendered":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u0430 \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b \u0432 \u0418\u0433\u0440\u0435 \u00ab\u0416\u0438\u0437\u043d\u044c\u00bb"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/546920\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wq\/71\/z2\/wq71z28zopblnqmbjcvodmydaom.png\"><\/div>\n<p><\/a><br \/>  \u041a\u043b\u0435\u0442\u043e\u0447\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443, \u0444\u0438\u0437\u0438\u043a\u0443, \u0431\u0438\u043e\u043b\u043e\u0433\u0438\u044e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0416\u0438\u0437\u043d\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u0440\u0430\u0437 \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b.<a name=\"habracut\"><\/a><\/p>\n<div class=\"oembed\"><iframe allowfullscreen id=\"604da674c373282e340f4822\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/604da674c373282e340f4822\"><\/iframe><\/div>\n<p>  \u041d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u044d\u0442\u043e\u0433\u043e \u0432\u0438\u0434\u0435\u043e \u043c\u043e\u0436\u0435\u0442 \u0443\u0439\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u0438\u0449\u0443\u0440\u0438\u0442\u044c\u0441\u044f \u2013 \u0442\u0430\u043a \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:)<\/p>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0438\u0442\u043e\u0433 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439, \u043d\u043e \u044f \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b, \u0447\u0442\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c. \u041c\u043e\u0439 \u0443\u043c \u0434\u043e\u043b\u0433\u043e \u0431\u0443\u0434\u043e\u0440\u0430\u0436\u0438\u043b\u0430 \u0438\u0434\u0435\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%B3%D1%80%D0%B0_\">\u0418\u0433\u0440\u044b \u00ab\u0416\u0438\u0437\u043d\u044c\u00bb<\/a>: \u00ab\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0434\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b \u0447\u0435\u0440\u0435\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0446\u0438\u043a\u043b\u043e\u0432 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0447\u0438\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442\u00bb.<\/p>\n<p>  \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c <a href=\"https:\/\/kevingal.com\/blog\/mona-lisa-gol.html\">\u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u041a\u0435\u0432\u0438\u043d\u0430 \u0413\u0430\u043b\u043b\u0438\u0433\u0430\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0430 \u043c\u0435\u043d\u044f \u043d\u0430 \u043c\u044b\u0441\u043b\u044c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u043d\u043e \u0441\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430. \u0427\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0448\u0430\u0442\u0435\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u0444\u043e\u0440\u043c\u0443\u043b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u00ab\u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043c\u0438\u0440 \u0418\u0433\u0440\u044b \u00ab\u0416\u0438\u0437\u043d\u044c\u00bb \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435?<\/p>\n<p>  \u042d\u0442\u043e\u0433\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0442\u044e\u0440\u043c\u043e\u0440\u0442\u044b (\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0435 \u0444\u0438\u0433\u0443\u0440\u044b) \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445, \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/codegolf.stackexchange.com\/questions\/38573\/paint-a-still-life-or-a-moving-one-draw-an-image-in-the-game-of-life\">\u0432\u043e\u043f\u0440\u043e\u0441\u0435 \u043d\u0430 Codegolf<\/a>.<\/p>\n<p>  \u041c\u043e\u0439 \u0436\u0435 \u0437\u0430\u043c\u044b\u0441\u0435\u043b \u0431\u044b\u043b \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u0443 \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430\/\u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f \u0416\u0438\u0437\u043d\u0438 \u0431\u0435\u0437 \u043d\u0430\u0442\u044e\u0440\u043c\u043e\u0440\u0442\u0430.<\/p>\n<h2><font color=\"#3AC1EF\">\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c<\/font><\/h2>\n<p>  \u0414\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0441 \u0432\u043e\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0435, \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0418\u0433\u0440\u044b, \u043f\u043e\u043a\u0430 n-\u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0434\u0430\u0441\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b.<\/p>\n<p>  \u0412\u043e\u0442 \u0432\u0435\u0441\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/p>\n<pre><code class=\"python\">best_score := infinity     target := mona lisa with dimensions m x n     canvas := random matrix of m x n     best_result := canvas     do         modified_canvas := Copy of canvas with a single random cell inverted         nth_modified_canvas := Run N generations of Game of Life modified_canvas         Compute a score of how close nth_modified_canvas is with target         if score &lt; best_score then         \tbest_score := score             best_result := modified_canvas         canvas := best_result     while(max_iterations limit passed or best_score &lt; threshold)<\/code><\/pre>\n<p>  \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u044f\u0434\u0440\u0435.<\/p>\n<pre><code class=\"python\">def modify(canvas, shape):     x,y = shape     px = int(np.random.uniform(x+1))-1     py = int(np.random.uniform(y+1))-1     canvas[px][py] = not canvas[px][py]     return canvas  def rmse(predictions,targets):     return np.sqrt(np.mean((predictions-targets)**2))  while best_score&gt;limit:     canvases = np.tile(np.copy(best_seed), (batch_size, 1, 1))     rms_errors = []     for canvas in range(len(canvases)):         canvases[canvas] = modify(states[state], (m,n))         rmse_val = rmse(target, nth_generation(np.copy(canvases[canvas])))         rms_errors.append(rmse_val)     lowest = min(rms_errors)     if lowest &lt; best_score:         best_score = lowest         best_result = canvases[rms_errors.index(lowest)]<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0433\u043e \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 <code>target_state<\/code>, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u0443. \u0411\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u0441\u043e\u0441\u0435\u0434 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043f\u0438\u0438 \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438. \u0421\u0442\u043e\u043b\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0438\u0441\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441 \u0446\u0435\u043b\u0435\u0432\u044b\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 (RMSE).<\/p>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 CPU-\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u044f \u0441\u043c\u043e\u0433 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0435\u0435 \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u0443, \u0447\u0435\u0440\u0435\u0437 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 4 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439 \u0416\u0438\u0437\u043d\u0438. <\/p>\n<div class=\"oembed\"><iframe allowfullscreen id=\"604db4dc8a93442df67822a4\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/604db4dc8a93442df67822a4\"><\/iframe><\/div>\n<p>  \u042d\u0442\u043e \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u043e, \u0447\u0442\u043e \u043c\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043b, \u0447\u0442\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043b \u043c\u043d\u043e\u0433\u043e \u043e\u0448\u0438\u0431\u043e\u043a \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0440\u0435\u0447\u0438 \u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u043b\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0442\u0443\u0442 \u043d\u0435 \u0448\u043b\u043e.<\/p>\n<h2><font color=\"#3AC1EF\">\u041f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433<\/font><\/h2>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0432\u0437\u044f\u0442\u0430\u044f \u0438\u0437 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432 \u0447\u0435\u0440\u043d\u043e-\u0431\u0435\u043b\u0443\u044e \u0444\u043e\u0440\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 Python Imaging Library <code>Image.open('target.png').convert('L')<\/code>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/d2\/vz\/xx\/d2vzxxzyqmvblfdwv0coq8-7-je.png\"><\/div>\n<p>  \u041f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u0430 \u043d\u0435 \u0432\u0435\u0441\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0442\u0442\u0435\u043d\u043a\u043e\u0432 \u0441\u0435\u0440\u043e\u0433\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043a\u0440\u0443\u0433\u043b\u0438\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0442\u0435\u043d\u043a\u043e\u0432 \u0441\u0435\u0440\u043e\u0433\u043e \u0434\u043e 0 \u0438 1. \u0412\u0441\u0435 \u0436\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u0443\u0442\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0433\u043e \u0434\u0435\u0442\u0430\u043b\u0435\u0439.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/eh\/jd\/6s\/ehjd6sztztg6wifr7ky0c6be0ey.png\"><\/div>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0442\u044c \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0432 \u043e\u0442\u0442\u0435\u043d\u043a\u0430\u0445 \u0441\u0435\u0440\u043e\u0433\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043b\u0443\u0447\u0448\u0435.<\/p>\n<h2><font color=\"#3AC1EF\">\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0421\u0430\u0434\u0430 \u042d\u0434\u0435\u043c\u0430<\/font><\/h2>\n<p>  \u041d\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 0 \u0438 1 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0418\u0433\u0440\u044b \u00ab\u0416\u0438\u0437\u043d\u044c\u00bb. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c n-\u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435\u043c (n&gt;0) \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043b\u0435\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0421\u0430\u0434 \u042d\u0434\u0435\u043c\u0430.<\/p>\n<p>  \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0440\u0435\u0430\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0430 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u043d\u0430\u044f \u0447\u0435\u0440\u043d\u043e-\u0431\u0435\u043b\u0430\u044f \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044f \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435\u043c \u0416\u0438\u0437\u043d\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u044b\u043c \u0446\u0435\u043b\u0438. <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rl\/lv\/s8\/rllvs8zp0akzgotvu9fz8pdp598.png\"><\/div>\n<p>  <i><font color=\"#999999\">\u042d\u0442\u043e \u0447\u0430\u0441\u0442\u044c 4-\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f<\/font><\/i><\/p>\n<p>  \u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443, \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0416\u0438\u0437\u043d\u0438 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0432 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u044f \u0432\u044b\u044f\u0441\u043d\u0438\u043b, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0439 \u0434\u0438\u0437\u0435\u0440\u0438\u043d\u0433 1-\u0431\u0438\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0446\u0435\u043b\u0438, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u043b\u0443\u0447\u0448\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/s9\/na\/jp\/s9najpadc7y4zpg36pypouvez28.png\"><\/div>\n<p>  <i><font color=\"#999999\">1-\u0431\u0438\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b<\/font><\/i><\/p>\n<p>  \u0412 \u0442\u0430\u043a\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0432\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043a\u043b\u0435\u0442\u043a\u0438 0 \u0438 1, \u0447\u0442\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0418\u0433\u0440\u044b, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u043c\u0443 \u0441\u043f\u0443\u0441\u0442\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439. \u042d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0432\u0441\u043a\u043e\u0440\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c.<\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Floyd%E2%80%93Steinberg_dithering\">\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u0438\u0437\u0435\u0440\u0438\u043d\u0433\u0430 \u0424\u043b\u043e\u0439\u0434\u0430-\u0421\u0442\u0435\u0439\u043d\u0431\u0435\u0440\u0433\u0430<\/a> \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 PIL, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>Image.open('target.png').convert('1')<\/code>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gs\/sc\/mx\/gsscmxms74gdm9hrzd7izjxb2uu.png\"><\/div>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0435\u043b\u044b\u0445 \u043a\u043b\u0435\u0442\u043e\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0435\u043c\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0416\u0438\u0437\u043d\u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c\u0438. \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u043d\u0430\u044f, \u043d\u043e \u0437\u0430\u0442\u0435\u043c\u043d\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b. \u041f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u044d\u0442\u043e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435 \u0441\u0442\u043e\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u0435\u043d.<\/p>\n<h2><font color=\"#3AC1EF\">\u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JAX<\/font><\/h2>\n<p>  \u0412\u0435\u0440\u0441\u0438\u044f \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 CPU \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439. \u042f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0435\u0435 \u0438 \u043d\u0430 \u0441\u0432\u043e\u0435\u043c Core i7 \u0432\u043e\u0441\u044c\u043c\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f, \u0438 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 Google Colab, \u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0445\u043e\u0436\u0435\u0433\u043e \u043d\u0430 \u0446\u0435\u043b\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0441\u044f\u043a\u0438\u0439 \u0440\u0430\u0437 \u0436\u0434\u0430\u0442\u044c \u0447\u0430\u0441\u044b \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0434\u043d\u0438, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0434\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044e.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yl\/b9\/yo\/ylb9yowpvph8l2r3oshkttdqosu.png\"><\/div>\n<p>  JAX \u2013 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Python, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <i>numpy<\/i>-\u0432\u0435\u0440\u0441\u0438\u044e \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0432 \u0432\u044b\u0441\u043e\u043a\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438 \u0442\u0435\u043d\u0437\u043e\u0440\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e (GPU).<\/p>\n<p>  GPU, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u0445 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0438 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 SIMD (\u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445).<\/p>\n<p>  \u041c\u044b \u044d\u043a\u0441\u0442\u0440\u0443\u0434\u0438\u0440\u0443\u0435\u043c <code>target <\/code>(\u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u0430) \u0438 <code>canvas <\/code>(\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435) \u0432 3-\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0439\u043d\u044b\u0435 \u0442\u0435\u043d\u0437\u043e\u0440\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (loafs) \u0441 \u0434\u043b\u0438\u043d\u043e\u0439 \u0440\u0430\u0432\u043d\u043e\u0439 <code>batch_size<\/code>. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/eq\/nb\/7g\/eqnb7ggdituhedix8xkmf1wnprc.png\" align=\"left\"><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fq\/ts\/hm\/fqtshmc8q-spusiigu_q652yeh4.png\" align=\"right\"><\/p>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0446\u0438\u043a\u043b\u0443 \u0432\u043e\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0435, \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c <code>best_canvas<\/code> \u043a\u0430\u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0445\u043e\u043b\u0441\u0442.<\/p>\n<p>  \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0442\u0435\u043d\u0437\u043e\u0440, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043c\u0443\u0442\u0430\u0442\u043e\u0440\u043e\u043c (\u0442\u043e\u0439 \u0436\u0435 \u0444\u043e\u0440\u043c\u044b, \u0447\u0442\u043e <code>target<\/code>), \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c: \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043b\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 1, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/3j\/0m\/v-\/3j0mv-qjdrmtoalkvgci2o5jegm.png\"><\/div>\n<p>  \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430 \u0444\u043e\u0440\u043c\u044b 5, 3, 2, \u0433\u0434\u0435 5 \u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 <code>batch-size<\/code>:<\/p>\n<pre><code class=\"python\">array([[[1, 0],         [0, 0],         [0, 0]],         [[1, 0],         [0, 0],         [0, 0]],         [[0, 0],         [0, 1],         [0, 0]],         [[0, 1],         [0, 0],         [0, 0]],         [[1, 0],         [0, 0],         [0, 0]]])<\/code><\/pre>\n<p>  \u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0441 <code>best_canvas<\/code> \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: <code>canvas = (best_canvas + mutator)%2<\/code>.<\/p>\n<p>  \u041c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c N \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439 \u0418\u0433\u0440\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043b\u043e\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0445\u043e\u043b\u0441\u0442\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c RMSE (\u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u043b\u043e\u044f) \u0445\u043e\u043b\u0441\u0442\u0430 N-\u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043a \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u0435 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0441\u043b\u043e\u0439 \u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0414\u0430\u043b\u0435\u0435 \u044d\u0442\u043e\u0442 \u0441\u043b\u043e\u0439 \u044d\u043a\u0441\u0442\u0440\u0443\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a <code>best_canvas<\/code>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<h2><font color=\"#3AC1EF\">\u041a\u043e\u0434<\/font><\/h2>\n<p>  \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"https:\/\/github.com\/avinayak\/mona_lisa_gol_jax\/blob\/main\/mona_lisa_overdrive.ipynb\">\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 GitHub<\/a>. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0436\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u044f \u043f\u043e\u044f\u0441\u043d\u044e, \u0447\u0442\u043e \u0432 \u043d\u0435\u043c \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043c\u043e\u0442\u0430\u0439\u0442\u0435 \u043a \u043a\u043e\u043d\u0446\u0443 \u0441\u0442\u0430\u0442\u044c\u0438. \u041e\u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0418\u0433\u0440\u044b \u00ab\u0416\u0438\u0437\u043d\u044c\u00bb \u0432\u0437\u044f\u0442\u0430 \u0438\u0437 <a href=\"http:\/\/www.bnikolic.co.uk\/blog\/python\/jax\/2020\/04\/19\/game-of-life-jax.html\">\u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430<\/a>.<\/p>\n<p>  \u0412\u044b\u0440\u0430\u0436\u0430\u044e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0411\u043e\u044f\u043d\u0443 \u041d\u0438\u043a\u043e\u043b\u0438\u0447\u0443. \u042f \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b \u0435\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0438\u043c\u043f\u043e\u0440\u0442\u0430 <code>jax.numpy<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>N<\/code>, \u0430 <code>jax.lax<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>L<\/code>.<\/p>\n<pre><code class=\"python\">%matplotlib inline  import jax N=jax.numpy L=jax.lax from jax.experimental import loops from jax import ops import matplotlib.pyplot as plt import numpy as onp import time from PIL import Image  from google.colab import files<\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c <code>wget <\/code>\u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b:<\/p>\n<pre><code class=\"python\">!wget -O target.png https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/e\/ec\/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg\/483px-Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg?download<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0441\u043a\u0440\u043e\u043c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0448\u0438\u0440\u0438\u043d\u043e\u0439 \u0432 483px.<\/p>\n<pre><code class=\"python\">batch_size = 100 image_file = Image.open(&quot;target.png&quot;) image_file = image_file.convert('1') lisa = N.array(image_file, dtype=N.int32) width,height = lisa.shape lisa_loaf = onp.repeat(lisa[onp.newaxis, :, :,], batch_size, axis = 0)<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u0437\u0435\u0440\u0438\u043d\u0433 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b \u0438 \u0435\u0433\u043e \u044d\u043a\u0441\u0442\u0440\u0443\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0430\u0432\u043d\u043e\u0439 <code>batch_size<\/code>:<\/p>\n<pre><code class=\"python\">key = jax.random.PRNGKey(42) canvas_loaf = jax.random.randint(key, (batch_size, width, height), 0, 2, dtype= N.int32)  #\u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u041b\u0438\u0437\u044b<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 JAX PRNG (\u0432\u0441\u043a\u043e\u0440\u0435 \u044f \u043f\u043e\u044f\u0441\u043d\u044e, \u043e \u0447\u0435\u043c \u0440\u0435\u0447\u044c), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 <code>canvas_loaf<\/code> \u0441 \u0446\u0435\u043b\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 0 \u0438 1. <\/p>\n<pre><code class=\"python\">@jax.jit def rgen(a):     # \u042d\u0442\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0441\u0435\u0434\u0435\u0439 \u0436\u0438\u0432\u044b\u0445 \u043a\u043b\u0435\u0442\u043e\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f #\u0441\u0430\u043c\u0443 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0447\u0435\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432     nghbrs=L.reduce_window(a, 0, L.add, (3,3), (1,1), &quot;SAME&quot;)-a     birth=N.logical_and(a==0, nghbrs==3)     underpop=N.logical_and(a==1, nghbrs&lt;2)     overpop=N.logical_and(a==1, nghbrs&gt;3)     death=N.logical_or(underpop, overpop)      na=L.select(birth,                 N.ones(a.shape, N.int32),                 a)      na=L.select(death,                 N.zeros(a.shape, N.int32),                 na)     return na  vectorized_rgen = jax.vmap(rgen)  @jax.jit def nv_rgen(state):   for _ in range(n_generations):       state = vectorized_rgen(state)   return state<\/code><\/pre>\n<p>  \u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>rgen<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043e\u0434\u043d\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435 \u0416\u0438\u0437\u043d\u0438, \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"http:\/\/www.bnikolic.co.uk\/blog\/python\/jax\/2020\/04\/19\/game-of-life-jax.html\">\u0441\u0442\u0430\u0442\u044c\u0435 <\/a>\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0433\u043e \u043c\u043d\u043e\u0439 \u0411\u043e\u044f\u043d\u0430 \u041d\u0438\u043a\u043e\u043b\u0438\u0447\u0430.<\/p>\n<p>  <code>jax.vmap<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430 \u043e\u0441\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e). \u042d\u0442\u043e \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435 \u0416\u0438\u0437\u043d\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0445\u043e\u043b\u0441\u0442\u0430.<\/p>\n<p>  <code>nv_rgen<\/code> \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043d\u0430 \u0445\u043e\u043b\u0441\u0442\u0435 N-\u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439 \u0416\u0438\u0437\u043d\u0438.<\/p>\n<p>  \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 <code>@jax.jit<\/code> \u043e\u0431\u0443\u0441\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (Just-in-time, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b). \u041d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d, \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u043b\u0438 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a <code>nv_rgen<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438.<\/p>\n<pre><code class=\"python\">def mutate_nj(b, w, h, subkey):   a = jax.random.normal(subkey, (b, w, h))   return (a == a.max(axis=(1,2))[:,None,None]).astype(int)  mutate = jax.jit(mutate_nj, static_argnums=(0,1,2))<\/code><\/pre>\n<p>  <code>mutate_nj<\/code> (nj \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0431\u0435\u0437 JIT) \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043d\u0437\u043e\u0440 \u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>jax.random.normal<\/code>, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0443 1 \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 0. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>subkey <\/code>\u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u0430\u043a <code>mutate<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0430\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b <code>b, w, h<\/code> \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443, \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043d\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442.<\/p>\n<pre><code class=\"python\">def rmse_nj(original, canvas, b, w, h):   return N.sqrt(N.mean(L.reshape((original-canvas)**2,(b,w*h)) , axis=1))  rmse = jax.jit(rmse_nj, static_argnums=(2,3,4))<\/code><\/pre>\n<p>  <code>rmse <\/code>\u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0441\u0430\u043c\u0430 \u0437\u0430 \u0441\u0435\u0431\u044f. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 CPU-\u0432\u0435\u0440\u0441\u0438\u0438 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e 1-\u0439 \u043e\u0441\u0438 (\u043e\u0441\u0438 \u0434\u043b\u0438\u043d\u044b \u044d\u043a\u0441\u0442\u0440\u0443\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b).<\/p>\n<pre><code class=\"python\">def hill_climb(original, canvas, prng_key, iterations):   with loops.Scope() as s:     s.best_score = N.inf     s.best_canvas = canvas     s.canvas = canvas     s.prng_key = prng_key     for run in s.range(iterations):       s.prng_key, subkey = jax.random.split(s.prng_key)       s.canvas+=modify(batch_size, width, height, subkey)       s.canvas%=2       rmse_vals = rmse(original, nv_rgen( s.canvas ), batch_size, width, height)       curr_min = N.min(rmse_vals)       for _ in s.cond_range(curr_min &lt; s.best_score):         s.best_score = curr_min         s.best_canvas = N.repeat((s.canvas[N.argmin(rmse_vals)])[N.newaxis, :, :,], batch_size, axis = 0)       s.canvas = s.best_canvas     return s.canvas<\/code><\/pre>\n<p>  <code>hill_climb<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u042d\u0442\u043e \u043e\u0434\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0446\u0438\u043a\u043b\u0430 JAX. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b Python, \u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 JAX.<\/p>\n<p>  \u0426\u0438\u043a\u043b\u044b \u0432 JAX (\u043c\u043e\u0434\u0443\u043b\u044c <code>jax.experimental.loops<\/code>) \u2013 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>lax.fori<\/code>_loop \u0438 <code>lax.cond<\/code>. \u0426\u0438\u043a\u043b\u044b <code>lax <\/code>(\u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0446\u0438\u043a\u043b\u044b XLA), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435 \u0432 JAX \u043e\u043d\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u044b \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u0430\u043c Python. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0433\u0432\u043e\u0437\u0434\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0445\u043e\u0434\u0443 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u0434\u043e\u043b\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0447\u043b\u0435\u043d \u0435\u0433\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u0438. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u044e\u0434\u0430 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f <code>best_score<\/code>, <code>best_canvas<\/code>, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0445\u043e\u043b\u0441\u0442, \u0433\u0434\u0435 \u043c\u044b \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0416\u0438\u0437\u043d\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043b\u044e\u0447 PRNG.<\/p>\n<h2><font color=\"#3AC1EF\">JAX PRNG<\/font><\/h2>\n<p>  \u0412 NumPy \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u0445 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b (PRNG). \u0422\u043e \u0435\u0441\u0442\u044c NumPy \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 (seed) \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u041a\u0430\u043a \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u043f\u0440\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438. \u0421 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u043e\u0436\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0443\u044e \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044e \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. <\/p>\n<p>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 NumPy, JAX \u043d\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0447\u0438\u0441\u0435\u043b. \u041a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>jax.random<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 PRNG, \u0438 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 PRNG \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>jax.random.split<\/code>.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c, \u0442\u043e \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0435\u0439\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u042f \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u043b \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u043f\u0438\u0441\u0430\u043b \u0446\u0438\u043a\u043b, \u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0445\u043e\u043b\u0441\u0442\u0430. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0442\u0435\u043d\u0437\u043e\u0440-\u043c\u0443\u0442\u0430\u0442\u043e\u0440.<\/p>\n<p>  \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043a\u0430\u0436\u0434\u044b\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f PRNG. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 PRNG \u0432 JAX \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/github.com\/google\/jax\/blob\/master\/design_notes\/prng.md\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<h3><font color=\"#3AC1EF\">cond_range<\/font><\/h3>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u0432 JAX \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0446\u0438\u043a\u043b\u0430\u043c\u0438? \u0427\u0435\u0441\u0442\u043d\u043e, \u044f \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u044d\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e. \u0423 <code>cond_range<\/code> \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u0438\u043d\u043e\u0439 0\/1, \u043d\u043e \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u043b\u043e\u0439 \u0445\u043e\u043b\u0441\u0442\u0430, \u0442\u043e \u044d\u043a\u0441\u0442\u0440\u0443\u0434\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043a\u0430\u043a <code>best_canvas<\/code>, \u0430 \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u0430\u043a <code>best_score<\/code>.<\/p>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0416\u0438\u0437\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0447\u0435\u0440\u0435\u0437 N \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0437 \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b. <\/p>\n<h2><font color=\"#3AC1EF\">\u0418\u0442\u043e\u0433\u0438<\/font><\/h2>\n<p>  \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 ~1000 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0448\u0438\u0440\u0438\u043d\u043e\u0439 483px \u043d\u0430 GPU Google Colab \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e ~40 \u0441\u0435\u043a\u0443\u043d\u0434. \u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f CPU, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0430\u0436\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0446\u0435\u043b\u0438 \u043c\u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0443\u0434\u0430\u043b\u043e\u0441\u044c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wq\/71\/z2\/wq71z28zopblnqmbjcvodmydaom.png\"><\/div>\n<p>  \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0416\u0438\u0437\u043d\u0438, \u0434\u0430\u044e\u0449\u0435\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u0446\u0435\u043b\u0435\u0432\u044b\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c, \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u043e \u0447\u0435\u0440\u0435\u0437 ~23 000 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u0447\u0442\u043e \u0437\u0430\u043d\u044f\u043b\u043e 10 \u043c\u0438\u043d\u0443\u0442. \u041f\u043e\u0441\u043b\u0435 23 000 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f, \u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 100 000 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439 \u043d\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f.<br \/>  \u0422\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u043c\u0435\u043d\u044c\u0448\u0435\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439, \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c, \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u0446\u0435\u043b\u044c\u044e.<\/p>\n<p>  \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u0430, 10 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439:<\/p>\n<div class=\"oembed\"><iframe allowfullscreen id=\"604da674c373282e340f4822\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/604da674c373282e340f4822\"><\/iframe><\/div>\n<p>  \u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437\u0435\u0446 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0434\u043e\u0441\u043a\u0438, 7 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439:<\/p>\n<div class=\"oembed\"><iframe allowfullscreen id=\"604db4dd95bc5d2dedbee1b5\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/604db4dd95bc5d2dedbee1b5\"><\/iframe><\/div>\n<p>  \u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437\u0435\u0446 \u0442\u0435\u043a\u0441\u0442\u0430, 5 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439:<\/p>\n<div class=\"oembed\"><iframe allowfullscreen id=\"604db4dd30f707d266c0eca3\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/604db4dd30f707d266c0eca3\"><\/iframe><\/div>\n<p>  \u0414\u0430\u0432\u0438\u0434 (\u0440\u0430\u0431\u043e\u0442\u0430 \u041c\u0438\u043a\u0435\u043b\u0430\u043d\u0434\u0436\u0435\u043b\u043e), 3 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f:<\/p>\n<div class=\"oembed\"><iframe allowfullscreen id=\"604db4de7c24d22e1e99f9fb\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/604db4de7c24d22e1e99f9fb\"><\/iframe><\/div>\n<p>  \u041b\u0443\u043d\u0430, 7 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439 (https:\/\/unsplash.com\/photos\/pd4lo70LdbI):<\/p>\n<div class=\"oembed\"><iframe allowfullscreen id=\"604db4de8b25a4d2350c14c0\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/604db4de8b25a4d2350c14c0\"><\/iframe><\/div>\n<p>  \u041d\u0438\u043b \u0410\u0440\u043c\u0441\u0442\u0440\u043e\u043d\u0433, 7 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439:<\/p>\n<div class=\"oembed\"><iframe allowfullscreen id=\"604db4df189a112e083e61f1\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/604db4df189a112e083e61f1\"><\/iframe><\/div>\n<h2><font color=\"#3AC1EF\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/font><\/h2>\n<p>  \u0412 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043a\u0430\u043b \u043f\u0440\u0435\u0434\u043b\u043e\u0433 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 JAX, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. JAX \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u0433\u0434\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u0435\u043d\u0437\u043e\u0440\u044b. \u042f \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043b \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d \u043f\u0440\u0438\u043d\u0435\u0441 \u043c\u043d\u0435 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442. <\/p>\n<p>  \u0414\u0436\u043e\u043d \u041d\u043e\u0440\u0442\u043e\u043d \u041a\u043e\u043d\u0432\u0435\u0439 (26 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 1937 \u2014 11 \u0430\u043f\u0440\u0435\u043b\u044f 2020), RIP:<\/p>\n<div class=\"oembed\"><iframe allowfullscreen id=\"604db4dfc373282e340f4823\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/604db4dfc373282e340f4823\"><\/iframe><\/div>\n<p>  <a href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=Bright-translate&amp;utm_content=sozdanie_obraza_mona_lizy_v_igre_zhizn#order\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ou\/g5\/kh\/oug5kh6sjydt9llengsiebnp40w.png\"><\/a><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/546920\/\"> https:\/\/habr.com\/ru\/company\/ruvds\/blog\/546920\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/546920\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wq\/71\/z2\/wq71z28zopblnqmbjcvodmydaom.png\"><\/div>\n<p><\/a><br \/>  \u041a\u043b\u0435\u0442\u043e\u0447\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443, \u0444\u0438\u0437\u0438\u043a\u0443, \u0431\u0438\u043e\u043b\u043e\u0433\u0438\u044e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0416\u0438\u0437\u043d\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u0440\u0430\u0437 \u041c\u043e\u043d\u0430 \u041b\u0438\u0437\u044b.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-319855","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/319855","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=319855"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/319855\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=319855"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=319855"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=319855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}