рджреЛрд╕реНрддреЛрдВ PyTorch рдФрд░ C ++ рдХреИрд╕реЗ рдмрдирд╛рдпреЗред рдЯрд╛рд░реНрдЪрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, PyTorch Developers рдиреЗ TorchScript рд╕рдореБрджрд╛рдп рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдерд╛, рдЬреЛ рдПрдХ рдЯреВрд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдЬрдЧрд░ рдореЗрдВ рдкрд╛рдЗрдк рд▓рд╛рдЗрди рд╕реЗ рдПрд▓реНрдпреБрдорд┐рдирд┐рдпрдо рдХреЗ рд╣рд▓ рдХреЛ рджреЛ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХреЗ рд╕рд╛рде рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ C ++ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдиреАрдЪреЗ рдореИрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдорд╛рд░реНрдЧ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдиреБрдХрд╕рд╛рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдордПрд▓ рдореЗрдВ рд╢реЛрдз рдЖрдорддреМрд░ рдкрд░ рдЙрдмрдВрдЯреВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдЕрдХреНрд╕рд░ (рдЕрдЪрд╛рдирдХ!) "рд╡рд┐рдВрдбреЛрдЬрд╝" рдХреЗ рддрд╣рдд рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред


рдореЙрдбрд▓ рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдирдореВрдирд╛ рдХреЛрдб рдФрд░ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ GitHub рдкрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред




PyTorch Developers рдХреЛ рдмреЗрд╡рдХреВрдл рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирдпрд╛ рдЯреВрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЛ PyTorch рдореЗрдВ рдПрдХ рд╢реЛрдз рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХреБрдЫ рдХрд╛рд░реНрдп рджрд┐рд╡рд╕реЛрдВ рдореЗрдВ C ++ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рдХреЛрдб рдореЗрдВ рдФрд░ рдХреБрдЫ рдХреМрд╢рд▓ рдХреЗ рд╕рд╛рде рддреЗрдЬреА рд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


TorchScript PyTorch рд╕рдВрд╕реНрдХрд░рдг 1.0 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдФрд░ рдЗрд╕рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЬрд╛рд░реА рд╣реИред рдпрджрд┐ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдЧ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рдерд╛ рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдерд╛, рддреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг 1.3 рдХрдо рд╕реЗ рдХрдо рджреВрд╕рд░реЗ рдмрд┐рдВрджреБ рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рдЕрд▓рдЧ рд╣реИ: рдЖрдк рдЗрд╕реЗ рдЕрдм рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИред рдореИрдВ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред


TorchScript рдХреЗ рджрд┐рд▓ рдореЗрдВ рдкрд╛рдпрдерди рдЬреИрд╕реА рднрд╛рд╖рд╛ рдХрд╛ рдЕрдкрдирд╛ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди (рдкрд╛рдпрдерди-рдлреНрд░реА) рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрд╕рдореЗрдВ рдкрд╛рдпрдерди рдФрд░ PyTorch рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрд▓ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореЙрдбреНрдпреВрд▓ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдФрд░ C ++ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ CPU рдХреЗ рд▓рд┐рдП CPU рдФрд░ 300MB рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ 70MB (рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП) рдХреЗ рдХреБрд▓ рд╡рдЬрди рдХреЗ рд╕рд╛рде рдХрдИ DLL рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗред рдЯрд╛рд░реНрдЪрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдзрд┐рдХрд╛рдВрд╢ PyTorch рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рдкрд╛рдпрдерди рднрд╛рд╖рд╛ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рдЬреИрд╕реЗ рдХрд┐ OpenCV рдпрд╛ NumPy, рдХреЛ рднреВрд▓рдирд╛ рд╣реЛрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, NumPy рдХреЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ PyTorch рдореЗрдВ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред


рдЯрд╛рд░реНрдЪрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдкрд╛рдЗрд░реЙрдЪ рдореЙрдбрд▓ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрдиреНрд╡рд░реНрдЯ рдХрд░реЗрдВ


рдЯрд╛рд░реНрдЪрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рдпрдерди рдХреЛрдб рдХреЛ рдЕрдкрдиреЗ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: рдЕрдиреБрд░реЗрдЦрдг рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ (рдЕрдиреБрд░реЗрдЦрдг рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ)ред рджреЛ рдХреНрдпреЛрдВ? рдирд╣реАрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХрд┐ рджреЛ рдПрдХ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВ ...



