рдЧреНрд░реЛрдХреЗ рдкреНрдпреЛрд░реНрдЪ

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░реА-рдСрд░реНрдбрд░ рдореЗрдВ рдкрд╛рдЗрд░реЙрдЪ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдкреБрд╕реНрддрдХ рд╣реИред



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

PyTorch рдПрдХ рд▓рдЪреАрд▓реА рдЧрд╣рд░реА рд╕реАрдЦрдиреЗ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ (рдпрд╛рдиреА, рдбрд╛рдпрдиреЗрдорд┐рдХ рдлреНрд▓реЛ рдХрдВрдЯреНрд░реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЗрдЯрд╡рд░реНрдХ, рдЬреИрд╕реЗ if рдФрд░ while рд▓реВрдк) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рддреА рд╣реИред PyTorch GPU рддреНрд╡рд░рдг, рд╡рд┐рддрд░рд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг , рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдФрд░ рдХрдИ рдЕрдиреНрдп рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдХрд┐ рдХреИрд╕реЗ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, PyTorch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП; рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдкреНрд░рдерд╛рдУрдВ рдХреЗ рд╕рднреА рдкрд╣рд▓реБрдУрдВ рдХреЛ рдпрд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдкрд╛рда рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

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

рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдмрд╛рдХреА рдПрдордПрдирдЖрдИрдПрд╕рдЯреА рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╣реИред рдпрд╣рд╛рдВ рд╣рдо PyTorch рдЦреЗрд▓рддреЗ рд╣реИрдВ , рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╢реБрд░реБрдЖрддреА рдореИрдиреБрдЕрд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд▓реЗрдЦ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рд╕реБрд╕рдЬреНрдЬрд┐рдд рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ / рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд╢реБрджреНрдз рдореЙрдбреНрдпреВрд▓рд░ рдХреЛрдб рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдпрд╛рдд


 import argparse import os import torch from torch import nn, optim from torch.nn import functional as F from torch.utils.data import DataLoader from torchvision import datasets, transforms 

рдпреЗ рд╕рднреА рдХрд╛рдлреА рдорд╛рдирдХ рдЖрдпрд╛рдд рд╣реИрдВ, torchvision рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рджреГрд╖реНрдЯрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдорд╛рдпреЛрдЬрди


 parser = argparse.ArgumentParser(description='PyTorch MNIST Example') parser.add_argument('--batch-size', type=int, default=64, metavar='N', help='input batch size for training (default: 64)') parser.add_argument('--epochs', type=int, default=10, metavar='N', help='number of epochs to train (default: 10)') parser.add_argument('--lr', type=float, default=0.01, metavar='LR', help='learning rate (default: 0.01)') parser.add_argument('--momentum', type=float, default=0.5, metavar='M', help='SGD momentum (default: 0.5)') parser.add_argument('--no-cuda', action='store_true', default=False, help='disables CUDA training') parser.add_argument('--seed', type=int, default=1, metavar='S', help='random seed (default: 1)') parser.add_argument('--save-interval', type=int, default=10, metavar='N', help='how many batches to wait before checkpointing') parser.add_argument('--resume', action='store_true', default=False, help='resume training from checkpoint') args = parser.parse_args() use_cuda = torch.cuda.is_available() and not args.no_cuda device = torch.device('cuda' if use_cuda else 'cpu') torch.manual_seed(args.seed) if use_cuda: torch.cuda.manual_seed(args.seed) 

рдЕрдЬрдЧрд░ рдореЗрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реИред

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

рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ numpy , рдЖрдкрдХреЛ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдкреАрдврд╝реА ( random рдпрд╛ numpy рд╕рд╣рд┐рдд, рдпрджрд┐ рдЖрдк рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ numpy рдХрд░рддреЗ numpy )ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: cuDNN рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ torch.backends.cudnn.enabled = False рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдХреНрд╖рдо рд╣реИред

рдбреЗрдЯрд╛


 data_path = os.path.join(os.path.expanduser('~'), '.torch', 'datasets', 'mnist') train_data = datasets.MNIST(data_path, train=True, download=True, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])) test_data = datasets.MNIST(data_path, train=False, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])) train_loader = DataLoader(train_data, batch_size=args.batch_size, shuffle=True, num_workers=4, pin_memory=True) test_loader = DataLoader(test_data, batch_size=args.batch_size, num_workers=4, pin_memory=True) 


