{"id":298933,"date":"2020-02-19T15:00:21","date_gmt":"2020-02-19T15:00:21","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=298933"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=298933","title":{"rendered":"\u0410\u043d\u0441\u0430\u043c\u0431\u043b\u0438 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0441 PyTorch \u0438 Sklearn"},"content":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/489058\/\">\n<p>\u041d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b. \u0418\u0445 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u043e\u0431\u043e\u0431\u0449\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0438\u0437\u043a\u043e\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e. \u041d\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435\u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435?<\/p>\n<p>  <\/p>\n<p>\u0418 \u0442\u0443\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0438&#8230;<\/p>\n<p>  <\/p>\n<h3 id=\"chto-takoe-ansambli\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0438<\/h3>\n<p>  <\/p>\n<p>\u0410\u043d\u0441\u0430\u043c\u0431\u043b\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 (\u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0445) \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043e\u0431\u0443\u0447\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0438\u0445 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043e\u0434\u043d\u0443 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0443\u044e (\u0432 \u043f\u043b\u0430\u043d\u0435 \u043e\u0431\u043e\u0431\u0449\u0430\u044e\u0449\u0435\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u2014 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 &quot;\u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c&quot; \u0434\u0430\u043d\u043d\u044b\u0435) \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <em>\u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c\u044e<\/em>. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u041e\u043d\u0430 \u043a\u0430\u043a \u0431\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u044b\u0442 \u0432\u0441\u0435\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0438 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h3 id=\"plan\">\u041f\u043b\u0430\u043d<\/h3>\n<p>  <\/p>\n<ol>\n<li>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u0441\u0442\u0443\u044e PyTorch-\u043c\u043e\u0434\u0435\u043b\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e<\/li>\n<li>\u0417\u0430\u0442\u0435\u043c \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Scikit-learn \u0438 \u0443\u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f<\/li>\n<\/ol>\n<p>  <\/p>\n<h2 id=\"odna-edinstvennaya-model\">\u041e\u0434\u043d\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c<\/h2>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u043e\u043c Digits \u0438\u0437 Sklearn, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 from sklearn.datasets import load_digits import numpy as np import matplotlib.pyplot as plt  # \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 x, y = load_digits(n_class=10, return_X_y=True)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">print(x.shape) &gt;&gt;&gt; (1797, 64) print(np.unique(y)) &gt;&gt;&gt; array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"python\">index = 0  print(y[index]) plt.imshow(x[index].reshape(8, 8), cmap=&quot;Greys&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/o4\/ij\/xw\/o4ijxwehip-ohrmx0drg7ma3kje.png\" alt=\"\u041f\u0440\u044d\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043d\u043e\u043b\u0438\u043a\"><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">x[index] &gt;&gt;&gt; array([ 0.,  0.,  5., 13.,  9.,  1.,  0.,  0.,  0.,  0., 13., 15., 10.,        15.,  5.,  0.,  0.,  3., 15.,  2.,  0., 11.,  8.,  0.,  0.,  4.,        12.,  0.,  0.,  8.,  8.,  0.,  0.,  5.,  8.,  0.,  0.,  9.,  8.,         0.,  0.,  4., 11.,  0.,  1., 12.,  7.,  0.,  0.,  2., 14.,  5.,        10., 12.,  0.,  0.,  0.,  0.,  6., 13., 10.,  0.,  0.,  0.])<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u0433\u0430, \u0447\u0438\u0441\u0435\u043b\u043a\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 0 \u0434\u043e 15. \u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0443\u0436\u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler  # \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u043d\u0430 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043e\u0447\u043d\u0443\u044e \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2,                                                     shuffle=True, random_state=42) print(x_train.shape) &gt;&gt;&gt; (1437, 64) print(x_test.shape) &gt;&gt;&gt; (360, 64)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c StandardScaler: \u043e\u043d \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0442 -1 \u0434\u043e 1. \u041e\u0431\u0443\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0435 \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u0441\u044f \u043f\u043e\u0434 \u0442\u0435\u0441\u0442 \u2014 \u0442\u0430\u043a score \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u0438\u0436\u0435 \u043a score&#8217;\u0443 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">scaler = StandardScaler() scaler.fit(x_train)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">x_train_scaled = scaler.transform(x_train) x_test_scaled = scaler.transform(x_test)<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"vremya-torcha\">\u0412\u0440\u0435\u043c\u044f Torch&#8217;\u0430!<\/h3>\n<p>  <\/p>\n<pre><code class=\"python\">import torch from torch.utils.data import TensorDataset, DataLoader import torch.nn as nn import torch.nn.functional as F from torch.optim import Adam<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0432\u0435\u0440\u0442\u043e\u0447\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">class SimpleCNN(nn.Module):   def __init__(self):     super(SimpleCNN, self).__init__()      # \u0441\u043b\u043e\u0438 \u0441\u0432\u0435\u0440\u0442\u043a\u0438     self.conv1 = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=5, stride=1, padding=2)     self.conv1_s = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=5, stride=2, padding=2)     self.conv2 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=1)     self.conv2_s = nn.Conv2d(in_channels=6, out_channels=6, kernel_size=3, stride=2, padding=1)     self.conv3 = nn.Conv2d(in_channels=6, out_channels=10, kernel_size=3, stride=1, padding=1)     self.conv3_s = nn.Conv2d(in_channels=10, out_channels=10, kernel_size=3, stride=2, padding=1)      self.flatten = nn.Flatten()     # \u0433\u043e\u0440\u0434\u044b\u0439 \u043f\u043e\u043b\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043b\u043e\u0439     self.fc1 = nn.Linear(10, 10)    # \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f &quot;\u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u044f&quot; \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0443   def forward(self, x):     x = F.relu(self.conv1(x))     x = F.relu(self.conv1_s(x))     x = F.relu(self.conv2(x))     x = F.relu(self.conv2_s(x))     x = F.relu(self.conv3(x))     x = F.relu(self.conv3_s(x))      x = self.flatten(x)     x = self.fc1(x)     x = F.softmax(x)      return x<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b :<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">batch_size = 64 # \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u0442\u0447\u0430 learning_rate = 1e-3 # \u0448\u0430\u0433 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430 epochs = 200 # \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043f\u043e\u0445 \u043e\u0431\u0443\u0447\u0430\u0435\u043c\u0441\u044f<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 PyTorch:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">x_train_tensor = torch.tensor(x_train_scaled.reshape(-1, 1, 8, 8).astype(np.float32)) x_test_tensor = torch.tensor(x_test_scaled.reshape(-1, 1, 8, 8).astype(np.float32))  y_train_tensor = torch.tensor(y_train.astype(np.long)) y_test_tensor = torch.tensor(y_test.astype(np.long))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 PyTorch \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0442\u0435\u043d\u0437\u043e\u0440\u044b. \u0417\u0434\u0435\u0441\u044c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u2014 \u0448\u0442\u0443\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0430\u0440\u0443 X \u0438 y \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 (\u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432), \u0430 DataLoader \u2014 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u043f\u0430\u0440\u044b &lt;X, y&gt; \u0431\u0430\u0442\u0447\u0430\u043c\u0438 \u043f\u043e 64 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">train_dataset = TensorDataset(x_train_tensor, y_train_tensor) train_loader = DataLoader(train_dataset, batch_size=batch_size)  test_dataset = TensorDataset(x_test_tensor, y_test_tensor) test_loader = DataLoader(test_dataset, batch_size=batch_size)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0428\u0442\u0443\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">simple_cnn = SimpleCNN().cuda() # \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u043d\u0430 gpu, \u0447\u0442\u043e\u0431\u044b \u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0436\u0438\u043b\u043e\u0441\u044c \u0432\u0435\u0441\u0435\u043b\u0435\u0435 criterion = nn.CrossEntropyLoss() optimizer = Adam(simple_cnn.parameters(), lr=learning_rate)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0441\u0430\u043c\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">for epoch in range(epochs): # \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f 200 \u044d\u043f\u043e\u0445   simple_cnn.train()   train_samples_count = 0 # \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u0440\u043e\u0433\u043d\u0430\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0443   true_train_samples_count = 0 # \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a   running_loss = 0    for batch in train_loader:     x_data = batch[0].cuda() # \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u043d\u0430 gpu     y_data = batch[1].cuda()      y_pred = simple_cnn(x_data)     loss = criterion(y_pred, y_data)      optimizer.zero_grad()     loss.backward()     optimizer.step() # \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438      running_loss += loss.item()      y_pred = y_pred.argmax(dim=1, keepdim=False)     true_classified = (y_pred == y_data).sum().item() # \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0431\u0430\u0442\u0447\u0435     true_train_samples_count += true_classified     train_samples_count += len(x_data) # \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u0430\u0442\u0447\u0430    train_accuracy = true_train_samples_count \/ train_samples_count   print(f&quot;[{epoch}] train loss: {running_loss}, accuracy: {round(train_accuracy, 4)}&quot;) # \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043b\u043e\u0433\u0438    # \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0443   simple_cnn.eval()   test_samples_count = 0   true_test_samples_count = 0   running_loss = 0    for batch in test_loader:     x_data = batch[0].cuda()     y_data = batch[1].cuda()      y_pred = simple_cnn(x_data)     loss = criterion(y_pred, y_data)      loss.backward()      running_loss += loss.item()      y_pred = y_pred.argmax(dim=1, keepdim=False)     true_classified = (y_pred == y_data).sum().item()     true_test_samples_count += true_classified     test_samples_count += len(x_data)    test_accuracy = true_test_samples_count \/ test_samples_count   print(f&quot;[{epoch}] test loss: {running_loss}, accuracy: {round(test_accuracy, 4)}&quot;)<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u0418\u0437-\u0437\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Torch&#8217;\u0430 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0412\u0430\u0448\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u0437\u0434\u0435\u0441\u044c. \u042d\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 20 \u044d\u043f\u043e\u0445.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">[180] train loss: 40.52328181266785, accuracy: 0.6966 [180] test loss: 10.813781499862671, accuracy: 0.6583 [181] train loss: 40.517325043678284, accuracy: 0.6966 [181] test loss: 10.811877608299255, accuracy: 0.6611 [182] train loss: 40.517088294029236, accuracy: 0.6966 [182] test loss: 10.814386487007141, accuracy: 0.6611 [183] train loss: 40.515315651893616, accuracy: 0.6966 [183] test loss: 10.812204122543335, accuracy: 0.6611 [184] train loss: 40.5108939409256, accuracy: 0.6966 [184] test loss: 10.808713555335999, accuracy: 0.6639 [185] train loss: 40.50885498523712, accuracy: 0.6966 [185] test loss: 10.80833113193512, accuracy: 0.6639 [186] train loss: 40.50892996788025, accuracy: 0.6966 [186] test loss: 10.809209108352661, accuracy: 0.6639 [187] train loss: 40.508036971092224, accuracy: 0.6966 [187] test loss: 10.806900978088379, accuracy: 0.6667 [188] train loss: 40.507275462150574, accuracy: 0.6966 [188] test loss: 10.79791784286499, accuracy: 0.6611 [189] train loss: 40.50368785858154, accuracy: 0.6966 [189] test loss: 10.799399137496948, accuracy: 0.6667 [190] train loss: 40.499858379364014, accuracy: 0.6966 [190] test loss: 10.795265793800354, accuracy: 0.6611 [191] train loss: 40.498780846595764, accuracy: 0.6966 [191] test loss: 10.796114206314087, accuracy: 0.6639 [192] train loss: 40.497228503227234, accuracy: 0.6966 [192] test loss: 10.790620803833008, accuracy: 0.6639 [193] train loss: 40.44325613975525, accuracy: 0.6973 [193] test loss: 10.657087206840515, accuracy: 0.7 [194] train loss: 39.62049174308777, accuracy: 0.7495 [194] test loss: 10.483307123184204, accuracy: 0.7222 [195] train loss: 39.24516046047211, accuracy: 0.7613 [195] test loss: 10.462445378303528, accuracy: 0.7278 [196] train loss: 39.16947162151337, accuracy: 0.762 [196] test loss: 10.488057255744934, accuracy: 0.7222 [197] train loss: 39.196797251701355, accuracy: 0.7634 [197] test loss: 10.502906918525696, accuracy: 0.7222 [198] train loss: 39.395434617996216, accuracy: 0.7537 [198] test loss: 10.354896545410156, accuracy: 0.7472 [199] train loss: 39.331292152404785, accuracy: 0.7509 [199] test loss: 10.367400050163269, accuracy: 0.7389<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0430 \u043f\u0435\u0440\u0435\u043e\u0431\u0443\u0447\u0438\u043b\u0430\u0441\u044c: \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0430 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u0432\u044b\u0448\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439.<\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0422\u0430\u043a, \u0438 \u0447\u0442\u043e \u0436\u0435 \u0438\u043c\u0435\u0435\u043c: \u0442\u043e\u043b\u044c\u043a\u043e <strong>74%<\/strong> \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u043c\u0438. Not great, not terrible.<\/p>\n<p>  <\/p>\n<h2 id=\"vremya-uluchsheniy\">\u0412\u0440\u0435\u043c\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439!<\/h2>\n<p>  <\/p>\n<p>\u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Bagging. \u041e\u0447\u0435\u043d\u044c \u043a\u0440\u0430\u0442\u043a\u043e \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a: \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043e\u0431\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0433\u043e\u043b\u043e\u0441\u0443\u044e\u0442 \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0418 \u0442\u0443\u0442 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: \u043b\u0438\u0431\u043e \u0432\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e &quot;\u0446\u0435\u043d\u0443&quot; \u0433\u043e\u043b\u043e\u0441\u0430, \u043b\u0438\u0431\u043e \u0443 \u0438\u0445 \u0433\u043e\u043b\u043e\u0441\u043e\u0432 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u0435\u0441\u0430. \u041f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0440\u0435\u0434\u043d\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>  <\/p>\n<p>\u0412 sklearn \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c <code>ensembles<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0435\u0439. \u041d\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439 \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>BaggingClassifier<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import sklearn from sklearn.ensemble import BaggingClassifier<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u043d\u0441\u0430\u043c\u0431\u043b\u0438 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 <em>\u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438<\/em>. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 sklearn, \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u2014 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0430\u044f \u043c\u0435\u0442\u043e\u0434\u044b <code>sklearn.base.BaseEstimator<\/code>. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0438\u0434\u0430 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u044f, \u0431\u0443\u0434\u0443\u0442 \u043d\u0443\u0436\u043d\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u044d\u0442\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>fit<\/code> (\u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438), \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>predict_proba<\/code>, \u0432\u044b\u0434\u0430\u044e\u0449\u0443\u044e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 (\u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043c\u043e\u0433\u043b\u0430 \u043f\u043e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044f\u043c \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0433\u043e\u043b\u043e\u0441\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u0432\u0435\u0441\u0430), \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>predict<\/code> (\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0434\u0430\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u0430), \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0434\u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0442\u043e\u043c \u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u043e &quot;\u0441\u043a\u043b\u0435\u0438\u0442\u044c&quot; \u0432 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. \u0418\u0437 \u0442\u0435\u0445 \u0433\u0440\u0430\u0431\u043b\u0435\u0439, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0443\u0441\u043f\u0435\u043b \u043d\u0430\u0442\u043a\u043d\u0443\u0442\u044c\u0441\u044f, \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0438\u0445 \u0442\u0438\u043f\u044b.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 (\u0430 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0430\u0436 2 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 <code>get_params<\/code> \u0438 <code>set_params<\/code>), \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0442\u0435 \u0436\u0435 \u0438\u043c\u0435\u043d\u0430, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430. \u0422\u043e \u0435\u0441\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0434\u0430\u0435\u0442\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>net_type<\/code>, \u0442\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>__init__<\/code> \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>net_type<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043b\u0443\u0447\u0448\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043d\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 (\u0430 sklearn \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0443\u044e \u0432\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043d\u0443\u0436\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439) \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 <code>copy<\/code>, <code>deepcopy<\/code> \u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 (\u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439) \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0434\u0435\u043b\u0438, \u0430 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">class PytorchModel(sklearn.base.BaseEstimator):   def __init__(self, net_type, net_params, optim_type, optim_params, loss_fn,                input_shape, batch_size=32, accuracy_tol=0.02, tol_epochs=10,                cuda=True):     self.net_type = net_type # \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438     self.net_params = net_params # \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438     self.optim_type = optim_type # \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430     self.optim_params = optim_params # \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430     self.loss_fn = loss_fn # \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 loss'\u0430      self.input_shape = input_shape # \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445     self.batch_size = batch_size # \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u0442\u0447\u0430     self.accuracy_tol = accuracy_tol # \u043f\u043e\u0440\u043e\u0433 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438, \u043e\u0431 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 -- \u043f\u043e\u0437\u0436\u0435     self.tol_epochs = tol_epochs # \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043f\u043e\u0445 \u043f\u0440\u0438 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u043e\u0433\u0435 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438     self.cuda = cuda # \u043e\u0431\u0443\u0447\u0430\u0435\u043c \u043b\u0438 \u043d\u0430 gpu<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: \u043c\u0435\u0442\u043e\u0434 <code>fit<\/code>. \u041f\u043e \u0441\u0443\u0442\u0438, \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u2014 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0447\u0438\u0442\u0430\u0435\u043c Loss, \u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441: \u043a\u0430\u043a \u043d\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043f\u043e\u0445 \u043d\u0430\u0434\u043e \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c? \u041f\u0435\u0440\u0432\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043f\u043e\u0445 \u0434\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 200 (\u043a\u0430\u043a \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438). \u041d\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u0435\u0440\u0435\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043a \u043d\u0435\u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e. \u0412\u0442\u043e\u0440\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f accuracy \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. \u0423 \u043f\u0435\u0440\u0432\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 accuracy \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043f\u043e\u0445 \u043f\u043e\u0434\u0440\u044f\u0434. \u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0436\u0435 \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 (<code>tol_epochs<\/code>) \u044d\u043f\u043e\u0445 \u043d\u0435 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0441\u0432\u043e\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e (\u0442\u043e \u0435\u0441\u0442\u044c accuracy \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0431\u043e\u043b\u0435\u0435, \u0447\u0435\u043c \u043d\u0430 <code>accuracy_tol<\/code>).<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">  def fit(self, X, y):     self.net = self.net_type(**self.net_params) # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0448\u0443 \u0441\u0435\u0442\u044c \u0438\u0437 \u0435\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432     # `**self.net_params` \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u0430\u043a \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f     if self.cuda:       self.net = self.net.cuda() # \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u0435\u0442\u044c \u043d\u0430 gpu, \u0435\u0441\u043b\u0438 \u043e\u0431\u0443\u0447\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043d\u0435\u043c     self.optim = self.optim_type(self.net.parameters(), **self.optim_params) # \u043a\u0430\u043a \u0438 \u0441\u0435\u0442\u044c, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440     # \u0432 \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043e\u0431\u0443\u0447\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438      uniq_classes = np.sort(np.unique(y)) # \u0438\u0449\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b     self.classes_ = uniq_classes # \u043e\u0434\u043d\u043e \u0438\u0437 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u044f \u0432 sklearn -- \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 `classes_`      X = X.reshape(-1, *self.input_shape) # \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438     # \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0438 DataLoader     x_tensor = torch.tensor(X.astype(np.float32))     y_tensor = torch.tensor(y.astype(np.long))     train_dataset = TensorDataset(x_tensor, y_tensor)     train_loader = DataLoader(train_dataset, batch_size=self.batch_size,                               shuffle=True, drop_last=False)     last_accuracies = [] # \u0442\u0443\u0442 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f accuracy \u043c\u043e\u0434\u0435\u043b\u0438 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 `tol_epochs` \u044d\u043f\u043e\u0445     epoch = 0     keep_training = True     while keep_training:       self.net.train() # \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u0432\u0430\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 BatchNormalization)       train_samples_count = 0 # \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u043a\u0438       true_train_samples_count = 0 # \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u043a\u0438        for batch in train_loader:         x_data, y_data = batch[0], batch[1]         if self.cuda:           x_data = x_data.cuda()           y_data = y_data.cuda()          # \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0435\u043b\u044c         y_pred = self.net(x_data)         loss = self.loss_fn(y_pred, y_data)          # \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438         self.optim.zero_grad()         loss.backward()         self.optim.step()          y_pred = y_pred.argmax(dim=1, keepdim=False) # \u0438\u0449\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438, \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441         true_classified = (y_pred == y_data).sum().item() # \u0438\u0449\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432         true_train_samples_count += true_classified         train_samples_count += len(x_data)        train_accuracy = true_train_samples_count \/ train_samples_count # \u0441\u0447\u0438\u0442\u0430\u0435\u043c accuracy       last_accuracies.append(train_accuracy)        if len(last_accuracies) &gt; self.tol_epochs:         last_accuracies.pop(0)        if len(last_accuracies) == self.tol_epochs:         accuracy_difference = max(last_accuracies) - min(last_accuracies) # \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u043e\u0432\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 accuracy \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 `tol_epochs` \u044d\u043f\u043e\u0445         if accuracy_difference &lt;= self.accuracy_tol:           keep_training = False # \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0430\u043b\u0430, \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u041f\u043e \u0441\u0443\u0442\u0438 \u2014 \u0442\u0430\u043a \u0436\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u043c Loss, \u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0432 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043c\u0430\u0441\u0441\u0438\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">  def predict_proba(self, X, y=None):     # \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 fit, \u0434\u0435\u043b\u0430\u0435\u043c DataLoader, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u0431\u0440\u0430\u0442\u044c \u0431\u0430\u0442\u0447\u0438     X = X.reshape(-1, *self.input_shape)     x_tensor = torch.tensor(X.astype(np.float32))     if y:       y_tensor = torch.tensor(y.astype(np.long))     else:       y_tensor = torch.zeros(len(X), dtype=torch.long)     test_dataset = TensorDataset(x_tensor, y_tensor)     test_loader = DataLoader(test_dataset, batch_size=self.batch_size,                               shuffle=False, drop_last=False)      self.net.eval() # \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0432\u0430\u0436\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u0430\u043a \u0438 `train`, \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 BatchNormalization, \u0433\u0434\u0435 \u0441\u043b\u043e\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438     predictions = [] # \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u0443\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f     for batch in test_loader:       x_data, y_data = batch[0], batch[1]       if self.cuda:         x_data = x_data.cuda()         y_data = y_data.cuda()        y_pred = self.net(x_data)        predictions.append(y_pred.detach().cpu().numpy()) # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0438\u0445 \u0432 numpy-\u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u043c\u0438      predictions = np.concatenate(predictions) # \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0430\u0442\u0447\u0435\u0439 \u0432 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438     return predictions<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">  def predict(self, X, y=None):     predictions = self.predict_proba(X, y) # \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0440\u0430\u043d\u0435\u0435     predictions = predictions.argmax(axis=1) # \u0431\u0435\u0440\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438, \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c     return predictions<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">class PytorchModel(sklearn.base.BaseEstimator):   def __init__(self, net_type, net_params, optim_type, optim_params, loss_fn,                input_shape, batch_size=32, accuracy_tol=0.02, tol_epochs=10,                cuda=True):     self.net_type = net_type     self.net_params = net_params     self.optim_type = optim_type     self.optim_params = optim_params     self.loss_fn = loss_fn      self.input_shape = input_shape     self.batch_size = batch_size     self.accuracy_tol = accuracy_tol     self.tol_epochs = tol_epochs     self.cuda = cuda    def fit(self, X, y):     self.net = self.net_type(**self.net_params)     if self.cuda:       self.net = self.net.cuda()     self.optim = self.optim_type(self.net.parameters(), **self.optim_params)      uniq_classes = np.sort(np.unique(y))     self.classes_ = uniq_classes      X = X.reshape(-1, *self.input_shape)     x_tensor = torch.tensor(X.astype(np.float32))     y_tensor = torch.tensor(y.astype(np.long))     train_dataset = TensorDataset(x_tensor, y_tensor)     train_loader = DataLoader(train_dataset, batch_size=self.batch_size,                               shuffle=True, drop_last=False)     last_accuracies = []     epoch = 0     keep_training = True     while keep_training:       self.net.train()       train_samples_count = 0       true_train_samples_count = 0        for batch in train_loader:         x_data, y_data = batch[0], batch[1]         if self.cuda:           x_data = x_data.cuda()           y_data = y_data.cuda()          y_pred = self.net(x_data)         loss = self.loss_fn(y_pred, y_data)          self.optim.zero_grad()         loss.backward()         self.optim.step()          y_pred = y_pred.argmax(dim=1, keepdim=False)         true_classified = (y_pred == y_data).sum().item()         true_train_samples_count += true_classified         train_samples_count += len(x_data)        train_accuracy = true_train_samples_count \/ train_samples_count       last_accuracies.append(train_accuracy)        if len(last_accuracies) &gt; self.tol_epochs:         last_accuracies.pop(0)        if len(last_accuracies) == self.tol_epochs:         accuracy_difference = max(last_accuracies) - min(last_accuracies)         if accuracy_difference &lt;= self.accuracy_tol:           keep_training = False    def predict_proba(self, X, y=None):     X = X.reshape(-1, *self.input_shape)     x_tensor = torch.tensor(X.astype(np.float32))     if y:       y_tensor = torch.tensor(y.astype(np.long))     else:       y_tensor = torch.zeros(len(X), dtype=torch.long)     test_dataset = TensorDataset(x_tensor, y_tensor)     test_loader = DataLoader(test_dataset, batch_size=self.batch_size,                               shuffle=False, drop_last=False)      self.net.eval()     predictions = []     for batch in test_loader:       x_data, y_data = batch[0], batch[1]       if self.cuda:         x_data = x_data.cuda()         y_data = y_data.cuda()        y_pred = self.net(x_data)        predictions.append(y_pred.detach().cpu().numpy())      predictions = np.concatenate(predictions)     return predictions    def predict(self, X, y=None):     predictions = self.predict_proba(X, y)     predictions = predictions.argmax(axis=1)     return predictions<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u043d\u043e\u0432\u043e\u0438\u0441\u043f\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">base_model = PytorchModel(net_type=SimpleCNN, net_params=dict(), optim_type=Adam,                           optim_params={&quot;lr&quot;: 1e-3}, loss_fn=nn.CrossEntropyLoss(),                           input_shape=(1, 8, 8), batch_size=32, accuracy_tol=0.02,                           tol_epochs=10, cuda=True)  base_model.fit(x_train_scaled, y_train) # \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438  preds = base_model.predict(x_test_scaled) # \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 true_classified = (preds == y_test).sum() # \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 test_accuracy = true_classified \/ len(y_test) # accuracy  print(f&quot;Test accuracy: {test_accuracy}&quot;) &gt;&gt;&gt; Test accuracy: 0.7361111111111112<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">meta_classifier = BaggingClassifier(base_estimator=base_model, n_estimators=10) # \u0437\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430  meta_classifier.fit(x_train_scaled.reshape(-1, 64), y_train) # \u043e\u0431\u0443\u0447\u0430\u0435\u043c \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435, \u043d\u0430 \u0432\u0445\u043e\u0434 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 reshape'\u0438\u043c &gt;&gt;&gt; BaggingClassifier(            base_estimator=PytorchModel(accuracy_tol=0.02, batch_size=32,               cuda=True, input_shape=(1, 8, 8),               loss_fn=CrossEntropyLoss(),               net_params={},               net_type=&lt;class '__main__.SimpleCNN'&gt;,               optim_params={'lr': 0.001},               optim_type=&lt;class 'torch.optim.adam.Adam'&gt;,               tol_epochs=10),           bootstrap=True, bootstrap_features=False, max_features=1.0,           max_samples=1.0, n_estimators=10, n_jobs=None,           oob_score=False, random_state=None, verbose=0,           warm_start=False)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>score<\/code> \u043e\u0446\u0435\u043d\u0438\u0442\u044c accuracy \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">print(meta_classifier.score(x_test_scaled.reshape(-1, 64), y_test)) &gt;&gt;&gt; 0.95<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"nekotorye-vyvody-i-kuda-dvigatsya-dalshe\">\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b \u0438 \u043a\u0443\u0434\u0430 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435<\/h2>\n<p>  <\/p>\n<p>\u0410\u043d\u0441\u0430\u043c\u0431\u043b\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0447\u0435\u043c \u043e\u0434\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043e\u0431\u043e\u0431\u0449\u0430\u044e\u0449\u0435\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438. \u0423 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0435\u0439 \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/ai.googleblog.com\/2020\/01\/can-you-trust-your-models-uncertainty.html\" rel=\"nofollow\">\u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438<\/a>, \u0447\u0442\u043e \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u043c\u0438 \u043d\u0430 \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0445 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 &quot;\u0441\u043a\u0430\u043a\u0430\u0442\u044c&quot; \u0438\u0437-\u0437\u0430 \u043d\u0435\u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0438). <\/p>\n<p>  <\/p>\n<h3 id=\"chto-mozhno-uluchshit\">\u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c?<\/h3>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 Loss&#8217;\u044b \u0438\u043b\u0438 \u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0445\u043e\u0434\u0443.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c Boosting. \u0415\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Bagging&#8217;\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043d\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u0430 \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u043c (\u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c) \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c \u043f\u0440\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0432\u0435\u0441. \u0422\u0443\u0442 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/github.com\/scikit-learn\/scikit-learn\/blob\/master\/sklearn\/ensemble\/_weight_boosting.py\" rel=\"nofollow\">\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 sklearn<\/a>, \u0430 \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e \u0443\u043c\u043d\u043e\u0436\u0430\u0442\u044c Loss \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438 \u043d\u0430 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u0435\u0441\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u043c\u043e\u0436\u043d\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u044c \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043d\u0435\u0439\u0440\u043e\u043d\u043e\u043a. \u0422\u043e\u0433\u0434\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0434\u0435\u043b\u0438 &quot;\u0432\u0438\u0434\u044f\u0442&quot; \u0434\u0430\u043d\u043d\u044b\u0435. \u041a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0443 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0437\u0440\u0435\u043d\u0438\u044f, \u0438 \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0433\u043b\u0443\u0431\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e.<\/p>\n<p>  <\/p>\n<h3 id=\"terpelivomu-chitatelyu\">\u0422\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u043e\u043c\u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e<\/h3>\n<p>  <\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u044d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u041c\u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u0412\u0430\u0448\u0435 \u043c\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438\u0434\u0435\u0438, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0432\u0441\u0435, \u0447\u0442\u043e \u0412\u0430\u0441 \u0432\u043e\u043e\u0434\u0443\u0448\u0435\u0432\u043b\u044f\u0435\u0442 \u0438 \u0447\u0435\u043c \u0412\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u043c\u0438\u0440\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e\u0431 \u043c\u043d\u0435. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0415\u0432\u0433\u0435\u043d\u0438\u0439, Data science&#8217;\u043e\u043c \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0443\u0436\u0435 \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0433\u043e\u0434\u0430. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u044e\u0441\u044c \u0432 Computer vision, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0441\u044c \u043d\u0435\u0439\u0440\u043e\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438. (\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 \u2014 \u043c\u043e\u044f \u043c\u0435\u0447\u0442\u0430!) \u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u2014 <strong>FARADAY Lab<\/strong>. \u041c\u044b \u2014 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0435 \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0435\u0440\u044b \u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0412\u0430\u043c\u0438 \u0442\u0435\u043c, \u0447\u0442\u043e \u0443\u0437\u043d\u0430\u0435\u043c \u0441\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0423\u0434\u0430\u0447\u0438 c:<\/p>\n<p>  <\/p>\n<h3 id=\"poleznye-ssylki\">\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h3>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/evjeny\/sklearn_plus_torch_ensembles\" rel=\"nofollow\">Jupyter-notebook \u0441 \u043a\u043e\u0434\u043e\u043c<\/a><\/li>\n<li><a href=\"http:\/\/www.machinelearning.ru\/wiki\/index.php?title=%D0%91%D1%8D%D0%B3%D0%B3%D0%B8%D0%BD%D0%B3\" rel=\"nofollow\">Bagging<\/a><\/li>\n<li><a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.ensemble.BaggingClassifier.html#sklearn.ensemble.BaggingClassifier\" rel=\"nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043a sklearn.ensemble.BaggingClassifier<\/a><\/li>\n<li><a href=\"https:\/\/scikit-learn.org\/stable\/modules\/ensemble.html\" rel=\"nofollow\">Sklearn: ensemble methods<\/a><\/li>\n<li><a href=\"https:\/\/pytorch.org\/tutorials\/beginner\/pytorch_with_examples.html\" rel=\"nofollow\">\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0441 PyTorch<\/a><\/li>\n<li><a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.preprocessing.StandardScaler.html#sklearn.preprocessing.StandardScaler\" rel=\"nofollow\">Sklearn: StandardScaler<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/scikit-learn\/scikit-learn\/blob\/master\/sklearn\/base.py#L143\" rel=\"nofollow\">Sklearn: BaseEstimator<\/a><\/li>\n<\/ul>\n<\/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\/post\/489058\/\"> https:\/\/habr.com\/ru\/post\/489058\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/489058\/\">\n<p>\u041d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b. \u0418\u0445 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u043e\u0431\u043e\u0431\u0449\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0438\u0437\u043a\u043e\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e. \u041d\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435\u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435?<\/p>\n<p>  <\/p>\n<p>\u0418 \u0442\u0443\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0438&#8230;<\/p>\n<p>  <\/p>\n<h3 id=\"chto-takoe-ansambli\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0438<\/h3>\n<p>  <\/p>\n<p>\u0410\u043d\u0441\u0430\u043c\u0431\u043b\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 (\u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0445) \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043e\u0431\u0443\u0447\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0438\u0445 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043e\u0434\u043d\u0443 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0443\u044e (\u0432 \u043f\u043b\u0430\u043d\u0435 \u043e\u0431\u043e\u0431\u0449\u0430\u044e\u0449\u0435\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u2014 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 &quot;\u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c&quot; \u0434\u0430\u043d\u043d\u044b\u0435) \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <em>\u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c\u044e<\/em>. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0435 \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u041e\u043d\u0430 \u043a\u0430\u043a \u0431\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u044b\u0442 \u0432\u0441\u0435\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0438 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438.<\/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-298933","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/298933","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=298933"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/298933\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=298933"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=298933"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=298933"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}