рд▓реЗрдХрд┐рди рдЗрди рддрд░реАрдХреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕рд┐рджреНрдз рдХрд╛рдореЛрджреНрджреАрдкрдХ рдореЗрдВ, рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рд╡рд┐рдЪрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рджреЛрдиреЛрдВ рдмрджрддрд░ рд╣реИрдВред рдЦреИрд░, рджреБрдирд┐рдпрд╛ рдПрдХрджрдо рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдмрд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрд╕ рдПрдХ рдХреЛ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИред


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


import torch import torchvision model = torchvision.models.resnet34(pretrained = True) model.eval() sample = torch.rand(1, 3, 224, 224) scripted_model = torch.jit.trace(model, sample) 

рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг ScriptModule рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


 scripted_model.save('my_script.pth') 

рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдореВрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрдЬрд╛рдп C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо (рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ) рдпрд╛ рдкрд╛рдпрдерди рдХреЛрдб рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ:


рд╕рд╣реЗрдЬреЗ рдЧрдП рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдореВрдирд╛ рдкрд╛рдпрдерди рдХреЛрдб
 import cv2 from torchvision.transforms import Compose, ToTensor, Normalize transforms = Compose([ToTensor(), Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]) img = cv2.resize(cv2.imread('pics/cat.jpg'), (224,224)) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) x = transforms(img).unsqueeze(0) # add batch dimension scripted_model = torch.jit.load('my_script.pth') y = scripted_model(x) print(y[0].argmax(), y[0][y[0].argmax()]) 

 tensor(282) tensor(12.8130, grad_fn=<SelectBackward>) 

рдкрд░рд┐рдгрд╛рдореА ScriptModule рдХрд╣реАрдВ рднреА рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИред


рд╡рд░реНрдгрд┐рдд рддрд░реАрдХреЗ рд╕реЗ, рдЖрдк nn.Module рд╡рд░реНрдЧ рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдмрд╛рдж рд╡рд╛рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, torch._C.Function рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг torch._C.Function )ред


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


 def my_abs(x): if x.max() >= 0: return x else: return -x my_abs_traced = torch.jit.trace(my_abs, torch.tensor(0)) print(my_abs_traced(torch.tensor(1)), my_abs_traced(torch.tensor(-1))) 

 c:\miniconda3\lib\site-packages\ipykernel_launcher.py:2: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! tensor(1) tensor(-1) 

рдКрдкреНрд╕! рдпрд╣ рд╡рд╣реА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗ, рд╣реИ рдирд╛? рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ (TracerWarning) рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред


рдпрд╣рд╛рдБ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддреА рд╣реИ - рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ:


 my_abs_script = torch.jit.script(my_abs) print(my_abs_script(torch.tensor(1)), my_abs_script(torch.tensor(-1))) 

 tensor(1) tensor(1) 

рд╣реБрд░реНрд░реЗ, рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ! рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдкрд╛рдпрдерди рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреА рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ, рд╣рдореЗрдВ ScriptModule рдХреНрд▓рд╛рд╕ (рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдП) рдпрд╛ torch._C.Function (рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП) рднреА torch._C.Function ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ, рдЦреБрд╢реА! рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ: рдЯреЙрд░реНрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЖрдВрддрд░рд┐рдХ рднрд╛рд╖рд╛ рдкрд╛рдЗрдерди рдХреЗ рд╡рд┐рдкрд░реАрдд, рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЬрд╛рддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкрд╣рд▓реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдХрд╛ рдкреНрд░рдХрд╛рд░ Tensor ред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдкреИрдЯрд░реНрди


 def my_func(x): y = None if x.max() > 0: y = x return y my_func = torch.jit.script(my_func) 

рдЯреНрд░реЗрд╕рд┐рдВрдЧ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред


рдПрдХ рдЯреНрд░реЗрд╕ рддреНрд░реБрдЯрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ
 RuntimeError Traceback (most recent call last) <ipython-input-9-25414183a687> in <module>() ----> 1 my_func = torch.jit.script(my_func) d:\programming\3rd_party\pytorch\pytorch_ovod_1.3.0a0_de394b6\torch\jit\__init__.py in script(obj, optimize, _frames_up, _rcb) 1224 if _rcb is None: 1225 _rcb = _gen_rcb(obj, _frames_up) -> 1226 fn = torch._C._jit_script_compile(qualified_name, ast, _rcb, get_default_args(obj)) 1227 # Forward docstrings 1228 fn.__doc__ = obj.__doc__ RuntimeError: Variable 'y' previously has type None but is now being assigned to a value of type Tensor : at <ipython-input-8-75677614fca6>:4:8 def my_func(x): y = None if x.max() > 0: y = x ~ <--- HERE return y 

рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм torch.jit.script рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рд╡рд╣ рднреА рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЕрдВрдХ:


 def my_func(x): if x.max() > 0: y = 1.25 else: y = 0 return y my_func = torch.jit.script(my_func) 

рдХреЛрдИ рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛
 RuntimeError Traceback (most recent call last) <ipython-input-10-0a5f18586763> in <module>() 5 y = 0 6 return y ----> 7 my_func = torch.jit.script(my_func) d:\programming\3rd_party\pytorch\pytorch_ovod_1.3.0a0_de394b6\torch\jit\__init__.py in script(obj, optimize, _frames_up, _rcb) 1224 if _rcb is None: 1225 _rcb = _gen_rcb(obj, _frames_up) -> 1226 fn = torch._C._jit_script_compile(qualified_name, ast, _rcb, get_default_args(obj)) 1227 # Forward docstrings 1228 fn.__doc__ = obj.__doc__ d:\programming\3rd_party\pytorch\pytorch_ovod_1.3.0a0_de394b6\torch\jit\__init__.py in _rcb(name) 1240 # closure rcb fails 1241 result = closure_rcb(name) -> 1242 if result: 1243 return result 1244 return stack_rcb(name) RuntimeError: bool value of Tensor with more than one value is ambiguous 

рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 0 рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди 0. рддрд╛рдХрд┐ рджреЛрдиреЛрдВ рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реЛ! рдлреБрдард░рдорд▓рд╕рд╛, рддреБрдореНрд╣реЗрдВ рдкрддрд╛ рд╣реИ, рдЕрдкрдиреЗ рдЕрдЬрдЧрд░ рдХреЗ рд╕рд╛рде!


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


рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рджреЛрдиреЛрдВ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдЙрд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдирд╣реАрдВ рд╣реИ рд╡рд╣ рдЯреНрд░реЗрд╕ рд╣реЛ рд░рд╣рд╛ рд╣реИ:


 class MyModule(torch.nn.Module): def __init__(self): super(MyModule, self).__init__() self.resnet = torchvision.models.resnet34(pretrained = True) #       torch.jit.script(my_module) #    -   resnet34. #     self.resnet  ScriptModule. self.resnet.eval() # NB:     !  -  ! self.resnet = torch.jit.trace(self.resnet, torch.rand((1,3,224,224), dtype=torch.float)) def forward(self, x): if x.shape[2] < 224 or x.shape[3] < 224: return torch.tensor(0) else: return self.resnet(x) my_module = MyModule() my_module = torch.jit.script(my_module) 

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрдиреБрд░реЗрдЦрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдкрд░реНрдпрд╛рдкреНрдд рдЯреНрд░реЗрд╕ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЙрд▓рдЯреА рд╕реНрдерд┐рддрд┐ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдореЗрдВ ONNX рдкрд░ рдПрдХ рдореЙрдбрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЯреНрд░реЗрд╕ рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рдореЗрдВ рдЯрд╛рд░реНрдЪрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдЦрд╛рдУрдВ рдФрд░ рдЫреЛрд░реЛрдВ рдХреЛ рд╡рд╣рд╛рдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ! рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рд░рдХрд╛рд░реА рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ torch.onnx рдХреЗ рд▓рд┐рдП рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред


TorchScript рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП PyTorch рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдФрд░ torch.jit рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ torch.jit.trace torch.jit.script рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ torch.jit.trace рдФрд░ torch.jit.script рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдпрд╣ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╣реИред


рд╣рдо рдореЙрдбрд▓ рдХреЛ C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ " torch.ones рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди 2 torch.ones рдЬреЛрдбрд╝реЗрдВ" рдлреЙрд░реНрдо рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рдХрд░реАрдм рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬреЛ рдУрдкрдирд╕реАрд╡реА рд╕реЗ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдПрдХ рддрд╕реНрд╡реАрд░ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЯреЗрдВрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЪрд░ рдХреА рдПрдХ рдЯреБрдХрдбрд╝реА, рд╡рд┐рднрд╛рдЬрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╕реНрд╡реАрд░ред


рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ ResNet34 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдЧреАрдХрд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ DeepLabV3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рднрд╛рдЬрдиред рдЗрди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдЬреНрдпреВрдкрд┐рдЯрд░ рдиреЛрдЯрдкреИрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рд╣рдореЗрдВ torchlib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


  1. рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА PyTorch рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдЬреЛ pip install рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдкрд╛рдпрдерди рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: <Miniconda3>\Lib\site-packages\torch ;
  2. рдпрджрд┐ рдЖрдкрдиреЗ PyTorch рдХреЛ рд╕реНрд░реЛрдд рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд╣рд╛рдВ рд╣реИ: <My Pytorch repo>\build\lib.win-amd64-3.6\torch ;
  3. рдЕрдВрдд рдореЗрдВ, рдЖрдк pytorch.org рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рднрд╛рд╖рд╛ = C ++ рдЪреБрдирдХрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдирдЬрд╝рд┐рдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

C ++ рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:


  1. рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
     #include <torch/script.h> 
  2. рдореЙрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
     torch::jit::script::Module module = torch::jit::load("../resnet34_infer.pth"); 
  3. рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВ
     torch::Tensor tensor = torch::from_blob(img.data, { img.rows, img.cols, 3 }, torch::kByte); 
  4. рдлрдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
     auto output = module.forward( { tensor } ) 
  5. рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╡реИрд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рди рдХреЗрд╡рд▓ рдПрдХ рддрд╕реНрд╡реАрд░ рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреВрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлреНрд▓реЛрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЖрдпрд╛рдореА рдЯреЗрдВрд╕рд░ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
     float* data = static_cast<float*>(output.toTensor().data_ptr()); 
  6. рдПрдХ рдФрд░ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИред рдХреЛрдб рдореЗрдВ with torch.no_grad() рдПрдирд╛рд▓реЙрдЧ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ рддрд╛рдХрд┐ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рди рдХрд░реЗрдВ, рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ C ++ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
     torch::NoGradGuard no_grad; 

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


  1. рдореИрдВрдиреЗ Visual Studio 2017 рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдореИрдВ рдЕрдиреНрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ред
  2. V14.11 рдЯреВрд▓рд╕реЗрдЯ v141 рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ( "VC++ 2017 version 15.4 v14.11 toolset" рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдореЗрдВ "VC++ 2017 version 15.4 v14.11 toolset" )ред
  3. рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо x64 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  4. General тЖТ Platform Toolset v141(Visual Studio 2017) рдЪрдпрди рдХрд░реЗрдВ v141(Visual Studio 2017)
  5. C/C++ тЖТ General тЖТ Additional Include Directories рдореЗрдВ <libtorch dir>\include
  6. Linker тЖТ General тЖТ Additional Library Directories <libtorch dir>\lib рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
  7. Linker тЖТ Input тЖТ Additional Dependencies torch.lib; c10.lib рдЬреЛрдбрд╝реЗрдВ torch.lib; c10.lib torch.lib; c10.lib ред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░, рд╡реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ caffe2.lib рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ GPU рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдФрд░ <libtorch dir>\lib , рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЗрди рджреЛрдиреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред рд╢рд╛рдпрдж рдпрд╣ рдкреБрд░рд╛рдиреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред
  8. рд╡реЗ рдпрд╣ рднреА рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ C/C++ тЖТ Language тЖТ Conformance Mode = No рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдВрддрд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджрд┐рдпрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ __cplusplus рдЪрд░ рдХреЛ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред /Zc:__cplusplus рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ /Zc:__cplusplus ivalue.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ред


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


рдФрд░ рдХреНрдпрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ


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



  • рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЯреЗрдиреНрд╕рд░ рд╣реИред рдпрджрд┐ рдХреБрдЫ (рдмрд╣реБрдд рд▓рдЧрд╛рддрд╛рд░) рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рддреЛ рдЖрдкрдХреЛ MyPy- рд╢реИрд▓реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

 def calc_letter_statistics(self, cls_preds: List[Tensor], cls_thresh: float)->Tuple[int, Tuple[Tensor, Tensor, Tensor]] 

рдпрд╛ рддреЛ:


 def calc_letter_statistics(self, cls_preds, cls_thresh): # type: (List[Tensor], float)->Tuple[int, Tuple[Tensor, Tensor, Tensor]] 

  • рдЪрд░ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рдкрддреНрд░ x=[]; for ...: x.append(y) рдкрд░рд┐рдЪрд┐рдд рдирд┐рд░реНрдорд╛рдг x=[]; for ...: x.append(y) x=[]; for ...: x.append(y) рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ [] рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд╕рдордп [] рд╕рдВрдХрд▓рдХ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реВрдЪреА рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 from typing import List x: List[float] = [] 