рдЪреВрдВрдХрд┐ torchvision рдореЙрдбрд▓ ~/.torch/models/ рддрд╣рдд рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП torchvision , рдЗрд╕рд▓рд┐рдП рдореИрдВ ~/.torch/datasets рддрд╣рдд torchvision torchvision рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдореЗрд░рд╛ рдХреЙрдкреАрд░рд╛рдЗрдЯ рд╕рдордЭреМрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ MNIST, CIFAR-10, рдЖрджрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

torchvision.transforms рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдХрд▓реНрдк рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдлрд╕рд▓ рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдгред

batch_size рдореЗрдВ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди batch_size рдФрд░ shuffle рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ num_workers рдФрд░ pin_memory рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡реЗ рджрдХреНрд╖рддрд╛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред num_workers > 0 рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП num_workers > 0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдбрд┐рд╕реНрдХ рд╕реЗ рдбреЗрдЯрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд┐рддреНрд░) рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ, рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ; рдпрд╣ рд╕рдм рдиреЗрдЯрд╡рд░реНрдХ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдбрд┐рдЧреНрд░реА рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ) рдХ) рд╢реНрд░рдорд┐рдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕реАрдкреАрдпреВ рдФрд░ рд░реИрдо рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдмреИрдЪ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирдореВрдиреЛрдВ рдХреА рдмрдЬрд╛рдп рдПрдХ рдЕрд▓рдЧ рдмреИрдЪ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ) рдмреА) рдЙрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЕрд╡рдзрд┐ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдХрд░реЗрдВред pin_memory рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдСрдкрд░реЗрд╢рди рдХреЛ рд░реИрдо рд╕реЗ GPU (рдФрд░ CPU рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЗ рд░реВрдк рдореЗрдВ pin_memory рдореЗрдореЛрд░реА (рдкреГрд╖реНрдард╛рдВрдХрд┐рдд рдХреЗ рд╡рд┐рдкрд░реАрдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЖрджрд░реНрд╢


 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 10, kernel_size=5) self.conv2 = nn.Conv2d(10, 20, kernel_size=5) self.conv2_drop = nn.Dropout2d() self.fc1 = nn.Linear(320, 50) self.fc2 = nn.Linear(50, 10) def forward(self, x): x = F.relu(F.max_pool2d(self.conv1(x), 2)) x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) x = x.view(-1, 320) x = F.relu(self.fc1(x)) x = self.fc2(x) return F.log_softmax(x, dim=1) model = Net().to(device) optimiser = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum) if args.resume: model.load_state_dict(torch.load('model.pth')) optimiser.load_state_dict(torch.load('optimiser.pth')) 

рдиреЗрдЯрд╡рд░реНрдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЖрдорддреМрд░ рдкрд░ рд╕рджрд╕реНрдп рдЪрд░, рдкрд░рддреЛрдВ рддрдХ рдлреИрд▓реА рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реАрдЦрдиреЗ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрднрд╡рддрдГ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реАрдЦрдиреЗ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЕрдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдмрдлрд╝рд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВред рдлрд┐рд░, рдПрдХ рдкреНрд░рддреНрдпрдХреНрд╖ рдкрд╛рд╕ рдХреЗ рд╕рд╛рде, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ F рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдХреБрдЫ рд▓реЛрдЧ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рд░рдЦреЗрдВ рдФрд░ F.conv2d рдмрдЬрд╛рдп F.conv2d рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ) рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рддреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ (рдЬреИрд╕реЗ nn.ReLU рдмрдЬрд╛рдп)ред

.to(device) GPU рдХреЗ рд▓рд┐рдП рдбрд┐рд╡рд╛рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ (рдФрд░ рдмрдлрд╝рд░реНрд╕) рднреЗрдЬрдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ рдпрджрд┐ device рдХреЛ GPU рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ (рдпрджрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реАрдкреАрдпреВ рдкрд░ рд╕реЗрдЯ рд╣реИ) рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЙрдкрдпреБрдХреНрдд рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ; рдЕрдиреНрдпрдерд╛, рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛!

