рдЪрд▓реЛ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╣рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдиреНрдпреВрдирддрдо рдмрд╛рд╣рд░реА рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧреАрдХрд░рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЖрдк рд╣реИрдВред рдФрд░ рдлрд┐рд▓рд╣рд╛рд▓, рдПрдХ рдХрдк рд╕реБрдЧрдВрдзрд┐рдд рдХреЙрдлреА рдкреАрддреЗ рд╣реБрдП, рдЖрдк рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ 90 рдкреНрд░рддрд┐рд╢рдд рд╕реЗ рдЕрдзрд┐рдХ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд┐рдирд╛ рд╕рдВрджреЗрд╣ рдХреЗ рдХрд┐ "рдПрдХ-рдкрд┐рдХреНрд╕реЗрд▓ рд╣рдорд▓реЗ" рдиреЗ рдЖрдкрдХреА рд╕рднреА "рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ" рдХреЛ рдЯреНрд░рдХреЛрдВ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛редрдФрд░ рдЕрдм рд╣рдо рд╡рд┐рд░рд╛рдо рджреЗрдВрдЧреЗ, рдХреЙрдлрд╝реА рдХреЛ рдПрдХ рддрд░рдл рдЦрд┐рд╕рдХрд╛рдПрдБ, рдЙрди рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдРрд╕реЗ рдкрд┐рдХреНрд╕реЗрд▓ рд╣рдорд▓реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВредрдЗрд╕ рд╣рдорд▓реЗ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ) рдХреЛ рдЧрд▓рдд рдЙрддреНрддрд░ рджреЗрдирд╛ рд╣реИред рдиреАрдЪреЗ рд╣рдо рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдореЙрдбрд▓реЛрдВ рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВрдЧреЗред рдмрд╣реБрдЖрдпрд╛рдореА рдЧрдгрд┐рддреАрдп рдЕрдиреБрдХреВрд▓рди - рд╡рд┐рднреЗрджрдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд┐рдХреНрд╕реЗрд▓ рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЫрд╡рд┐ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЗрд╕ рдЫрд╡рд┐ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗ (рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкрд╣рд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо "рдЫрд╡рд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдФрд░ рдЙрдЪреНрдЪ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде" рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ)редрдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдВ:
%matplotlib inline
import pickle
import numpy as np
import pandas as pd
import matplotlib
from keras.datasets import cifar10
from keras import backend as K
from networks.lenet import LeNet
from networks.pure_cnn import PureCnn
from networks.network_in_network import NetworkInNetwork
from networks.resnet import ResNet
from networks.densenet import DenseNet
from networks.wide_resnet import WideResNet
from networks.capsnet import CapsNet
from differential_evolution import differential_evolution
import helper
matplotlib.style.use('ggplot')
рд╣рдорд╛рд░реЗ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо CIFAR-10 рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рдЫрд╡рд┐рдпреЛрдВ рд╕реЗ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рдиреНрд╣реЗрдВ 10 рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред(x_train, y_train), (x_test, y_test) = cifar10.load_data()
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
рдЖрдЗрдП рдХрд┐рд╕реА рднреА рдЫрд╡рд┐ рдХреЛ рдЗрд╕рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдЗрд╕ рдШреЛрдбрд╝реЗ рдкрд░редimage_id = 99
helper.plot_image(x_test[image_id])
рд╣рдореЗрдВ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реЛрдЧреА рдЬреЛ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдХреЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИредdef perturb_image(xs, img):
if xs.ndim < 2:
xs = np.array([xs])
tile = [len(xs)] + [1]*(xs.ndim+1)
imgs = np.tile(img, tile)
xs = xs.astype(int)
for x,img in zip(xs, imgs):
pixels = np.split(x, len(x) // 5)
for pixel in pixels:
x_pos, y_pos, *rgb = pixel
img[x_pos, y_pos] = rgb
return imgs
рдЗрд╕рдХреА рдЬрд╛рдВрдЪ - рдкрдбрд╝рддрд╛рд▓ рдХрд░реЗрдВ ?! рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (16, 16) рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдШреЛрдбрд╝реЗ рдХреЗ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдкреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ рдмрджрд▓реЗрдВредimage_id = 99
pixel = np.array([16, 16, 255, 255, 0])
image_perturbed = perturb_image(pixel, x_test[image_id])[0]
helper.plot_image(image_perturbed)
рд╣рдорд▓реЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ CIFAR-10 рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рджреЛ рдореЙрдбрд▓ lenet рдФрд░ resnet рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЖрдк рдХреЛрдб рдХреЗ рд╕рдВрдЧрдд рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредlenet = LeNet()
resnet = ResNet()
models = [lenet, resnet]
рдореЙрдбрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдХреА рдкрд░реАрдХреНрд╖рдг рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдЫрд╡рд┐рдпреЛрдВ рдкрд░ рд╣рдорд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡рд░реНрдЧреАрдХреГрдд рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХрддрд╛ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИредnetwork_stats, correct_imgs = helper.evaluate_models(models, x_test, y_test)
correct_imgs = pd.DataFrame(correct_imgs, columns=['name', 'img', 'label', 'confidence', 'pred'])
network_stats = pd.DataFrame(network_stats, columns=['name', 'accuracy', 'param_count'])
network_stats
Evaluating lenet
Evaluating resnet
Out[11]:
name accuracy param_count
0 lenet 0.748 62006
1 resnet 0.9231 470218
рдРрд╕реЗ рд╕рднреА рд╣рдорд▓реЛрдВ рдХреЛ рджреЛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╡реНрд╣рд╛рдЗрдЯрдмреЙрдХреНрд╕ рдФрд░ рдмреНрд▓реИрдХрдмреЙрдХреНрд╕ред рдЙрдирдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕рднреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордЬрд╝рдмреВрддреА рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рд╣рдо рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдмреНрд▓реИрдХрдмреЙрдХреНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЗрдирдкреБрдЯ (рдЫрд╡рд┐) рдФрд░ рдЖрдЙрдЯрдкреБрдЯ (рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ)ред рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рд╣рдорд▓рд╛ рдмреНрд▓реИрдХрдмреЙрдХреНрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИредрдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рдПрдХрд▓ рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ: рдЕрд╕рддреНрдп рдФрд░ рд▓рдХреНрд╖рд┐рддред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦреЗрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реА рдмрд┐рд▓реНрд▓реА рдХреЗ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд┐рд╕ рд╡рд░реНрдЧ рдХреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рд▓рдХреНрд╖рд┐рдд рд╣рдорд▓рд╛ рддрдм рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдмрд┐рд▓реНрд▓реА рдПрдХ рдЯреНрд░рдХ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЯреНрд░рдХ рдмрди рдЬрд╛рдПредрд▓реЗрдХрд┐рди рдмрд╣реБрдд рдкрд┐рдХреНрд╕реЗрд▓ рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ рдЬрд┐рдирдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдЫрд╡рд┐ рдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛? рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рд╣рдорд▓реЗ рдХреЛ рд╕рдВрднрд╡ рдФрд░ рд╕рдлрд▓ рд╣реЛрдиреЗ рд╕реЗ рдмрджрд▓рдХрд░ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ? рдЖрдЗрдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ: рдПрдХ рдЕрдХрд╛рд░рдг рд╣рдорд▓реЗ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд▓рдХреНрд╖рд┐рдд рдХреЗ рд╕рд╛рде, рд▓рдХреНрд╖реНрдп рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПредрдРрд╕реЗ рд╣рдорд▓реЛрдВ рдХреЛ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдврд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдПрдХ рдЕрдиреБрдХреВрд▓рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЪрд┐рдХрдирд╛рдИ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИредрдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣рдо CIFAR-10 рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╡рд┐рд╢реНрд╡ рдЪрд┐рддреНрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдХрд╛рд░ рдореЗрдВ 32 x 32 рдкрд┐рдХреНрд╕реЗрд▓, 10 рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди 0 рд╕реЗ 31 рддрдХ рд╣реИ рдФрд░ 0 рд╕реЗ 255 рддрдХ рд░рдВрдЧ рддреАрд╡реНрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реБрдЪрд╛рд░реВ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рджрд╛рдВрддреЗрджрд╛рд░ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдЕрдВрддрд░ рд╡рд┐рдХрд╛рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВредрд▓реЗрдХрд┐рди рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ рдЬреЛ рдореЙрдбрд▓ рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд▓рдХреНрд╖реНрдп рд╡рд░реНрдЧ рд╕рд╣реА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрдо рд╕реЗ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдореЙрдбрд▓ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ (рдЬреЛ рд╕рдЪ рдирд╣реАрдВ рд╣реИ)редdef predict_classes(xs, img, target_class, model, minimize=True):
imgs_perturbed = perturb_image(xs, img)
predictions = model.predict(imgs_perturbed)[:,target_class]
return predictions if minimize else 1 - predictions
image_id = 384
pixel = np.array([16, 13, 25, 48, 156])
model = resnet
true_class = y_test[image_id, 0]
prior_confidence = model.predict_one(x_test[image_id])[true_class]
confidence = predict_classes(pixel, x_test[image_id], true_class, model)[0]
print('Confidence in true class', class_names[true_class], 'is', confidence)
print('Prior confidence was', prior_confidence)
helper.plot_image(perturb_image(pixel, x_test[image_id])[0])
Confidence in true class bird is 0.00018887444
Prior confidence was 0.70661753
рд╣рдорд▓реЗ рдХреА рд╕рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдХрд╕реМрдЯреА рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдЧрд▓реЗ рд╕рдорд╛рд░реЛрд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдпрд╣ рд╕рдЪ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдкрд░рд┐рд╡рд░реНрддрди рдореЙрдбрд▓ рдХреЛ рд░реМрдВрджрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛редdef attack_success(x, img, target_class, model, targeted_attack=False, verbose=False):
attack_image = perturb_image(x, img)
confidence = model.predict(attack_image)[0]
predicted_class = np.argmax(confidence)
if verbose:
print('Confidence:', confidence[target_class])
if ((targeted_attack and predicted_class == target_class) or
(not targeted_attack and predicted_class != target_class)):
return True
рдЖрдЗрдП рд╕рдлрд▓рддрд╛ рдорд╛рдирджрдВрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рдо рдХреЛ рджреЗрдЦреЗрдВред рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЧреИрд░-рд▓рдХреНрд╖рд┐рдд рд╣рдорд▓рд╛ рдорд╛рдирддреЗ рд╣реИрдВредimage_id = 541
pixel = np.array([17, 18, 185, 36, 215])
model = resnet
true_class = y_test[image_id, 0]
prior_confidence = model.predict_one(x_test[image_id])[true_class]
success = attack_success(pixel, x_test[image_id], true_class, model, verbose=True)
print('Prior confidence', prior_confidence)
print('Attack success:', success == True)
helper.plot_image(perturb_image(pixel, x_test[image_id])[0])
Confidence: 0.07460087
Prior confidence 0.50054216
Attack success: True
рдпрд╣ рд╕рднреА рдкрд╣реЗрд▓реА рдХреЛ рдПрдХ рддрд╕реНрд╡реАрд░ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рд╣рдо рд╕реНрдХреИрдкреА рдореЗрдВ рдЕрдВрддрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕рдВрд╢реЛрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗредdef attack(img_id, model, target=None, pixel_count=1,
maxiter=75, popsize=400, verbose=False):
targeted_attack = target is not None
target_class = target if targeted_attack else y_test[img_id, 0]
bounds = [(0,32), (0,32), (0,256), (0,256), (0,256)] * pixel_count
popmul = max(1, popsize // len(bounds))
def predict_fn(xs):
return predict_classes(xs, x_test[img_id], target_class,
model, target is None)
def callback_fn(x, convergence):
return attack_success(x, x_test[img_id], target_class,
model, targeted_attack, verbose)
attack_result = differential_evolution(
predict_fn, bounds, maxiter=maxiter, popsize=popmul,
recombination=1, atol=-1, callback=callback_fn, polish=False)
attack_image = perturb_image(attack_result.x, x_test[img_id])[0]
prior_probs = model.predict_one(x_test[img_id])
predicted_probs = model.predict_one(attack_image)
predicted_class = np.argmax(predicted_probs)
actual_class = y_test[img_id, 0]
success = predicted_class != actual_class
cdiff = prior_probs[actual_class] - predicted_probs[actual_class]
helper.plot_image(attack_image, actual_class, class_names, predicted_class)
return [model.name, pixel_count, img_id, actual_class, predicted_class, success, cdiff, prior_probs, predicted_probs, attack_result.x]
рдпрд╣ рдЕрдзреНрдпрдпрди (рд╣рдорд▓реЗ) рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдПрдХ рдореЗрдВрдврдХ рдПрдХ рдХреБрддреНрддреЗ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рдПрдХ рдореЗрдВрдврдХ рдореЗрдВ рдПрдХ рдмрд┐рд▓реНрд▓реА, рдФрд░ рдПрдХ рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рдореЗрдВ рдПрдХ рдХрд╛рд░ред рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЫрд╡рд┐ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ, рдХрд┐рд╕реА рднреА рдЫрд╡рд┐ рдкрд░ рдПрдХ рд╕рдлрд▓ рд╣рдорд▓реЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИред

Resnet рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдореЗрдВрдврдХ рдЫрд╡рд┐ рдкрд░ рдПрдХ рд╕рдлрд▓ рд╣рдорд▓реЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВред рд╣рдореЗрдВ рдХрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рдХрдХреНрд╖рд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрд┐рд░рд╛рд╡рдЯ рдореЗрдВ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПредimage_id = 102
pixels = 1
model = resnet
_ = attack(image_id, model, pixel_count=pixels, verbose=True)
Confidence: 0.9938618
Confidence: 0.77454716
Confidence: 0.77454716
Confidence: 0.77454716
Confidence: 0.77454716
Confidence: 0.77454716
Confidence: 0.53226393
Confidence: 0.53226393
Confidence: 0.53226393
Confidence: 0.53226393
Confidence: 0.4211318
рдпреЗ рдПрдХ рдЕрд▓рдХреНрд╖рд┐рдд рд╣рдорд▓реЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдереЗ, рдФрд░ рдЕрдм рд╣рдо рдПрдХ рд▓рдХреНрд╖рд┐рдд рд╣рдорд▓реЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЫрд╡рд┐ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдХрд┐рд╕ рд╡рд░реНрдЧ рдХреЛ рдЪреБрдирдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдХрд╛рд░реНрдп рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдПрдХ рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЬрд╣рд╛рдЬ рдХреА рдЫрд╡рд┐ рдФрд░ рдПрдХ рдмрд┐рд▓реНрд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдШреЛрдбрд╝реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░реЗрдВрдЧреЗред
рдиреАрдЪреЗ рд╣рдо рдЬрд╣рд╛рдЬ рдХреА рдЫрд╡рд┐ рдХреЛ рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдиреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗредimage_id = 108
target_class = 1
pixels = 3
model = lenet
print('Attacking with target', class_names[target_class])
_ = attack(image_id, model, target_class, pixel_count=pixels, verbose=True)
Attacking with target automobile
Confidence: 0.044409167
Confidence: 0.044409167
Confidence: 0.044409167
Confidence: 0.054611664
Confidence: 0.054611664
Confidence: 0.054611664
Confidence: 0.054611664
Confidence: 0.054611664
Confidence: 0.054611664
Confidence: 0.054611664
Confidence: 0.054611664
Confidence: 0.054611664
Confidence: 0.054611664
Confidence: 0.054611664
Confidence: 0.054611664
Confidence: 0.081972085
Confidence: 0.081972085
Confidence: 0.081972085
Confidence: 0.081972085
Confidence: 0.1537778
Confidence: 0.1537778
Confidence: 0.1537778
Confidence: 0.22246778
Confidence: 0.23916133
Confidence: 0.25238588
Confidence: 0.25238588
Confidence: 0.25238588
Confidence: 0.44560355
Confidence: 0.44560355
Confidence: 0.44560355
Confidence: 0.5711696
рд╣рдорд▓реЛрдВ рдХреЗ рдПрдХрд▓ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ, рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ, рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдкрд╛рдардХ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдВрддрд┐рдо рдирд┐рд╖реНрдХрд░реНрд╖ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдФрд░ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╕рдВрд╕рд╛рдзрди рд▓рдЧрддреЗ рд╣реИрдВредdef attack_all(models, samples=500, pixels=(1,3,5), targeted=False,
maxiter=75, popsize=400, verbose=False):
results = []
for model in models:
model_results = []
valid_imgs = correct_imgs[correct_imgs.name == model.name].img
img_samples = np.random.choice(valid_imgs, samples, replace=False)
for pixel_count in pixels:
for i, img_id in enumerate(img_samples):
print('\n', model.name, '- image', img_id, '-', i+1, '/', len(img_samples))
targets = [None] if not targeted else range(10)
for target in targets:
if targeted:
print('Attacking with target', class_names[target])
if target == y_test[img, 0]:
continue
result = attack(img_id, model, target, pixel_count,
maxiter=maxiter, popsize=popsize,
verbose=verbose)
model_results.append(result)
results += model_results
helper.checkpoint(results, targeted)
return results
untargeted = attack_all(models, samples=100, targeted=False)
targeted = attack_all(models, samples=10, targeted=False)
рдиреЗрдЯрд╡рд░реНрдХ рдбрд┐рд╕реНрдХреНрд░реЗрдбрд┐рдЯ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдкреИрдЯрд░реНрди рдорд╛рдиреНрдпрддрд╛ рд╕рдорд╛рдзрд╛рди рдХреА рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░ рдЗрд╕рдХрд╛ рдкреНрд░рднрд╛рд╡ рдорд╛рдкрд╛ рдЧрдпрд╛ рдерд╛редрдЪрд▓реЛ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВредuntargeted, targeted = helper.load_results()
columns = ['model', 'pixels', 'image', 'true', 'predicted', 'success', 'cdiff', 'prior_probs', 'predicted_probs', 'perturbation']
untargeted_results = pd.DataFrame(untargeted, columns=columns)
targeted_results = pd.DataFrame(targeted, columns=columns)
рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ 0.9231 рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде ResNet рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЫрд╡рд┐ рдХреЗ рдХрдИ рдкрд┐рдХреНрд╕реЗрд▓ рдмрджрд▓рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╣рдорд▓рд╛ рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рддрд┐рд╢рдд рдорд┐рд▓рд╛ рд╣реИ (attack_success_rate)редhelper.attack_stats(targeted_results, models, network_stats)
Out[26]:
model accuracy pixels attack_success_rate
0 resnet 0.9231 1 0.144444
1 resnet 0.9231 3 0.211111
2 resnet 0.9231 5 0.222222
helper.attack_stats(untargeted_results, models, network_stats)
Out[27]:
model accuracy pixels attack_success_rate
0 resnet 0.9231 1 0.34
1 resnet 0.9231 3 0.79
2 resnet 0.9231 5 0.79
рдЖрдкрдХреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдЖрдк рдХреГрддреНрд░рд┐рдо рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЕрдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдорд╣рд╛рди рд╣реИрдВред
рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдиреЗ рдЕрджреГрд╢реНрдп рдзрд╛рдЧреЗ рдХреЗ рд╕рд╛рде рдЖрдзреБрдирд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИред рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП, рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдЖрдИ (рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдорд╣рд╛рди рдХрд▓рд╛рдХрд╛рд░реЛрдВ рдХреЗ рдХрд╛рдо рдХреЗ рд╕рдорд╛рди рд╢реИрд▓реАрдЧрдд рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдлрд╝реЛрдЯреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдЬ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕реНрд╡рдпрдВ рдЪрд┐рддреНрд░ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрдЧреАрдд рдХреА рдорд╛рд╕реНрдЯрд░рдкреАрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд▓реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рддрд╛рдмреЗрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВредрдХрдВрдкреНрдпреВрдЯрд░ рджреГрд╖реНрдЯрд┐, рдЪреЗрд╣рд░рд╛ рдкрд╣рдЪрд╛рди, рдорд╛рдирд╡ рд░рд╣рд┐рдд рд╡рд╛рд╣рди, рд░реЛрдЧреЛрдВ рдХрд╛ рдирд┐рджрд╛рди рдЬреИрд╕реЗ рдХреНрд╖реЗрддреНрд░ - рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЧрд▓рддреА рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рд╕реЗ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдкрд░рд┐рдгрд╛рдо рд╣реЛрдВрдЧреЗредрдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рд╣рдорд▓рд╛ рд╣рдорд▓реЛрдВ рдХреЛ рдЦрд░рд╛рдм рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рдбрд┐рд╕реНрдХреНрд░реЗрдбрд┐рдЯ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдкреИрдЯрд░реНрди рдорд╛рдиреНрдпрддрд╛ рд╕рдорд╛рдзрд╛рди рдХреА рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░ рдЗрд╕рдХрд╛ рдкреНрд░рднрд╛рд╡ рдорд╛рдкрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рджреГрдврд╝ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╡рди рдкрд┐рдХреНрд╕реЗрд▓ рд╣рдорд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдХрдордЬреЛрд░ рд╣реИрдВ, рдЬреЛ рдорд╛рдиреНрдпрддрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдмрджрдирд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИред рдбреЗрдЯрд╛ 4 рдкрд░ рдЗрдВрдЯрд░реНрдирд╢рд┐рдк рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдПрдВрдбреНрд░реЛрдирд┐рдХ рдФрд░ рдПрдбреНрд░реЗ рдЪреЗрд░реНрдиреА-рдЯрд╛рдХрдиреЗ рд▓реЗрдЦ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдерд╛ ред