рдпрд╛ (рдПрдХ рдФрд░ "рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП")


 from torch import Tensor from typing import Dict, Tuple, List x: Dict[int: Tuple[float, List[Tensor], List[List[int]]]] = {} 

  • рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рд╡реЗ рдирд╛рдо рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдирд╛рдо рдЯрд╛рд░реНрдЪрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рд╕рд┐рд▓ рджрд┐рдП рдЧрдП рд╣реИрдВред рд╡реИрдХрд▓реНрдкрд┐рдХ, рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд╛рдиреВрдиреА, рджреГрд╖реНрдЯрд┐рдХреЛрдг

 import torch import typing x: typing.List[torch.Tensor] = [] 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ред рдЙрд╕рдХреА рддреНрд░реБрдЯрд┐


  • рдПрдХ рдФрд░ рдкрд░рд┐рдЪрд┐рдд рдбрд┐рдЬрд╛рдЗрди рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рднрд╛рдЧ рд▓реЗрдирд╛ рд╣реИ:

 x = None if smth: x = torch.tensor([1,2,3]) 

рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдпрд╛ рджреЛрдиреЛрдВ рдмрд╛рд░ Tensor рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ (рдпрд╣ рддрдереНрдп рдХрд┐ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдЖрдпрд╛рдореЛрдВ рдХрд╛ рд╣реИ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ):


 x = torch.tensor(0) if smth: x = torch.tensor([1,2,3]) 

рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рджреЗрдЦрдирд╛ рди рднреВрд▓реЗрдВред рдпрд╛ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:


 x: Optional[Tensor] = None if smth: x = torch.tensor([1,2,3]) 

рд▓реЗрдХрд┐рди рдлрд┐рд░ x рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЬрд╣рд╛рдВ рдЯреЗрдВрд╕рд░ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ, рд╣рдо рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ: рддрд░реНрдХ 'рдПрдХреНрд╕' рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк 'рдЯреЗрдВрд╕рд░' рдХреЗ рдореВрд▓реНрдп рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп 'рд╡реИрдХрд▓реНрдкрд┐рдХ [рдЯреЗрдиреНрд╕рд░] рдЯрд╛рдЗрдк рдХрд░реЗрдВред


  • рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдХрд╛рд░реНрдп рдХреЗ рджреМрд░рд╛рди x=0. рд▓рд┐рдЦрдирд╛ рди рднреВрд▓реЗрдВ x=0. рд╕рд╛рдорд╛рдиреНрдп x=0 , рдЖрджрд┐ рдХреЗ рдмрдЬрд╛рдп, рдпрджрд┐ рдЪрд░ x рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


  • рдпрджрд┐ рдХрд╣реАрдВ рд╣рдордиреЗ x = torch.Tensor(...) рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреЗрдВрд╕рд░ рдХреЗ рдкреБрд░рд╛рдиреЗ рдЬрдорд╛рдиреЗ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рднрд╛рдЧ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЫреЛрдЯреЗ рд╕рдВрд╕реНрдХрд░рдг x = torch.tensor(...) рд╕рд╛рде рдПрдХ рдЫреЛрдЯреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдЙрдбрд╝ рдЬрд╛рдПрдЧрд╛: рдЕрдЬреНрдЮрд╛рдд рдмрд┐рд▓реНрдЯ рдСрдк: aten :: Tensorред рдпрд╣рд╛рдБ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджрд┐рдП рдЧрдП рд╣реИрдВ: рдкреНрд░рд╛рдпрд╢реНрдЪрд┐рддреНрдд: рд╕реНрдкрд░реНрд╢рдХ ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдпрд╣ рднреА рд╕рдордЭрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рдЙрддреНрддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВред


  • рдХреЛрдб рдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ torch.jit.script рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рдХрд╣реАрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдХреНрд▓рд╛рд╕ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ math.pow , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, math.pow , рддреЛ рдЖрдкрдХреЛ рд╕рдВрдХрд▓рди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ import math рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЬрд╣рд╛рдВ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЙрд╕ рд╡рд░реНрдЧ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ: рдпрд╛ рддреЛ @torch.jit.script рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдпрд╛ рдЗрд╕рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ рдЬреЛ ScriptModule рдХреЛ рдЗрд╕рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ рдПрдХ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдореВрд▓реНрдп рдЧрдгрд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрдм рд╣рдо рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, math рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


  • рдЕрдЧрд░ рдХрд╣реАрдВ рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ my_tensor[my_tensor < 10] = 0 рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдлреЙрд░реНрдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЧреБрдкреНрдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:


     *aten::index_put_(Tensor(a!) self, Tensor?[] indices, Tensor values, bool accumulate=False) -> (Tensor(a!)):* *Expected a value of type 'Tensor' for argument 'values' but instead found type 'int'.* *aten::index_put_(Tensor(a!) self, Tensor[] indices, Tensor values, bool accumulate=False) -> (Tensor(a!)):* *Expected a value of type 'List[Tensor]' for argument 'indices' but instead found type 'List[Optional[Tensor]]'.* 

    рдЖрдкрдХреЛ рдЯреЗрдВрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: my_tensor[my_tensor < 10] = torch.tensor(0.).to(my_tensor.device) ред рдФрд░ my_tensor рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ) рдФрд░ рдмрдирд╛рдП рдЧрдП рдЯреЗрдВрд╕рд░ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлреНрд▓реЛрдЯ) рдФрд░ b) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ .to(my_tensor.device) ред рдпрджрд┐ рдЖрдк рджреВрд╕рд░реЗ рдХреЛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА GPU рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЖрдк рдкрд░реЗрд╢рд╛рди рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдЬреЛ рдХрд┐ рдЧреБрдкреНрдд рд╢рдмреНрджреЛрдВ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ CUDA рддреНрд░реБрдЯрд┐: рдПрдХ рдЕрд╡реИрдз рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ , рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ рд╣реБрдИ!


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


  • рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ nn.Module - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


  • рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдкрджреНрдзрддрд┐ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ



 cls_thresh = 0.3 class MyModule(torch.nn.Module): ... x = r < cls_thresh ... 