рджреЛрдиреЛрдВ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ ( nn.Module ) рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ ( optim.Optimizer ) рдЕрдкрдиреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ .load_state_dict(state_dict) рд╕рд╛рде рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ - рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╣реЗрдЬреЗ рдЧрдП рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд░рд╛рдЬреНрдпреЛрдВред рд╕рдВрдкреВрд░реНрдг рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк GPU рдкрд░ map_location рдХреЛ map_location рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ CPU рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп GPU рдкрд░ рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ CPU рдкрд░ рд╕реАрдзреЗ map_location рд╡рд┐рдХрд▓реНрдк , рдЙрджрд╛ред torch.load('model.pth' , map_location='cpu' ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдб рдХрд░рдирд╛ рд╣реИред

рдпрд╣рд╛рдВ рдХреБрдЫ рдЕрдиреНрдп рдмрд┐рдВрджреБ рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рдпреЛрдЧреНрдп рд╣реИрдВ, рдХрд┐ рдЖрдк рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддреНрдпрдХреНрд╖ рдкрд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, if рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рджрд╕реНрдп рдЪрд░ рдпрд╛ рдбреЗрдЯрд╛ рдкрд░ рд╣реА рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдордзреНрдп рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИред ( print ) рдЯреЗрдирд░реНрд╕, рдЬреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдПрдХ рдкреНрд░рддреНрдпрдХреНрд╖ рдкрд╛рд╕ рдХреЗ рд╕рд╛рде, рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдПрдХ рдЫреЛрдЯреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдмрдВрдзрд╛ рдирд╣реАрдВ рд╣реИ:

 def forward(self, x, hx, drop=False): hx2 = self.rnn(x, hx) print(hx.mean().item(), hx.var().item()) if hx.max.item() > 10 or self.can_drop and drop: return hx else: return hx2 

рдЯреНрд░реЗрдирд┐рдВрдЧ


 model.train() train_losses = [] for i, (data, target) in enumerate(train_loader): data = data.to(device=device, non_blocking=True) target = target.to(device=device, non_blocking=True) optimiser.zero_grad() output = model(data) loss = F.nll_loss(output, target) loss.backward() train_losses.append(loss.item()) optimiser.step() if i % 10 == 0: print(i, loss.item()) torch.save(model.state_dict(), 'model.pth') torch.save(optimiser.state_dict(), 'optimiser.pth') torch.save(train_losses, 'train_losses.pth') 

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

рдпрд╣рд╛рдБ .to() рд╡рд┐рдзрд┐ рди рдХреЗрд╡рд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ non_blocking=True рднреА рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рддрд┐рдмрджреНрдз рдореЗрдореЛрд░реА рд╕реЗ GPU рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирдХрд▓ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ CPU рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЗ рджреМрд░рд╛рди рдЪрд╛рд▓реВ рд░рд╣рддрд╛ рд╣реИ; рдЕрдиреНрдпрдерд╛, non_blocking=True рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк loss.backward() рдФрд░ loss.backward() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ optimiser.step() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕реЗрдЯ loss.backward() , рдЖрдкрдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ optimiser.zero_grad() ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, PyTorch рдЧреНрд░реЗрдбрд┐рдПрдЯрд░реНрд╕ рдХреЛ рдЬрдорд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкрд╛рд╕ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрд╕рд╛рдзрди рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

PyTorch рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдврд╝рд╛рд▓ рдХреЗ рдПрдХ "рдЯреЗрдк" рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рджрд╕рд┐рдпреЛрдВ рдкрд░ рдХреМрди рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ (рд░рд┐рд╡рд░реНрд╕-рдореЛрдб рднреЗрджрднрд╛рд╡) рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрд▓рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИ рдФрд░ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд░реЗрдЦрд╛рдВрдХрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЗрди рдЯреЗрдирд░реНрд╕ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдЖрдкрдХреЛ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдВрд╕рд░реНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ_рдЧреНрд░реЗрдб requires_grad=True рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ), рддреЛ рдХреЛрдИ рднреА рдЧреНрд░рд╛рдлрд╝ рд╕рд╣реЗрдЬрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ! рд╣рд╛рд▓рд╛рдВрдХрд┐, рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреА рдЧрдИ рдХреЛрдИ рднреА рдЧрдгрдирд╛ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреАред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЗрд╕ рдЪрд░рдг рд╕реЗ рдЙрддреНрдкрдиреНрди рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ (рдпрд╛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг) рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкрд╛рдпрдерди рд╕рдВрдЦреНрдпрд╛ (рдкрд╛рдЗрд▓рдЯ рд╕реНрдХреЗрд▓рд░ рдореЗрдВ .item() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдпрд╛ numpy рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ numpy ред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ autograd рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВред

рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЧреНрд░рд╛рдл рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ .detach() рдЬрдм RNN рдХреЛ рдмреИрдХрдкреНрд░реЛрдкреЗрдЧреИрдиреЗрд╢рди-рдереНрд░реВ-рдЯрд╛рдЗрдо рдХреЗ рдЯреНрд░рдВрдЪрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕реАрдЦрддреЗ рд╕рдордп рдЫрд┐рдкреЗ рд╣реБрдП рд╕реНрдЯреЗрдЯ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдШрд╛рдЯреЗ рдХреЛ рдЕрд▓рдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рднреА рд╣реИ, рдЬрдм рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЕрдиреНрдп рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ GAN рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЖрдЙрдЯрдкреБрдЯ рд╕рд╛рдордЧреНрд░реА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рднрд╛рдЧ рдХреЛ рд╕рд┐рдЦрд╛рдКрдВрдЧрд╛, рдпрд╛ рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, A2C) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрднрд┐рдиреЗрддрд╛-рдЖрд▓реЛрдЪрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдиреАрддрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдгред рдПрдХ рдФрд░ рддрдХрдиреАрдХ рдЬреЛ рдЧреНрд░реИрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХреЛ рд░реЛрдХрддреА рд╣реИ, рд╡рд╣ GAN ( param.requires_grad = False рдкрд░ рдЬреЗрдирд░реЗрдЯрд┐рдВрдЧ рдкрд╛рд░реНрдЯ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг) рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд╣реИ рдФрд░ рдлрд╛рдЗрди рдЯреНрдпреВрдирд┐рдВрдЧ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдиреЗрдЯрд╡рд░реНрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЪрдХреНрд░реАрдп param.requires_grad = False рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП param.requires_grad = False ред

