рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, 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)
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)
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрдиреБрд░реЗрдЦрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдкрд░реНрдпрд╛рдкреНрдд рдЯреНрд░реЗрд╕ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЙрд▓рдЯреА рд╕реНрдерд┐рддрд┐ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдореЗрдВ 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
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА PyTorch рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдЬреЛ
pip install
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдкрд╛рдпрдерди рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: <Miniconda3>\Lib\site-packages\torch
; - рдпрджрд┐ рдЖрдкрдиреЗ PyTorch рдХреЛ рд╕реНрд░реЛрдд рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд╣рд╛рдВ рд╣реИ:
<My Pytorch repo>\build\lib.win-amd64-3.6\torch
; - рдЕрдВрдд рдореЗрдВ, рдЖрдк pytorch.org рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рднрд╛рд╖рд╛ = C ++ рдЪреБрдирдХрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдирдЬрд╝рд┐рдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
C ++ рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
- рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
#include <torch/script.h>
- рдореЙрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
torch::jit::script::Module module = torch::jit::load("../resnet34_infer.pth");
- рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВ
torch::Tensor tensor = torch::from_blob(img.data, { img.rows, img.cols, 3 }, torch::kByte);
- рдлрдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
auto output = module.forward( { tensor } )
- рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╡реИрд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рди рдХреЗрд╡рд▓ рдПрдХ рддрд╕реНрд╡реАрд░ рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреВрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлреНрд▓реЛрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЖрдпрд╛рдореА рдЯреЗрдВрд╕рд░ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
float* data = static_cast<float*>(output.toTensor().data_ptr());
- рдПрдХ рдФрд░ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИред рдХреЛрдб рдореЗрдВ
with torch.no_grad()
рдПрдирд╛рд▓реЙрдЧ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ рддрд╛рдХрд┐ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рди рдХрд░реЗрдВ, рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ C ++ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
torch::NoGradGuard no_grad;
рд╕реАрдПрдордХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рд╖рдп рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдКрдВрдЧрд╛ред рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯреНрд╡рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
- рдореИрдВрдиреЗ Visual Studio 2017 рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдореИрдВ рдЕрдиреНрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ред
- V14.11 рдЯреВрд▓рд╕реЗрдЯ v141 рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (
"VC++ 2017 version 15.4 v14.11 toolset"
рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдореЗрдВ "VC++ 2017 version 15.4 v14.11 toolset"
)ред - рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо
x64
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред General тЖТ Platform Toolset
v141(Visual Studio 2017)
рдЪрдпрди рдХрд░реЗрдВ v141(Visual Studio 2017)
C/C++ тЖТ General тЖТ Additional Include Directories
рдореЗрдВ <libtorch dir>\include
Linker тЖТ General тЖТ Additional Library Directories
<libtorch dir>\lib
рдЬреЛрдбрд╝рддреЗ рд╣реИрдВLinker тЖТ Input тЖТ Additional Dependencies
torch.lib; c10.lib
рдЬреЛрдбрд╝реЗрдВ torch.lib; c10.lib
torch.lib; c10.lib
ред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░, рд╡реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ caffe2.lib
рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ GPU рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдФрд░ <libtorch dir>\lib
, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЗрди рджреЛрдиреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред рд╢рд╛рдпрдж рдпрд╣ рдкреБрд░рд╛рдиреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред- рд╡реЗ рдпрд╣ рднреА рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ
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):
- рдЪрд░ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рдкрддреНрд░
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 рдорд╣рд╛рди рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЦреЗрд▓ рдореЛрдордмрддреНрддреА рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