рдкрд░рд┐рдгрд╛рдо рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯрд╛рдЗрдк 'рдлреНрд▓реЛрдЯ' рдХреЗ рдЕрдЬрдЧрд░ рдореВрд▓реНрдп рдХреЛ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:


 cls_thresh = 0.3 class MyModule(torch.nn.Module): def __init__(self): ... self.cls_thresh = cls_thresh ... x = r < self.cls_thresh ... 

  • рдпрджрд┐ рд╢реНрд░реЗрдгреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд▓рд╛рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдФрд░ рд╕реВрдХреНрд╖реНрдорддрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ:

 class FPN(nn.Module): def __init__(self, block, num_blocks, num_layers =5): ... self.num_layers = num_layers def forward(self, x): ... return (p3, p4, p5, p6, p7)[:self.num_layers] 

рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдЯреБрд▓реНрд▓ рд╕реНрд▓рд╛рдЗрд╕ рдЗрдВрдбреЗрдХреНрд╕ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ num_layers рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рд╡рд╣ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреА:


 class FPN(nn.Module): num_layers: torch.jit.Final[int] def __init__(self, block, num_blocks, num_layers =5): ... 

  • рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬрд╣рд╛рдВ рдЯреЗрдирд╕рд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдлрд┐рдЯ рд╣реЛрддреЗ рдереЗ, рдЖрдкрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 xx1 = x1.clamp(min=x1[i]) 

рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐ рддрдм рдЖрддреА рд╣реИ рдЬрдм Expected a value of type 'Optional[number]' for argument 'min' but instead found type 'Tensor'. ред рдЦреИрд░, рдпрд╣рд╛рдБ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ:


 xx1 = x1.clamp(min=x1[i].item()) 

рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рдЙрдирдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдЯреЙрд░реНрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдмрд╕ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдорд╛рд▓рд┐рд╢ рдХрд░рдиреА рд╣реЛрдЧреА (рдпрджрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ) рдпрд╛ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдЯреНрд░реЗрд╕ рдХреА рдЕрдкрдиреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВ:


  • рдкреНрд░рдкрддреНрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЯреНрд░реЗрд╕ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

 tensor_a.to(tensor_b.device) 

рдЬрд┐рд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЯреЗрдВрд╕рд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рд╕рдордп рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЯреЗрдВрд╕рд░ рдХреЛ nn.Module рдкреНрд░рдХрд╛рд░ Parameter nn.Module рд╕рджрд╕реНрдп рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░, рдЬрдм рдореЙрдбрд▓ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдмреВрдЯ рд╣реЛрдЧрд╛ рдЬреЛ torch.jit.load рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред torch.jit.load рдлрд╝рдВрдХреНрд╢рдиред


рдЙрдкрд╕рдВрд╣рд╛рд░


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


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


All Articles