рдпрд╣ рди рдХреЗрд╡рд▓ рдХрдВрд╕реЛрд▓ / рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдмрд▓реНрдХрд┐ рдореЙрдбрд▓ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ (рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рд░рд╛рдЬреНрдп) рдХреЛ рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реИред рдЖрдк рдирд┐рдпрдорд┐рдд рдкрд╛рдпрдерди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП torch.save() рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рджреВрд╕рд░реЗ рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд pickle ред

рдкрд░реАрдХреНрд╖рдг


 model.eval() test_loss, correct = 0, 0 with torch.no_grad(): for data, target in test_loader: data = data.to(device=device, non_blocking=True) target = target.to(device=device, non_blocking=True) output = model(data) test_loss += F.nll_loss(output, target, reduction='sum').item() pred = output.argmax(1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_data) acc = correct / len(test_data) print(acc, test_loss) 

.train() рдЬрд╡рд╛рдм рдореЗрдВ .train() рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ .train() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдореЛрдб рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЧреНрд░рд╛рдл рдЖрдорддреМрд░ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, no_grad рдкреНрд░рд╕рдВрдЧ no_grad рдЙрдкрдпреЛрдЧ with torch.no_grad() ред

рдХреБрдЫ рдФрд░


рдпрд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЦрдВрдб рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдХреБрдЫ рдФрд░ рдЙрдкрдпреЛрдЧреА рдбрд┐рдЧреНрд░реЗрд╕рд┐рдпрди рдмрдирд╛рдП рд╣реИрдВред
рдпрд╣рд╛рдВ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

CUDA рддреНрд░реБрдЯрд┐рдпрд╛рдБ? рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рд╡реЗ рддрд╛рд░реНрдХрд┐рдХ рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реАрдкреАрдпреВ рдкрд░ GPU рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛, рдпрджрд┐ рдЖрдк GPU рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк CPU рдФрд░ GPU рдХреЗ рдмреАрдЪ рдЬрд▓реНрджреА рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд╛рд╕ рдЯрд┐рдк рдХреЛрдб рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рддрд╛рдХрд┐ рдПрдХ рдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯрд╛ рдпрд╛ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рддреИрдпрд╛рд░ рдХрд░реЗрдВ, рдПрдХ рдпреБрдЧ рдЯреНрд░реЗрди + рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ, рдЖрджрд┐ред рдпрджрд┐ рдорд╛рдорд▓рд╛ CUDA рддреНрд░реБрдЯрд┐ рд╣реИ, рдпрд╛ рдЖрдк CPU рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, CUDA_LAUNCH_BLOCKING = 1 рд╕реЗрдЯ рдХрд░реЗрдВред рдпрд╣ CUDA рдХрд░реНрдиреЗрд▓ рд▓реЙрдиреНрдЪ рдХреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрдирд╛ рджреЗрдЧрд╛, рдФрд░ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗред

torch.multiprocessing рдкрд░ рдПрдХ рдиреЛрдЯред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ PyTorch рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдпрд╛ рдЪрд▓рд╛рдиреЗред рдХреНрдпреЛрдВрдХрд┐ PyTorch CPU рдкрд░ рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдЕрднрд┐рдХрд▓рди рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб BLAS рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдХрдИ рдХреЛрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдХрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ OMP_NUM_THREADS рдХреЛ 1 рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрдо рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдлрд┐рд╕рд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВред

Source: https://habr.com/ru/post/hi471228/


All Articles