рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рд╣рдорд▓рд╛ред рдпрд╛ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдХреИрд╕реЗ рдЯреНрд░рд┐рдХ рдХрд░реЗрдВ

рдЪрд▓реЛ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╣рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдиреНрдпреВрдирддрдо рдмрд╛рд╣рд░реА рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧреАрдХрд░рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЖрдк рд╣реИрдВред рдФрд░ рдлрд┐рд▓рд╣рд╛рд▓, рдПрдХ рдХрдк рд╕реБрдЧрдВрдзрд┐рдд рдХреЙрдлреА рдкреАрддреЗ рд╣реБрдП, рдЖрдк рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ 90 рдкреНрд░рддрд┐рд╢рдд рд╕реЗ рдЕрдзрд┐рдХ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд┐рдирд╛ рд╕рдВрджреЗрд╣ рдХреЗ рдХрд┐ "рдПрдХ-рдкрд┐рдХреНрд╕реЗрд▓ рд╣рдорд▓реЗ" рдиреЗ рдЖрдкрдХреА рд╕рднреА "рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ" рдХреЛ рдЯреНрд░рдХреЛрдВ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред

рдФрд░ рдЕрдм рд╣рдо рд╡рд┐рд░рд╛рдо рджреЗрдВрдЧреЗ, рдХреЙрдлрд╝реА рдХреЛ рдПрдХ рддрд░рдл рдЦрд┐рд╕рдХрд╛рдПрдБ, рдЙрди рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдРрд╕реЗ рдкрд┐рдХреНрд╕реЗрд▓ рд╣рдорд▓реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рд╣рдорд▓реЗ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ) рдХреЛ рдЧрд▓рдд рдЙрддреНрддрд░ рджреЗрдирд╛ рд╣реИред рдиреАрдЪреЗ рд╣рдо рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдореЙрдбрд▓реЛрдВ рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВрдЧреЗред рдмрд╣реБрдЖрдпрд╛рдореА рдЧрдгрд┐рддреАрдп рдЕрдиреБрдХреВрд▓рди - рд╡рд┐рднреЗрджрдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд┐рдХреНрд╕реЗрд▓ рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЫрд╡рд┐ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЗрд╕ рдЫрд╡рд┐ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗ (рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкрд╣рд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо "рдЫрд╡рд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдФрд░ рдЙрдЪреНрдЪ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде" рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ)ред

рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдВ:

# Python Libraries
%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

# Custom Networks
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

# Helper functions
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 # Image index in the test set
helper.plot_image(x_test[image_id])



рд╣рдореЗрдВ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реЛрдЧреА рдЬреЛ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдХреЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

def perturb_image(xs, img):
    # If this function is passed just one perturbation vector,
    # pack it in a list to keep the computation the same
    if xs.ndim < 2:
        xs = np.array([xs])
    
    # Copy the image n == len(xs) times so that we can 
    # create n new perturbed images
    tile = [len(xs)] + [1]*(xs.ndim+1)
    imgs = np.tile(img, tile)
    
    # Make sure to floor the members of xs as int types
    xs = xs.astype(int)
    
    for x,img in zip(xs, imgs):
        # Split x into an array of 5-tuples (perturbation pixels)
        # i.e., [[x,y,r,g,b], ...]
        pixels = np.split(x, len(x) // 5)
        for pixel in pixels:
            # At each pixel's x,y position, assign its rgb value
            x_pos, y_pos, *rgb = pixel
            img[x_pos, y_pos] = rgb
    
    return imgs

рдЗрд╕рдХреА рдЬрд╛рдВрдЪ - рдкрдбрд╝рддрд╛рд▓ рдХрд░реЗрдВ ?! рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (16, 16) рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдШреЛрдбрд╝реЗ рдХреЗ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдкреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ рдмрджрд▓реЗрдВред

image_id = 99 # Image index in the test set
pixel = np.array([16, 16, 255, 255, 0]) # pixel = x,y,r,g,b
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):
    # Perturb the image with the given pixel(s) x and get the prediction of the model
    imgs_perturbed = perturb_image(xs, img)
    predictions = model.predict(imgs_perturbed)[:,target_class]
    # This function should always be minimized, so return its complement if needed
    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):
    # Perturb the image with the given pixel(s) and get the prediction of the model
    attack_image = perturb_image(x, img)
    confidence = model.predict(attack_image)[0]
    predicted_class = np.argmax(confidence)
    
    # If the prediction is what we want (misclassification or 
    # targeted classification), return True
    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
    # NOTE: return None otherwise (not False), due to how Scipy handles its callback function

рдЖрдЗрдП рд╕рдлрд▓рддрд╛ рдорд╛рдирджрдВрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рдо рдХреЛ рджреЗрдЦреЗрдВред рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЧреИрд░-рд▓рдХреНрд╖рд┐рдд рд╣рдорд▓рд╛ рдорд╛рдирддреЗ рд╣реИрдВред

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):
    # Change the target class based on whether this is a targeted attack or not
    targeted_attack = target is not None
    target_class = target if targeted_attack else y_test[img_id, 0]
    
    # Define bounds for a flat vector of x,y,r,g,b values
    # For more pixels, repeat this layout
    bounds = [(0,32), (0,32), (0,256), (0,256), (0,256)] * pixel_count
    
    # Population multiplier, in terms of the size of the perturbation vector x
    popmul = max(1, popsize // len(bounds))
    
    # Format the predict/callback functions for the differential evolution algorithm
    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)
    
    # Call Scipy's Implementation of Differential Evolution
    attack_result = differential_evolution(
        predict_fn, bounds, maxiter=maxiter, popsize=popmul,
        recombination=1, atol=-1, callback=callback_fn, polish=False)

    # Calculate some useful statistics to return from this function
    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]

    # Show the best attempt at a solution (successful or not)
    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 # Number of pixels to attack
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 # Integer in range 0-9
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 рдкрд░ рдЗрдВрдЯрд░реНрдирд╢рд┐рдк рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдПрдВрдбреНрд░реЛрдирд┐рдХ рдФрд░ рдПрдбреНрд░реЗ рдЪреЗрд░реНрдиреА-рдЯрд╛рдХ

рдиреЗ рд▓реЗрдЦ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдерд╛ ред

All Articles