{"id":335814,"date":"2022-07-17T21:00:19","date_gmt":"2022-07-17T21:00:19","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=335814"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=335814","title":{"rendered":"<span>\u041a\u0440\u0443\u0447\u0443-\u0432\u0435\u0440\u0447\u0443, \u043e\u0431\u043c\u0430\u043d\u0443\u0442\u044c \u0445\u043e\u0447\u0443<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>Long story short <\/em><\/p>\n<p><em>      \u0421\u043e\u0437\u0434\u0430\u044e\u0442 \u043b\u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u044b \u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0435?<\/em><\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/uc\/av\/0i\/ucav0ix1r0mj76g1mfgktfsmrve.png\" width=\"auto\" height=\"auto\" data-src=\"https:\/\/habrastorage.org\/webt\/uc\/av\/0i\/ucav0ix1r0mj76g1mfgktfsmrve.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 rotate.<\/p>\n<hr\/>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0435\u0431\u0435, \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043a\u043e\u0440\u0438\u043d\u0433\u0430.<br \/>\u041d\u0435\u043a\u0442\u043e \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0435\u0431\u0435, \u043d\u0435\u043a\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u0435\u0431\u044f, \u0431\u0430\u043d\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0435\u0442\u044c \u0438 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u043b\u0438 \u044d\u0442\u043e \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u043d\u0442\u0430\u043c\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u043b\u0430\u043d\u0430 \u0436\u0443\u043b\u0438\u043a\u0430\u043c\u0438.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0439 \u0441\u0435\u0442\u0438 \u0431\u0430\u043d\u043a \u0443\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438 \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0438\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 \u0438 \u0441\u043e\u0433\u043b\u0430\u0448\u0430\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u044f\u0432\u0438\u0442\u0435\u043b\u044e.<br \/>\u0415\u0441\u043b\u0438 \u0431\u0430\u043d\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0441\u0435\u0442\u0438, \u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0433\u043e\u0440\u0438\u0442, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f.<\/p>\n<p>\u0418 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b, <s>\u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0435 \u0442\u0435\u043b\u043e \u044d\u0442\u043e \u0448\u0430\u0440<\/s> \u0441\u043e\u0438\u0441\u043a\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 W_SIZE x W_SIZE, \u043d\u0443 \u0438\u043b\u0438 128\u0445128, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440.<br \/>\u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435\u0442!<\/p>\n<p>\u0418 \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u043c \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u044a\u044f\u0442\u044c \u043d\u0435\u043e\u0431\u044a\u044f\u0442\u043d\u043e\u0435 \u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0447\u0442\u043e \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b.<\/p>\n<p>\u041c\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 w_size \u0445 w_size, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e, \u043c\u044b \u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0442\u0430\u043c, \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0438 \u043d\u0430\u043c \u0433\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043d\u0435 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b \u043b\u0438 \u043d\u0435\u043a\u0442\u043e \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443(\u043c\u0430\u0442\u0440\u0438\u0446\u0443).<\/p>\n<p>\u0422.\u0435. \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0448\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 &#8212; \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\/\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u0435, \u0447\u0442\u043e \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u044b\u043b\u0438 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b. \u041d\u0443 \u0438 \u043d\u0430 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446 \u0431\u0443\u0434\u0435\u043c \u0438 \u0443\u0447\u0438\u0442\u044c.<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0435\u0442\u044c \u043d\u0430 keras \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f &#171;\u043f\u043e\u0432\u043e\u0440\u043e\u0442&#187;<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0433\u0440\u0443\u0437\u0438\u043c<\/p>\n<pre><code class=\"python\">import numpy as np import cv2  from scipy import ndimage, misc, stats from skimage import exposure  from matplotlib import pyplot as plt, colors # work in interactive moode %matplotlib inline   from tensorflow import keras from tensorflow.keras import layers  from math import sqrt, sin, cos, radians  import tqdm<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0443\u044e \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0434\u043d\u0443 \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u043c \u0435\u0451 \u043f\u043e\u043f\u043e\u043b\u0430\u043c. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0438\/\u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0438\u0435 &#8212; \u043a\u0440\u0443\u0433 \u043d\u0430 \u0447\u0435\u0440\u043d\u043e\u043c \u0444\u043e\u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c. \u041f\u0440\u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430\u0445 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043d\u043e\u0441\u044f\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0431\u0435\u0440\u0435\u043c \u043a\u0440\u0443\u0433 \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0435.<\/p>\n<pre><code class=\"python\">w_size = 128 w2_size = w_size \/\/ 2 R = w2_size\/\/2 center = (w2_size, w2_size) scale = 1  circle = np.zeros((w_size, w_size), dtype='uint8') for i in range(w_size):     for j in range(w_size):         ii = float(i - w2_size)         jj = float(j - w2_size)         r = sqrt(ii*ii + jj*jj)         if r &lt; R:             circle[i,j] = 1  def shift(x,y,w2_size):     ii = float(x - w2_size)     jj = float(y - w2_size)     return ii,jj   def rotate(ii,jj,teta):     i1 =  ii*cos(teta) + jj*sin(teta)     j1 =  ii*sin(teta) + jj*cos(teta)     return i1,j1   circle = np.zeros((w_size, w_size), dtype='int') for i in range(w_size):     for j in range(w_size):         ii,jj = shift(i,j,w2_size)         r = sqrt(ii*ii + jj*jj)         if r &lt; R:             circle[i,j] = 1  fig, ax = plt.subplots(1, 1,figsize=(5, 5)) ax.set_axis_off() ax.set_title(\"circle\") ax.imshow(circle.squeeze(), cmap='gray', norm=None) <\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ffb\/f9f\/cad\/ffbf9fcad33d2737bfc541d83ebda6cf.png\" width=\"286\" height=\"302\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ffb\/f9f\/cad\/ffbf9fcad33d2737bfc541d83ebda6cf.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442<\/h2>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0443\u043c\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435.<br \/>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e numpy.random.uniform, \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ndimage.rotate \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0443\u0433\u043e\u043b.<br \/>\u0418\u043b\u0438 \u043d\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0435\u043c. \u0418 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430\u0448\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<br \/>\u0418 \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u043e\u0439 &#8212; 0, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442 \u0438 1 \u0435\u0441\u043b\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442.<br \/>\u0418 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0435 \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u043c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0440\u0443\u0433. \u0422.\u0435. \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u0443\u0431\u0438\u0440\u0430\u0435\u043c.<br \/>\u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0443\u0433 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435.<\/p>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0441\u0435\u0442\u044c \u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e, \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u0445 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c \u043c\u043e\u0436\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0426\u041f\u0422, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441 \u0440\u043e\u0432\u043d\u043e\u0439 (\u043f\u043e\u0447\u0442\u0438) \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439, \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0434\u0430\u044e\u0442 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432 \u0432\u0438\u0434\u0435 \u0433\u043e\u0440\u0431\u0430 ( \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0413\u0430\u0443\u0441\u0441\u0438\u0430\u043d )<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0441 numpy.random.normal \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u0432\u0435\u0440\u0438\u0442 \u043d\u0430 \u0441\u043b\u043e\u0432\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043a\u043e\u0434.<\/p>\n<pre><code class=\"python\">num_classes = 2 train_len = 5000 test_len = 1000 input_shape = (w_size, w_size, 1)  X = np.zeros((train_len+test_len, w_size, w_size, 1), dtype='float32') Y = np.zeros(train_len+test_len, dtype='float32')  mu = 0.25 sigma = 0.05  for iii in tqdm.tqdm(range(train_len + test_len)):          angle = np.random.randint(-5,5)+ 45      n = np.random.uniform(0.25, 0.75, size=(w_size, w_size))     t = np.zeros((w_size, w_size), dtype='float')     t[circle>0] = n[circle>0]          r = ndimage.rotate(n, angle, reshape=False, mode='nearest')     tt = np.zeros((w_size, w_size), dtype='float')     tt[circle>0] = r[circle>0]      choise = np.random.randint(0, high=65535, dtype=int) % 2     if choise == 1:         X[iii,:,:,0] = t[:,:]         Y[iii] = 0     else:         X[iii,:,:,0] = tt[:,:]         Y[iii] =1  yy_train = np.array(keras.utils.to_categorical(Y[:train_len], num_classes)) yy_test = np.array(keras.utils.to_categorical(Y[train_len:], num_classes))  xx_train = np.array(X[:train_len]) xx_test = np.array(X[train_len:])  print(xx_train.shape, yy_train.shape) print(xx_test.shape, yy_test.shape) <\/code><\/pre>\n<pre><code class=\"python\"> nrows=2 ncols=4 fig, ax = plt.subplots(nrows*2, ncols,figsize=(16, 20))  for ii in range(nrows):     for jj in range(ncols):         random_characters = int(np.random.uniform(0,train_len))         ax[2*ii,jj].set_axis_off()         ax[2*ii,jj].set_title(str(int(Y[random_characters])))         ax[2*ii,jj].imshow(X[random_characters].squeeze(), cmap='gray', norm=None)         tx = X[random_characters]         ax[2*ii+1,jj].hist(255.*X[random_characters].flatten(), np.arange(1,256), facecolor='blue',histtype='step')  plt.show(block=True)<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/664\/432\/d1c\/664432d1c0e28da400f8a2c3f6a99f55.png\" width=\"926\" height=\"1113\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/664\/432\/d1c\/664432d1c0e28da400f8a2c3f6a99f55.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442<\/h2>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c, \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0443\u0436\u0435 \u0441 numpy.random.normal \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c.<br \/> \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u0418 \u0447\u0430\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043f\u043e\u0432\u0435\u0440\u043d\u0435\u043c.<br \/> \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0438\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442.<br \/> \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043d\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0443 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0445 \u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a. \u041e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438, \u043d\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0435. \u0422\u0435\u0441\u0442 \u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442.<\/p>\n<pre><code class=\"python\">X = np.zeros((train_len+test_len, w_size, w_size, 1), dtype='float32') Y = np.zeros(train_len+test_len, dtype='float32')  mu = 0.45 sigma = 0.1  for iii in tqdm.tqdm(range(train_len + test_len)):          angle = np.random.randint(-5,5)+ 45      n = np.random.normal(mu, sigma, size=(w_size, w_size))     t = np.zeros((w_size, w_size), dtype='float')     t[circle>0] = n[circle>0]          r = ndimage.rotate(n, angle, reshape=False, mode='nearest')     tt = np.zeros((w_size, w_size), dtype='float')     tt[circle>0] = r[circle>0]      choise = np.random.randint(0, high=65535, dtype=int) % 2     if choise == 1:         X[iii,:,:,0] = t[:,:]         Y[iii] = 0     else:         X[iii,:,:,0] = tt[:,:]         Y[iii] =1  yy_train = np.array(keras.utils.to_categorical(Y[:train_len], num_classes)) yy_test = np.array(keras.utils.to_categorical(Y[train_len:], num_classes))  xx_train = np.array(X[:train_len]) xx_test = np.array(X[train_len:])  print(xx_train.shape, yy_train.shape) print(xx_test.shape, yy_test.shape) <\/code><\/pre>\n<pre><code>nrows=2 ncols=4 fig, ax = plt.subplots(nrows*2, ncols,figsize=(16, 20))  for ii in range(nrows):     for jj in range(ncols):         random_characters = int(np.random.uniform(0,train_len))         ax[2*ii,jj].set_axis_off()         ax[2*ii,jj].set_title(str(int(Y[random_characters])))         ax[2*ii,jj].imshow(X[random_characters].squeeze(), cmap='gray', norm=None)         ax[2*ii+1,jj].hist(255.*X[random_characters].flatten(), np.arange(1,256),\\                            facecolor='blue',histtype='step')  plt.show(block=True) <\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6e1\/8ad\/3e8\/6e18ad3e8b3f72ebe6582faa275b664e.png\" width=\"926\" height=\"1113\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6e1\/8ad\/3e8\/6e18ad3e8b3f72ebe6582faa275b664e.png\"\/><figcaption><\/figcaption><\/figure>\n<pre><code>model = keras.Sequential(     [         keras.Input(shape=input_shape),         layers.Conv2D(32, kernel_size=(3, 3), activation=\"relu\"),         layers.Conv2D(32, kernel_size=(3, 3), activation=\"relu\"),         layers.MaxPooling2D(pool_size=(2, 2)),         layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"),         layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"), #        layers.MaxPooling2D(pool_size=(2, 2)),         layers.Flatten(),         layers.Dropout(0.5),         layers.Dense(128, activation=\"relu\"),         layers.Dense(num_classes, activation=\"softmax\"),     ] )  batch_size = 25 epochs = 5 num_classes = 2 n_bins = 256  model.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]) #model.summary()  model.fit(xx_train, yy_train, batch_size=batch_size, epochs=epochs,            validation_data=(xx_test, yy_test), verbose = 2) <\/code><\/pre>\n<p>Epoch 1\/5 <\/p>\n<p>200\/200 &#8212; 6s &#8212; loss: 0.2437 &#8212; accuracy: 0.8638 &#8212; val_loss: 4.7537e-05 &#8212; val_accuracy: 1.0000 <\/p>\n<p>Epoch 2\/5 <\/p>\n<p>200\/200 &#8212; 4s &#8212; loss: 3.7514e-05 &#8212; accuracy: 1.0000 &#8212; val_loss: 2.2031e-05 &#8212; val_accuracy: 1.0000 <\/p>\n<p>Epoch 3\/5<\/p>\n<p>200\/200 &#8212; 4s &#8212; loss: 1.8480e-05 &#8212; accuracy: 1.0000 &#8212; val_loss: 1.1520e-05 &#8212; val_accuracy: 1.0000 <\/p>\n<p>Epoch 4\/5<\/p>\n<p> 200\/200 &#8212; 4s &#8212; loss: 1.0300e-05 &#8212; accuracy: 1.0000 &#8212; val_loss: 6.6436e-06 &#8212; val_accuracy: 1.0000 <\/p>\n<p>Epoch 5\/5<\/p>\n<p> 200\/200 &#8212; 4s &#8212; loss: 5.9791e-06 &#8212; accuracy: 1.0000 &#8212; val_loss: 4.1065e-06 &#8212; val_accuracy: 1.0000<\/p>\n<h2>\u0422\u0440\u0435\u0442\u0438\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442<\/h2>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c, \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441 numpy.random.normal \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c.<br \/>\u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f.<br \/>\u0418 \u0447\u0430\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043f\u043e\u0432\u0435\u0440\u043d\u0435\u043c.<\/p>\n<p>\u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u043a\u0430\u0437\u0438\u043c \u0442\u0430\u043a, \u0447\u0442\u043e \u0431\u044b \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0439 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0430 \u0441 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.<br \/>\u0418 \u0442\u0443\u0442 \u0447\u0443\u0434\u043e, \u0441\u0435\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043e\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445, \u0435\u0441\u043b\u0438 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u0430\u043b\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>\u041d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0443\u043c\u0435\u043d, \u044d\u0442\u043e\u0442 \u0432\u0430\u0448 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442<\/p>\n<pre><code class=\"python\">X = np.zeros((train_len+test_len, w_size, w_size, 1), dtype='float32') Y = np.zeros(train_len+test_len, dtype='float32')  mu = 0.45 sigma = 0.1  view_test = np.random.randint(0, train_len+test_len, (3))  for iii in tqdm.tqdm(range(train_len + test_len)):          angle = np.random.randint(-5,5)+ 45      n = np.random.normal(mu, sigma, size=(w_size, w_size))     t = np.zeros((w_size, w_size), dtype='float')     t[circle>0] = n[circle>0]     tf = t.flatten()          r = ndimage.rotate(n, angle, reshape=False, mode='nearest')     tt = np.zeros((w_size, w_size), dtype='float')     tt[circle>0] = r[circle>0]     tts = tt.copy()     ttf = tt.flatten()      step = np.arange(0., 1., 1.\/255.)          for ii in range(1):         for i in range(1,253):             T = np.sum(np.bitwise_and(tf>step[i], tf&lt;step[i+1]))             TT = np.sum(np.bitwise_and(ttf>step[i], ttf&lt;step[i+1]))             T_TT = abs(T-TT)             if T_TT == 0:                 continue             if T>TT:                 jj = 0                 while True:                     tt_array = np.nonzero(np.bitwise_and(ttf>step[i+1],ttf&lt;step[i+2]))[0]                     if len(tt_array)>=T_TT or i+jj > w_size-2:                         break                     ttf[ttf>step[i+2]] -=step[1]                     jj += 1                 indices = np.arange(len(tt_array))                 np.random.shuffle(indices)                 for j in range(min(len(tt_array), T_TT)):                     ttf[tt_array[indices[j]]] -= step[1]             else:                 tt_array = np.nonzero(np.bitwise_and(ttf>step[i], ttf&lt;step[i+1]))[0]                 if len(tt_array) != 0:                     indices = np.arange(len(tt_array))                     np.random.shuffle(indices)                     for j in range(min(len(tt_array), T_TT)):                         ttf[tt_array[indices[j]]] +=step[1]                                  tt = ttf.reshape(w_size,w_size)      choise = np.random.randint(0, high=65535, dtype=int) % 2     if choise == 1:         X[iii,:,:,0] = t[:,:]         Y[iii] = 0     else:         tt = ttf.reshape(w_size,w_size)         X[iii,:,:,0] = tt         Y[iii] =1          if iii in view_test:         random_idx = int(np.random.uniform(0,train_len))         alpha = 0.05         fig, axs = plt.subplots(1, 3, figsize=(30, 10))              stat, p = stats.normaltest(t[circle>0].flatten())         if p > alpha:             axs[0].set_title(\"\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u041f\u0440\u0438\u043d\u044f\u0442\u044c \"+ str(p))         else:             axs[0].set_title(\"\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c ?\"+ str(p))         axs[0].set_axis_off()         axs[0].imshow(t, cmap=\"gray\")              stat, pp = stats.normaltest(tt[circle>0].flatten())         if pp > alpha:             axs[1].set_title(\"\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u041f\u0440\u0438\u043d\u044f\u0442\u044c \"+ str(pp))         else:             axs[1].set_title(\"\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c \"+ str(pp))         axs[1].set_axis_off()         axs[1].imshow(tt, cmap=\"gray\")              stat, p = stats.normaltest(tts[circle>0].flatten())         if p > alpha:             axs[2].set_title(\"\u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u041f\u0440\u0438\u043d\u044f\u0442\u044c \"+ str(p))         else:             axs[2].set_title(\"\u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c \"+ str(p))         axs[2].set_axis_off()         axs[2].imshow(tts, cmap=\"gray\")                       tt_hist,b = np.histogram(256*tt.flatten(), np.arange(1,257))         tts_hist,b = np.histogram(256*tts.flatten(), np.arange(1,257))         t_hist,_ = np.histogram(256*t.flatten(), np.arange(1,257))         fig, axs = plt.subplots(1, 1, figsize=(30, 30))         bins = np.arange(1,256)         axs.plot(bins, tts_hist, 'y')         axs.plot(bins, tt_hist, 'b')         axs.plot(bins, t_hist, 'g')         plt.show(block=True)  yy_train = np.array(keras.utils.to_categorical(Y[:train_len], num_classes)) yy_test = np.array(keras.utils.to_categorical(Y[train_len:], num_classes))  xx_train = np.array(X[:train_len]) xx_test = np.array(X[train_len:])  print(xx_train.shape, yy_train.shape) print(xx_test.shape, yy_test.shape) <\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7fa\/004\/f7f\/7fa004f7f25723bf0dc42b7adde31c69.png\" width=\"1688\" height=\"522\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7fa\/004\/f7f\/7fa004f7f25723bf0dc42b7adde31c69.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5ba\/7c7\/a3c\/5ba7c7a3ce8498b138922056fc27d0c9.png\" width=\"1708\" height=\"1662\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5ba\/7c7\/a3c\/5ba7c7a3ce8498b138922056fc27d0c9.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0435\u0442\u044c \u0442\u0430 \u0436\u0435 \u0441\u0430\u043c\u0430\u044f.<\/p>\n<pre><code class=\"python\">batch_size = 25 epochs = 5 num_classes = 2 n_bins = 256  model.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]) #model.summary()  model.fit(xx_train, yy_train, batch_size=batch_size, epochs=epochs,            validation_data=(xx_test, yy_test), verbose = 2) <\/code><\/pre>\n<ul>\n<li>\n<p>Epoch 1\/5 <\/p>\n<\/li>\n<li>\n<p>200\/200 &#8212; 4s &#8212; loss: 0.6990 &#8212; accuracy: 0.4966 &#8212; val_loss: 0.6932 &#8212; val_accuracy: 0.4970<\/p>\n<\/li>\n<li>\n<p>Epoch 2\/5 <\/p>\n<\/li>\n<li>\n<p>200\/200 &#8212; 4s &#8212; loss: 0.6932 &#8212; accuracy: 0.4992 &#8212; val_loss: 0.6932 &#8212; val_accuracy: 0.4970 <\/p>\n<\/li>\n<li>\n<p>Epoch 3\/5<\/p>\n<\/li>\n<li>\n<p> 200\/200 &#8212; 4s &#8212; loss: 0.6932 &#8212; accuracy: 0.4988 &#8212; val_loss: 0.6931 &#8212; val_accuracy: 0.5030 <\/p>\n<\/li>\n<li>\n<p>Epoch 4\/5 <\/p>\n<\/li>\n<li>\n<p>200\/200 &#8212; 4s &#8212; loss: 0.6932 &#8212; accuracy: 0.4930 &#8212; val_loss: 0.6931 &#8212; val_accuracy: 0.4970 <\/p>\n<\/li>\n<li>\n<p>Epoch 5\/5 <\/p>\n<\/li>\n<li>\n<p>200\/200 &#8212; 4s &#8212; loss: 0.6932 &#8212; accuracy: 0.4990 &#8212; val_loss: 0.6932 &#8212; val_accuracy: 0.4970<\/p>\n<\/li>\n<\/ul>\n<h2>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442<\/h2>\n<p>\u041d\u0443 \u0438 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u043d\u0430 \u044d\u043b\u043b\u0438\u043f\u0441\u0430\u0445. \u041e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0438 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0434\u043b\u044f \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u043a &#8212; \u0442\u043e\u0442 \u0436\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u044d\u043b\u043b\u0438\u043f\u0441, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0442\u043e\u0436\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043d\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c \u0438 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0435\u0439. \u0422\u0430\u043a \u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0432\u044b\u0440\u043e\u0432\u043d\u044f\u0435\u043c \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0435. \u0418 \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u044b \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0435\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>\u0422.\u0435. \u0435\u0441\u043b\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438 \u043d\u0435\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u0430, \u0442\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u043d\u0435 \u0438\u0441\u043a\u0430\u0436\u0430\u044e\u0442\u0441\u044f &#8212; \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0441\u0435\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.<\/p>\n<pre><code class=\"python\">w_size = 128 w2_size = w_size \/\/ 2 R = w2_size\/\/2 center = (w2_size, w2_size) scale = 1  RR = R \/\/2 A = RR + 4 B = RR - 4 c = sqrt(float(A*A - B*B))  num_classes = 2 train_len = 5000 test_len = 1000 input_shape = (w_size, w_size, 1)  circle = np.zeros((w_size, w_size), dtype='uint8') for i in range(w_size):     for j in range(w_size):         ii = float(i - w2_size)         jj = float(j - w2_size)         r = sqrt(ii*ii + jj*jj)         if r &lt; R:             circle[i,j] = 1  def shift(x,y,w2_size):     ii = float(x - w2_size)     jj = float(y - w2_size)     return ii,jj   def rotate(ii,jj,teta):     i1 =  ii*cos(teta) + jj*sin(teta)     j1 =  ii*sin(teta) + jj*cos(teta)     return i1,j1   circle = np.zeros((w_size, w_size), dtype='int') for i in range(w_size):     for j in range(w_size):         ii,jj = shift(i,j,w2_size)         r = sqrt(ii*ii + jj*jj)         if r &lt; R:             circle[i,j] = 1  def ellipse_p(teta_grad):     ellipse = np.zeros((w_size, w_size), dtype='float32')     teta = radians(teta_grad)     ci1, cj1 = rotate( c,0,teta)     ci2, cj2 = rotate(-c,0,teta)     for i in range(w_size):         for j in range(w_size):             ii,jj = shift(i,j,w2_size)             r1 = sqrt((ii-ci1)*(ii-ci1) + (jj-cj1)*(jj-cj1))             r2 = sqrt((ii-ci2)*(ii-ci2) + (jj-cj2)*(jj-cj2))                          if r1+r2 &lt; 2*A:                 ellipse[i,j] = 255     return (ellipse)  teta_grad = 45.0 ellipse = ellipse_p(teta_grad)  fig, ax = plt.subplots(1, 2,figsize=(10, 20)) ax[0].set_axis_off() ax[0].set_title(\"circle\") ax[0].imshow(circle.squeeze(), cmap='gray', norm=None) ax[1].set_axis_off() ax[1].set_title(\"ellipse\") ax[1].imshow(ellipse.squeeze(), cmap='gray', norm=None) <\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/857\/154\/9a6\/8571549a6bdd37927fc9622f4393885d.png\" width=\"572\" height=\"284\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/857\/154\/9a6\/8571549a6bdd37927fc9622f4393885d.png\"\/><figcaption><\/figcaption><\/figure>\n<pre><code class=\"python\">X = np.zeros((train_len+test_len, w_size, w_size, 1), dtype='float32') Y = np.zeros(train_len+test_len, dtype='float32')  mu = 0.35 sigma = 0.1 el_mu = 0.65 el_sigma = 0.1 view_test = np.random.randint(0, train_len+test_len, (3))  for iii in tqdm.tqdm(range(train_len + test_len)):          angle = np.random.randint(-5,5)+ 45      n = np.random.normal(mu, sigma, size=(w_size, w_size))     el = np.random.normal(el_mu, el_sigma, size=(w_size, w_size))     t = np.zeros((w_size, w_size), dtype='float')     t[circle>0] = n[circle>0]     ellipse = ellipse_p(angle)     t[ellipse>0] = el[ellipse>0]     tf = t.flatten()          ellipse = ellipse_p(0)     n[ellipse>0] = el[ellipse>0]     r = ndimage.rotate(n, angle, reshape=False, mode='nearest')     tts = np.zeros((w_size, w_size), dtype='float')     tts[circle>0] = r[circle>0]     ttf = tts.flatten()           step = np.arange(0., 1., 1.\/255.)          for ii in range(1):         for i in range(1,253):             T = np.sum(np.bitwise_and(tf>step[i], tf&lt;step[i+1]))             TT = np.sum(np.bitwise_and(ttf>step[i], ttf&lt;step[i+1]))             T_TT = T-TT             if abs(T_TT) == 0:                 continue             if T>TT:                 jj = 0                 while True:                     tt_array = np.nonzero(np.bitwise_and(ttf>step[i+1],ttf&lt;step[i+2]))[0]                     if len(tt_array)>=T_TT or i+jj > w_size-2:                         break                     ttf[ttf>step[i+2]] -=step[1]                     jj += 1                 indices = np.arange(len(tt_array))                 np.random.shuffle(indices)                 for j in range(min(len(tt_array), T_TT)):                     ttf[tt_array[indices[j]]] -= step[1]             else:                 tt_array = np.nonzero(np.bitwise_and(ttf>step[i], ttf&lt;step[i+1]))[0]                 if len(tt_array) != 0:                     indices = np.arange(len(tt_array))                     np.random.shuffle(indices)                     for j in range(min(len(tt_array), abs(T_TT))):                         ttf[tt_array[indices[j]]] +=step[1]                                  tt = ttf.reshape(w_size,w_size)      choise = np.random.randint(0, high=65535, dtype=int) % 2     if choise == 1:         X[iii,:,:,0] = t[:,:]         Y[iii] = 0     else:         tt = ttf.reshape(w_size,w_size)         X[iii,:,:,0] = tt         Y[iii] =1              if iii in view_test:         random_idx = int(np.random.uniform(0,train_len))         alpha = 0.05         fig, axs = plt.subplots(1, 3, figsize=(30, 10))         axs[0].set_axis_off()         axs[1].set_axis_off()         axs[2].set_axis_off()         axs[0].imshow(t, cmap=\"gray\")         axs[1].imshow(tt, cmap=\"gray\")         axs[2].imshow(tts, cmap=\"gray\")                      tt_hist,b = np.histogram(256*tt.flatten(), np.arange(1,257))         tts_hist,b = np.histogram(256*tts.flatten(), np.arange(1,257))         t_hist,_ = np.histogram(256*t.flatten(), np.arange(1,257))         fig, axs = plt.subplots(1, 1, figsize=(30, 30))         bins = np.arange(1,256)         axs.plot(bins, tts_hist, 'y')         axs.plot(bins, tt_hist, 'b')         axs.plot(bins, t_hist, 'g')         plt.show(block=True)  yy_train = np.array(keras.utils.to_categorical(Y[:train_len], num_classes)) yy_test = np.array(keras.utils.to_categorical(Y[train_len:], num_classes))  xx_train = np.array(X[:train_len]) xx_test = np.array(X[train_len:])  print(xx_train.shape, yy_train.shape) print(xx_test.shape, yy_test.shape) print(np.min(X), np.max(X))<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b9c\/0d8\/3dc\/b9c0d83dc9a4eeb30c1b485b63198060.png\" width=\"1688\" height=\"506\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b9c\/0d8\/3dc\/b9c0d83dc9a4eeb30c1b485b63198060.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4db\/7f0\/6d7\/4db7f06d7ef43847103d81e5b769e29d.png\" width=\"1708\" height=\"1662\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4db\/7f0\/6d7\/4db7f06d7ef43847103d81e5b769e29d.png\"\/><figcaption><\/figcaption><\/figure>\n<pre><code class=\"python\">batch_size = 25 epochs = 5 num_classes = 2 n_bins = 256  model.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]) #model.summary()  model.fit(xx_train, yy_train, batch_size=batch_size, epochs=epochs,            validation_data=(xx_test, yy_test), verbose = 2)  Epoch 1\/5 200\/200 - 4s - loss: 0.3143 - accuracy: 0.8330 - val_loss: 0.0030 - val_accuracy: 0.9990 Epoch 2\/5 200\/200 - 4s - loss: 0.0077 - accuracy: 0.9978 - val_loss: 2.2245e-04 - val_accuracy: 1.0000 Epoch 3\/5 200\/200 - 4s - loss: 0.0019 - accuracy: 0.9994 - val_loss: 4.2272e-04 - val_accuracy: 1.0000 Epoch 4\/5 200\/200 - 4s - loss: 0.0091 - accuracy: 0.9966 - val_loss: 9.0115e-04 - val_accuracy: 0.9990 Epoch 5\/5 200\/200 - 4s - loss: 0.0105 - accuracy: 0.9964 - val_loss: 0.0067 - val_accuracy: 0.9980<\/code><\/pre>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u0440\u0435\u0437\u044e\u043c\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0435 \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438 \u043d\u0435 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u0438 \u0432\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0443\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438 \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u043c.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/post\/677394\/\"> https:\/\/habr.com\/ru\/post\/677394\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>Long story short <\/em><\/p>\n<p><em>      \u0421\u043e\u0437\u0434\u0430\u044e\u0442 \u043b\u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u044b \u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0435?<\/em><\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 rotate.<\/p>\n<hr\/>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0435\u0431\u0435, \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043a\u043e\u0440\u0438\u043d\u0433\u0430.<br \/>\u041d\u0435\u043a\u0442\u043e \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0435\u0431\u0435, \u043d\u0435\u043a\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u0435\u0431\u044f, \u0431\u0430\u043d\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0435\u0442\u044c \u0438 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u043b\u0438 \u044d\u0442\u043e \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u043d\u0442\u0430\u043c\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u043b\u0430\u043d\u0430 \u0436\u0443\u043b\u0438\u043a\u0430\u043c\u0438.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0439 \u0441\u0435\u0442\u0438 \u0431\u0430\u043d\u043a \u0443\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438 \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0438\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 \u0438 \u0441\u043e\u0433\u043b\u0430\u0448\u0430\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u044f\u0432\u0438\u0442\u0435\u043b\u044e.<br \/>\u0415\u0441\u043b\u0438 \u0431\u0430\u043d\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0441\u0435\u0442\u0438, \u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0433\u043e\u0440\u0438\u0442, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f.<\/p>\n<p>\u0418 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b, <s>\u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0435 \u0442\u0435\u043b\u043e \u044d\u0442\u043e \u0448\u0430\u0440<\/s> \u0441\u043e\u0438\u0441\u043a\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 W_SIZE x W_SIZE, \u043d\u0443 \u0438\u043b\u0438 128\u0445128, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440.<br \/>\u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435\u0442!<\/p>\n<p>\u0418 \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u043c \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u044a\u044f\u0442\u044c \u043d\u0435\u043e\u0431\u044a\u044f\u0442\u043d\u043e\u0435 \u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0447\u0442\u043e \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b.<\/p>\n<p>\u041c\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 w_size \u0445 w_size, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e, \u043c\u044b \u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0442\u0430\u043c, \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0438 \u043d\u0430\u043c \u0433\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043d\u0435 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b \u043b\u0438 \u043d\u0435\u043a\u0442\u043e \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443(\u043c\u0430\u0442\u0440\u0438\u0446\u0443).<\/p>\n<p>\u0422.\u0435. \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0448\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 &#8212; \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\/\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u0435, \u0447\u0442\u043e \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u044b\u043b\u0438 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b. \u041d\u0443 \u0438 \u043d\u0430 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446 \u0431\u0443\u0434\u0435\u043c \u0438 \u0443\u0447\u0438\u0442\u044c.<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0435\u0442\u044c \u043d\u0430 keras \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f &#171;\u043f\u043e\u0432\u043e\u0440\u043e\u0442&#187;<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0433\u0440\u0443\u0437\u0438\u043c<\/p>\n<pre><code class=\"python\">import numpy as np import cv2  from scipy import ndimage, misc, stats from skimage import exposure  from matplotlib import pyplot as plt, colors # work in interactive moode %matplotlib inline   from tensorflow import keras from tensorflow.keras import layers  from math import sqrt, sin, cos, radians  import tqdm<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0443\u044e \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0434\u043d\u0443 \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u043c \u0435\u0451 \u043f\u043e\u043f\u043e\u043b\u0430\u043c. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0438\/\u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0438\u0435 &#8212; \u043a\u0440\u0443\u0433 \u043d\u0430 \u0447\u0435\u0440\u043d\u043e\u043c \u0444\u043e\u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c. \u041f\u0440\u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430\u0445 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043d\u043e\u0441\u044f\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0431\u0435\u0440\u0435\u043c \u043a\u0440\u0443\u0433 \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0435.<\/p>\n<pre><code class=\"python\">w_size = 128 w2_size = w_size \/\/ 2 R = w2_size\/\/2 center = (w2_size, w2_size) scale = 1  circle = np.zeros((w_size, w_size), dtype='uint8') for i in range(w_size):     for j in range(w_size):         ii = float(i - w2_size)         jj = float(j - w2_size)         r = sqrt(ii*ii + jj*jj)         if r &lt; R:             circle[i,j] = 1  def shift(x,y,w2_size):     ii = float(x - w2_size)     jj = float(y - w2_size)     return ii,jj   def rotate(ii,jj,teta):     i1 =  ii*cos(teta) + jj*sin(teta)     j1 =  ii*sin(teta) + jj*cos(teta)     return i1,j1   circle = np.zeros((w_size, w_size), dtype='int') for i in range(w_size):     for j in range(w_size):         ii,jj = shift(i,j,w2_size)         r = sqrt(ii*ii + jj*jj)         if r &lt; R:             circle[i,j] = 1  fig, ax = plt.subplots(1, 1,figsize=(5, 5)) ax.set_axis_off() ax.set_title(\"circle\") ax.imshow(circle.squeeze(), cmap='gray', norm=None) <\/code><\/pre>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<h2>\u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442<\/h2>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0443\u043c\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435.<br \/>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e numpy.random.uniform, \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ndimage.rotate \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0443\u0433\u043e\u043b.<br \/>\u0418\u043b\u0438 \u043d\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0435\u043c. \u0418 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430\u0448\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<br \/>\u0418 \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u043e\u0439 &#8212; 0, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442 \u0438 1 \u0435\u0441\u043b\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442.<br \/>\u0418 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0435 \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u043c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0440\u0443\u0433. \u0422.\u0435. \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u0443\u0431\u0438\u0440\u0430\u0435\u043c.<br \/>\u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0443\u0433 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435.<\/p>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0441\u0435\u0442\u044c \u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e, \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u0445 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c \u043c\u043e\u0436\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0426\u041f\u0422, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441 \u0440\u043e\u0432\u043d\u043e\u0439 (\u043f\u043e\u0447\u0442\u0438) \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439, \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0434\u0430\u044e\u0442 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432 \u0432\u0438\u0434\u0435 \u0433\u043e\u0440\u0431\u0430 ( \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0413\u0430\u0443\u0441\u0441\u0438\u0430\u043d )<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0441 numpy.random.normal \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u0432\u0435\u0440\u0438\u0442 \u043d\u0430 \u0441\u043b\u043e\u0432\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043a\u043e\u0434.<\/p>\n<pre><code class=\"python\">num_classes = 2 train_len = 5000 test_len = 1000 input_shape = (w_size, w_size, 1)  X = np.zeros((train_len+test_len, w_size, w_size, 1), dtype='float32') Y = np.zeros(train_len+test_len, dtype='float32')  mu = 0.25 sigma = 0.05  for iii in tqdm.tqdm(range(train_len + test_len)):          angle = np.random.randint(-5,5)+ 45      n = np.random.uniform(0.25, 0.75, size=(w_size, w_size))     t = np.zeros((w_size, w_size), dtype='float')     t[circle>0] = n[circle>0]          r = ndimage.rotate(n, angle, reshape=False, mode='nearest')     tt = np.zeros((w_size, w_size), dtype='float')     tt[circle>0] = r[circle>0]      choise = np.random.randint(0, high=65535, dtype=int) % 2     if choise == 1:         X[iii,:,:,0] = t[:,:]         Y[iii] = 0     else:         X[iii,:,:,0] = tt[:,:]         Y[iii] =1  yy_train = np.array(keras.utils.to_categorical(Y[:train_len], num_classes)) yy_test = np.array(keras.utils.to_categorical(Y[train_len:], num_classes))  xx_train = np.array(X[:train_len]) xx_test = np.array(X[train_len:])  print(xx_train.shape, yy_train.shape) print(xx_test.shape, yy_test.shape) <\/code><\/pre>\n<pre><code class=\"python\"> nrows=2 ncols=4 fig, ax = plt.subplots(nrows*2, ncols,figsize=(16, 20))  for ii in range(nrows):     for jj in range(ncols):         random_characters = int(np.random.uniform(0,train_len))         ax[2*ii,jj].set_axis_off()         ax[2*ii,jj].set_title(str(int(Y[random_characters])))         ax[2*ii,jj].imshow(X[random_characters].squeeze(), cmap='gray', norm=None)         tx = X[random_characters]         ax[2*ii+1,jj].hist(255.*X[random_characters].flatten(), np.arange(1,256), facecolor='blue',histtype='step')  plt.show(block=True)<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442<\/h2>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c, \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0443\u0436\u0435 \u0441 numpy.random.normal \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c.<br \/> \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u0418 \u0447\u0430\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043f\u043e\u0432\u0435\u0440\u043d\u0435\u043c.<br \/> \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0438\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442.<br \/> \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043d\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0443 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0445 \u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a. \u041e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438, \u043d\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0435. \u0422\u0435\u0441\u0442 \u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442.<\/p>\n<pre><code class=\"python\">X = np.zeros((train_len+test_len, w_size, w_size, 1), dtype='float32') Y = np.zeros(train_len+test_len, dtype='float32')  mu = 0.45 sigma = 0.1  for iii in tqdm.tqdm(range(train_len + test_len)):          angle = np.random.randint(-5,5)+ 45      n = np.random.normal(mu, sigma, size=(w_size, w_size))     t = np.zeros((w_size, w_size), dtype='float')     t[circle>0] = n[circle>0]          r = ndimage.rotate(n, angle, reshape=False, mode='nearest')     tt = np.zeros((w_size, w_size), dtype='float')     tt[circle>0] = r[circle>0]      choise = np.random.randint(0, high=65535, dtype=int) % 2     if choise == 1:         X[iii,:,:,0] = t[:,:]         Y[iii] = 0     else:         X[iii,:,:,0] = tt[:,:]         Y[iii] =1  yy_train = np.array(keras.utils.to_categorical(Y[:train_len], num_classes)) yy_test = np.array(keras.utils.to_categorical(Y[train_len:], num_classes))  xx_train = np.array(X[:train_len]) xx_test = np.array(X[train_len:])  print(xx_train.shape, yy_train.shape) print(xx_test.shape, yy_test.shape) <\/code><\/pre>\n<pre><code>nrows=2 ncols=4 fig, ax = plt.subplots(nrows*2, ncols,figsize=(16, 20))  for ii in range(nrows):     for jj in range(ncols):         random_characters = int(np.random.uniform(0,train_len))         ax[2*ii,jj].set_axis_off()         ax[2*ii,jj].set_title(str(int(Y[random_characters])))         ax[2*ii,jj].imshow(X[random_characters].squeeze(), cmap='gray', norm=None)         ax[2*ii+1,jj].hist(255.*X[random_characters].flatten(), np.arange(1,256),\\                            facecolor='blue',histtype='step')  plt.show(block=True) <\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<pre><code>model = keras.Sequential(     [         keras.Input(shape=input_shape),         layers.Conv2D(32, kernel_size=(3, 3), activation=\"relu\"),         layers.Conv2D(32, kernel_size=(3, 3), activation=\"relu\"),         layers.MaxPooling2D(pool_size=(2, 2)),         layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"),         layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"), #        layers.MaxPooling2D(pool_size=(2, 2)),         layers.Flatten(),         layers.Dropout(0.5),         layers.Dense(128, activation=\"relu\"),         layers.Dense(num_classes, activation=\"softmax\"),     ] )  batch_size = 25 epochs = 5 num_classes = 2 n_bins = 256  model.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"]) #model.summary()  model.fit(xx_train, yy_train, batch_size=batch_size, epochs=epochs,            validation_data=(xx_test, yy_test), verbose = 2) <\/code><\/pre>\n<p>Epoch 1\/5 <\/p>\n<p>200\/200 &#8212; 6s &#8212; loss: 0.2437 &#8212; accuracy: 0.8638 &#8212; val_loss: 4.7537e-05 &#8212; val_accuracy: 1.0000 <\/p>\n<p>Epoch 2\/5 <\/p>\n<p>200\/200 &#8212; 4s &#8212; loss: 3.7514e-05 &#8212; accuracy: 1.0000 &#8212; val_loss: 2.2031e-05 &#8212; val_accuracy: 1.0000 <\/p>\n<p>Epoch 3\/5<\/p>\n<p>200\/200 &#8212; 4s &#8212; loss: 1.8480e-05 &#8212; accuracy: 1.0000 &#8212; val_loss: 1.1520e-05 &#8212; val_accuracy: 1.0000 <\/p>\n<p>Epoch 4\/5<\/p>\n<p> 200\/200 &#8212; 4s &#8212; loss: 1.0300e-05 &#8212; accuracy: 1.0000 &#8212; val_loss: 6.6436e-06 &#8212; val_accuracy: 1.0000 <\/p>\n<p>Epoch 5\/5<\/p>\n<p> 200\/200 &#8212; 4s &#8212; loss: 5.9791e-06 &#8212; accuracy: 1.0000 &#8212; val_loss: 4.1065e-06 &#8212; val_accuracy: 1.0000<\/p>\n<h2>\u0422\u0440\u0435\u0442\u0438\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442<\/h2>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c, \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441 numpy.random.normal \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c.<br \/>\u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f.<br \/>\u0418 \u0447\u0430\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043f\u043e\u0432\u0435\u0440\u043d\u0435\u043c.<\/p>\n<p>\u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u043a\u0430\u0437\u0438\u043c \u0442\u0430\u043a, \u0447\u0442\u043e \u0431\u044b \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0439 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0430 \u0441 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.<br \/>\u0418 \u0442\u0443\u0442 \u0447\u0443\u0434\u043e, \u0441\u0435\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043e\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445, \u0435\u0441\u043b\u0438 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u0430\u043b\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>\u041d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0443\u043c\u0435\u043d, \u044d\u0442\u043e\u0442 \u0432\u0430\u0448 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442<\/p>\n<pre><code class=\"python\">X = np.zeros((train_len+test_len, w_size, w_size, 1), dtype='float32') Y = np.zeros(train_len+test_len, dtype='float32')  mu = 0.45 sigma = 0.1  view_test = np.random.randint(0, train_len+test_len, (3))  for iii in tqdm.tqdm(range(train_len + test_len)):          angle = np.random.randint(-5,5)+ 45      n = np.random.normal(mu, sigma, size=(w_size, w_size))     t = np.zeros((w_size, w_size), dtype='float')     t[circle>0] = n[circle>0]     tf = t.flatten()          r = ndimage.rotate(n, angle, reshape=False, mode='nearest')     tt =<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-335814","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335814","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=335814"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335814\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=335814"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=335814"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=335814"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}