рд╕реАрдПрдирдПрди рдСрдкрд░реЗрдЯрд░ рдЯреЗрдВрд╕рд░ рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╡рд┐рд╣рд┐рдд рдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд░реНрде рдЕрд░реНрде рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЖрдЬ PyTorch рдореЗрдВ 2D рдХреЗрд╕ рдХреЗ рд▓рд┐рдП рдЯреЙрд░реНрдЪ.nn.Conv2d рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ NCHW рдХреНрд░рдо рдореЗрдВ 4d рдЯреЗрдВрд╕рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП -
рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдЖрдпрд╛рдореЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдЪрд╛рд▓рди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реНрдореГрддрд┐ рдХреЛ рд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЗрд▓рд╛рдХреЗ рдХрд╛ рдмреЗрд╣рддрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╕рдмрд╕реЗ рдЖрдо рд╡рд┐рдХрд▓реНрдк рдЖрдпрд╛рдореЛрдВ рдХреЛ рдЕрдВрдд рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдирд╛ рд╣реИ - NHWCред рдФрд░ рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдЖрдпрд╛рдо рдХреЛ рдмреНрд▓реЙрдХ рдореЗрдВ рдЯрд╛рдЗрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
рдЪреБрдиреМрддреА рдпрд╣ рд╣реИ рдХрд┐ рдЖрдпрд╛рдо рдХреНрд░рдо рдХреЛ рдмрджрд▓рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрдм рдХрдИ рд╕реАрдПрдирдПрди рд╕рдВрдЪрд╛рд▓рди рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ conv(relu(conv)))
) рдПрдХ рдмрд╛рд░ рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрджрд▓рдирд╛, рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдлрд╛рдпрджреЗрдордВрдж
рдЗрд╕ рдкреНрд░рдХрд╛рд░, PyTorch рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЖрдпрд╛рдореЛрдВ рдХреЗ рдЖрджреЗрд╢реЛрдВ рд╕реЗ рдЕрд╡рдЧрдд рдХрд░рд╛рдирд╛ рдФрд░ рдЙрддреНрд╕реБрдХ рдФрд░ JIT рдореЛрдб рджреЛрдиреЛрдВ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмреАрдЪ рд╡рд┐рднрд┐рдиреНрди рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдЯреЗрдВрд╕рд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЬреЗрдЖрдИрдЯреА рдЕрдиреБрдХреВрд▓рди рдкрд╛рд╕ рд╣реЛрдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд╣реИ рдЬреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЗрд░рд┐рд╕реНрдЯрд┐рдХреНрд╕ рдпрд╛ рдЦреЛрдЬ рддрдХрдиреАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдмрджрд▓рдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд╣реИ рдФрд░ рдореЙрдбрд▓ рдореЗрдВ рдпрд╣ рдХрд╣рд╛рдВ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рд╣рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
рд╢рдмреНрджрд╛рд╡рд▓реА : рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдХреНрд╕рд░ "рд▓реЗрдЖрдЙрдЯ" (mxnet), "data_format" (tf), "image_format" (keras), "рдЖрджреЗрд╢" (caffe2) рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо PyTorch рдореЗрдВ "рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк" рдпрд╛ "memory_format" рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдирд╛рдо "рд▓реЗрдЖрдЙрдЯ" PyTorch рдореЗрдВ 'strided' рдмрдирд╛рдо 'sparse_coo' рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддрд╛рдХрд┐ рдирд╛рдордХрд░рдг рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЙрдкрд▓рдмреНрдз рди рд╣реЛред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдХрдо рд╕реЗ рдХрдо рд╕реНрдореГрддрд┐-рдкреНрд░рд╛рд░реВрдк-рдЬрд╛рдЧрд░реВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЗрд░рд╛рджреЗ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рджрд░реНрд╢рди рджреЗрдиреЗ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЛ
PyTorch рдореЗрдВ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
torch.memory_format.channels_first
рдЬреИрд╕реЗ рд╕реНрдерд┐рд░рд╛рдВрдХред рдЙрдирдХреЗ рдкрд╛рд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рддреБрд▓рдиреАрдп рд╡рд╕реНрддреБрдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдирдо рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдСрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд╕реНрддреБрдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ)torch.channels_first
рдХрд░реЗрдВchannels_first
рдФрд░ channels_last
(рдХрдо рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП)Tensor рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:
x.is_contiguous(torch.memory_format.channels_first)
x.to(memory_format=torch.memory_format.channels_first)
рдиреЛрдЯ : рдЕрднреА рдХреЗ рд▓рд┐рдП рдХреЛрдИ x.get_memory_format()
рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рдЬрд╛рдВрдЪ - рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
Tensor рд╢рдмреНрджрд╛рд░реНрде рд▓реЗрдЖрдЙрдЯ рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд░рд╣рддрд╛ рд╣реИ - NCHW! x.size()
рд╣рдореЗрд╢рд╛ (n,c,h,w)
рд▓реМрдЯрд╛рддрд╛ рд╣реИ
рд╕рдВрдЪрд╛рд▓рди рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдПрдХ рдЯреЗрдВрд╕рд░ рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдХреНрд░рдорд╛рдВрдХрди/рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдЯреЗрдВрд╕рд░ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ)ред
PyTorch рдореЗрдВ Tensor рдореЗрдВ рдЖрдЬ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЙрдЬрд┐рдХрд▓ рдЯреЗрдВрд╕рд░ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдВрд╕рд░ рдореЗрдВ strides
рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рдХрд╛ рд╡реЗрдХреНрдЯрд░ рд╣реЛрддрд╛ рд╣реИ sizes
ред рддрд╛рд░реНрдХрд┐рдХ рдЕрдиреБрдХреНрд░рдордг рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (i1, i2, .., ik)
рдПрдХ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдбреЙрдЯ рдЙрддреНрдкрд╛рдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореЗрдореЛрд░реА рдХреЛ offset + i0*stride0 + i1*stride1 + ... * ik * stridek
рдкрд░ рджреЗрдЦрддрд╛ рд╣реИред рд╕рдиреНрдирд┐рд╣рд┐рдд рдЯреЗрдВрд╕рд░реЛрдВ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдХрд╛рд░ рдХреЗ рд╕рдВрдЪрдпреА рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдЙрд▓рдЯ рджреЗрддреЗ рд╣реИрдВред рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг 4D рдЯреЗрдиреНрд╕рд░ рдХреЗ рд▓рд┐рдП (n,c,h,w)
рдкреНрд░рдЧрддрд┐ рд╣реИ (c*h*w, h*w, w, 1)
ред
рддрд╛рд░реНрдХрд┐рдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ NCHW рдХреНрд░рдо рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдкреЛрдВ (рдЬреЛ рдХрд┐ рдЖрдпрд╛рдо рдкреБрди: рдХреНрд░рдорд┐рдд рд╣реИрдВ) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдкреНрд░рднрд╛рд╡реА рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрддрд╛ рд╣реИ:
# implementation of x.to(channels_last)
def to_mem_format_nhwc(x):
return x.permute(0,2,3,1).contiguous().permute(0,3,1,2)
# implementation of x.to(channels_first)
def to_mem_format_nchw(x):
return x.contiguous()
NHWC рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕реНрдЯреНрд░рд╛рдЗрдб рд╡реЗрдХреНрдЯрд░ (c*h*w, 1, c*w, c)
ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдореЛрд░реА рдмрдлрд░ рдореЗрдВ рд╡рдЬрди рдПрдирдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА рдХреЗ рд▓рд┐рдП рд╕рдиреНрдирд┐рд╣рд┐рдд рдХреНрд░рдо рдореЗрдВ рд╣реИрдВред
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
def is_nhwc_contiguous(x):
return x.permute(0,2,3,1).is_contiguous()
# or alteratively
def is_nhwc_contiguous(x):
n,c,h,w = x.size() # in any case the sizes remain in NCHW order
return x.stride() == (c*h*w, 1, c*w, c)
def is_nchw_contiguous(x):
return x.is_contiguous()
# operator implementations can just check contiguity and carry on directly on data pointer
def my_sample_op(x):
if x.is_contiguous(nhwc):
float* p = x.data();
# Do we need to go to c++ here?
# can we have an example in python?
n,c,h,w = x.size()
# operate on `p` as it's guaranteed to be (n,h,w,c) array
y=my_nhwc_op(p)
# Do we need to convert the layout of y?
else:
# Need to convert x to nhwc layout
x = x.permute(0,2,3,1).contiguous()
float *p = x.data();
# Is this needed?
y = my_nhwc_op(p)
return y.permute(0,3,1,2).contiguous()
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ :
рд╡рд┐рдкрдХреНрд╖ :
.contiguous()
рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ NCHW рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдФрд░ рдпрд╣ рджреБрд░реНрдШрдЯрдирд╛рд╡рд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рдХрд┐рд╕реА рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИрд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдордВрд╢рд╛ рдХреЗ рд╕рд╛рде рд╣реИ ред рдпрд╣ рднреЗрдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдпрд╛ рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдЪрд╛рд╣рддрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВ, рдмрд╕ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдореМрдЬреВрджрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдУрд░ рдЬрд╛рддрд╛
рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдЯреЗрдВрд╕рд░ рдкрд░ "рд╕реЙрдлреНрдЯ" рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдЯреИрдЧ рдкреЗрд╢ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЯреЗрдВрд╕рд░ рдкрд░ рдХрд┐рдП рдЧрдП рдЕрдВрддрд┐рдо to(memory_format)
рдХреЙрд▓ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдПрдиреЛрдЯреЗрд╢рди "рд╕реЙрдлреНрдЯ" рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмреЗрдореЗрд▓ рдПрдиреЛрдЯреЗрд╢рди рдкрд░ рд╣рд╛рд░реНрдб-рдПрд░рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдмрд▓реНрдХрд┐ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рджреЗрдВрдЧреЗред
рдореМрдЬреВрджрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВред рддреЗрдЬреА рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрдВрджрд░ рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡рд┐рднрд┐рдиреНрди рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╛рдЙрдВрдб-рдЯреНрд░рд┐рдкрд┐рдВрдЧ рд╕рдВрднрд╡ рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЙрдард╛рдирд╛ рд╣реЛрдЧрд╛ред
def maxpool(x: Tensor):
if x.is_contiguous(torch.layout.NHWC):
return max_pool_impl_nhwc(x)
return max_pool_impl_default(x.contiguous())
'conv_nhwc' рдЬреИрд╕реЗ рдЕрд▓рдЧ рдСрдкрд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп JIT IR рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 'рд░реВрдкрд╛рдВрддрд░рдг' рдЬреИрд╕реЗ рдПрдХрд▓ рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╕рд░рд▓рддрд╛ рдФрд░ рдЖрдИрдЖрд░ рдХреЛ рд╢рдмреНрджрд╛рд░реНрде рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕реНрддрд░ рдкрд░ рд░рдЦрдирд╛ рд╣реИред
рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореВрд▓ рд╕рдВрдЪрд╛рд▓рди рдЬреИрд╕реЗ рддрддреНрд╡-рд╡рд╛рд░ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдХреБрд╢рд▓ рд╣реЛрдВред
рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ "рдШрдирд╛" рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдХреЗ рдпреВрдирд░реА рдСрдкрд░реЗрд╢рдВрд╕ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпрд╛рдиреА рдХреНрдпрд╛ рддрддреНрд╡ рдмрд┐рдирд╛ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдлреИрд▓реЗ рд╣реБрдП рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдореГрддрд┐ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдердо рджреНрд╡рд╛рд░рд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
def is_dense_format(x):
p = 1
for s, d in sorted(zip(x.stride(), x.size())):
if s != p:
return False
p *= d
return True
def my_unary(x):
if is_dense_format(x):
return contig_memory_impl(x.data(), x.numel())
return default_strided_impl(x)
# is_dense_format can be used in implementations of e.g. empty_like too
рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП:
рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдСрди-рдбрд┐рдорд╛рдВрдб рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдЯреВрд▓ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдкрд┐рдЫрдбрд╝рд╛ рдкрд╛рд╕ рдЖрдЧреЗ рдХреЗ рд╕рдорд╛рди рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдлреЙрд░рд╡рд░реНрдб рдкрд╛рд╕ рдХреЛ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣рдЪрд╛рдирдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕реЗ рдСрдЯреЛрдЧреНрд░реИрдб рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдмреИрдХрд╡рд░реНрдб рдлрдВрдХреНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЧреНрд░реЗрдб рдЯреЗрдВрд╕рд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
def conv_backward(input, weight, grad_output, grad_weight, grad_input):
if input.is_contiguous(torch.memory_format.channels_last):
grad_output = grad_output.to(torch.memory_format.channels_last)
return conv_backward_nhwc(...)
else:
grad_output = grad_output.contiguous()
return conv_backward_nchw(...)
рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ:
to(memory_format)
рдХреЙрд▓ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИрдкреНрд░рд╡рд░реНрддрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо assert x.is_contiguous(channels_last)
рдЬреИрд╕реЗ рдХрдердиреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдиреЛрдЯ: рдпрд╣ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИ рдХрд┐ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдХрд┐ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдХрд░рдг рдореЗрдВ рдПрдХ рдкрд╕рдВрджреАрджрд╛ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рд╕рдВрдпреЛрдЬрди рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП x86 рдорд╛рд░реНрдЧреЛрдВ рдкрд░ fbgemm рдХреЗ рд▓рд┐рдП qconv рдЬреЛ рдХреЗрд╡рд▓ NHWC рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ)ред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдСрдк рдкрдВрдЬреАрдХрд░рдг рд╕реНрддрд░ рдкрд░ рд░рдЦрд╛ рдЬрд╛рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдПрдиреЛрдЯреЗрд╢рди рдПрдХ рд╕рд╛рдЗрдб рдЬрд╛рдирдХрд╛рд░реА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рд╣рдо рдЬреЗрдЖрдИрдЯреА рдкрд╛рд╕ рдореЗрдВ рдХрд╣реАрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╕рдВрджреАрджрд╛ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдкреЛрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЗрд░рд┐рд╕реНрдЯрд┐рдХреНрд╕ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдЧрдиреНрджрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рд╣рдо рдкрдВрдЬреАрдХрд░рдг-рдЖрдзрд╛рд░рд┐рдд рддрдВрддреНрд░ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЯреЗрдирд░реНрд╕ рдХреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреИрдХрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ PyTorch рдЯреЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдЪреНрдЪ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЧрдд рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╢рдВрд╕рдиреАрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рджреЛ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВ:
рдлрд┐рд░ рднреА рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреЛрд░ PyTorch Tensor рд╡рд░реНрдЧ рдореЗрдВ рдмреНрд▓реЙрдХрд┐рдВрдЧ/рдЯрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред
NamedTensor рдХреЗ рдореМрдЬреВрджрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЯреЗрдВрд╕рд░ рдкрд░ рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рдореИрдХреЗрдирд┐рдЬреНрдо рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ рдЖрдпрд╛рдо рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрд░реНрдердкреВрд░реНрдг рдЕрд░реНрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдХреНрд░рд┐рдпрдг рдЯреЗрдВрд╕рд░ рдХреЗ рдЕрд░реНрде рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд NCHW рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рд░рдЦрдирд╛ рд╣реИред рдпрд╣ NamedTensor рдФрд░ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдмрдирд╛рддрд╛ рд╣реИред
рдпрджрд┐ рд╣рдо рдХреБрдЫ рдирд╛рдореЛрдВ (рдЬреИрд╕реЗ "рдЪреИрдирд▓", "рдЪреМрдбрд╝рд╛рдИ") рдХреЗ рдЕрд░реНрде рдХреЛ рдХрдард┐рди-рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рддреЛ рдСрдкрд░реЗрдЯрд░ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рддреЗрдЬреА рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЕрд░реНрдердкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ NHWC (рдЖрдЬ рдХреА рддрд░рд╣ NCHW рдирд╣реАрдВ) рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рд╣реЛрдЧрд╛ред
TensorFlow data_format
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдСрдкрд░реЗрдЯрд░ рд╕реНрддрд░ рдкрд░ NHWC рдФрд░ NCHW рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ; рд╕реНрд╡реАрдХрд╛рд░реНрдп рдорд╛рди рд╣реИрдВ ("рдПрдирдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА", "рдПрдирд╕реАрдПрдЪрдбрдмреНрд▓реНрдпреВ") 4-рдбреА рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП, ("рдПрдирдбреАрдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА", "рдПрдирд╕реАрдбреАрдПрдЪрдбрдмреНрд▓реНрдпреВ") 5-рдбреА рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП, рдпрд╛ channels_first
/ channels_last
рдЗрдирдкреБрдЯ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдЖрдпрд╛рдореАрддрд╛ред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдЯреЗрдВрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Caffe2 рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреЙрд▓ order
рдмрдЬрд╛рдп data_format
, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдкрд░реЗрдЯрд░ рд╕реНрддрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд▓рд┐рдЯрдорд╕ рдкреНрд░рд╢реНрди: рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреНрдпрд╛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ: tensor_in_nhwc_layout.size(1)
- рдЪреИрдирд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ PyTorch рдореЗрдВ NCHW рд╣реИ) рдпрд╛ рдКрдВрдЪрд╛рдИ (рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣реА рд╕реНрдерд┐рддрд┐ 1 рдкрд░ NHWC рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд╣реИ)ред
рдЗрд╕ рдЙрддреНрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВ:
empty_like
рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ; рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд╕рднреА рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдФрд░ рдмреАрд╕реА рд╣реЛрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
@VitalyFedyunin рдХреЛ .contiguous()
рдФрд░ torch.memory_layout
рдмрд┐рдЯреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЕрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдПрдХ рдкреНрд░рд╢реНрди - рдПрдХ 4D рдЯреЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП x
рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде (n, c, h, w)
x = torch.randn(n,c,h,w)
# x.size(): (n, c, h, w)
# x.stride(): (c*h*w, h*w, w, 1)
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдЬреАрдм рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рд╣реИ
y = x.permute(0, 3, 1, 2)
# y.size(): (n, w, c, h)
# y.stride(): (c*h*w, 1, h*w, w)
рдЕрдм рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ NHWC рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИред рдиреАрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рддрд░реНрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ
def is_nhwc_contiguous(x):
return x.permute(0,2,3,1).is_contiguous()
# or alternatively
def is_nhwc_contiguous(x):
n,c,h,w = x.size() # in any case the sizes remain in NCHW order
return x.stride() == (c*h*w, 1, c*w, c)
рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП is_nhwc_contiguous(y)
рд╕рдЪ рд╣реЛ рдЬрд╛рдПрдЧрд╛?
рдпрд╣ рд╕рд╣реА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рдЧрддрд┐ рдкрд░ рд░рд┐рд▓реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЙрдкреА, рдЯреВ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рднреА рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рд╕реЗ рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХрд╛ рдХреНрд░рдо рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рдорд╛рди рд╣реЛ? рдЖрдЗрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░ 4D рдЯреЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдПрдХ рдЯреЗрдВрд╕рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ sizes
, strides
рдФрд░ stride_indexes
:
рдЖрдХрд╛рд░ рдореЗрдВ (рдПрди, рд╕реА, рдПрдЪ, рдбрдмреНрд▓реНрдпреВ)
рднреМрддрд┐рдХ рдХреНрд░рдо рдореЗрдВ рдХрджрдо , рдЕрд░реНрдерд╛рддреН
stride_indexes рдирдХреНрд╢реЗ nchw рдЖрдХрд╛рд░ рдХреА рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВ:
рдПрдирд╕реАрдПрдЪрдбрдмреНрд▓реНрдпреВ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИред рдПрдирдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред
def is_nhwc_contiguous(x):
n,c,h,w = x.size()
return x.stride() == (h*w*c, w*c, c, 1)
def is_nchw_contiguous(x):
n,c,h,w = x.size()
return x.stride() == (c*h*w, h*w, w, 1)
def is_nchw_format(x):
return x.stride_index() == (0, 1, 2, 3)
def is_nhwc_format(x):
return x.stride_index == (0, 2, 3, 1)
def is_contiguous(x):
if (is_nchw_format(x)):
return is_nchw_contiguous(x)
else if (is_nhwc_format(x)):
return is_nhwc_contiguous(x)
else:
warning_not_support()
# or, to use stride_index
def is_contiguous(x):
return x.stride() == (x.size[x.stride_index[1]]*x.size[x.stride_index[2]]*x.size[x.stride_index[3]], x.size[x.stride_index[2]] * x.size[x.stride_index[3]], x.size[x.stride_index[3]], 1)
рдЗрд╕реЗ рдЕрд╡рд░реБрджреНрдз рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░ nChw16c рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ,
sizes: (n, c, h, w)
block_sizes: (n, c/16, h, w, 16)
strides: strides of (n, c/16, h, w, 16)
stride_indexes: (0, 1, 2, 3, 1) # assume blocked dimension is always in dense (i.e. on the right side of major dimension)
рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдмрд╛рдж рдореЗрдВ рдФрд░ рдЦреЛрдЬреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдУрдкреА рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреЗрд╡рд▓ ncw рд╕рдиреНрдирд┐рд╣рд┐рдд рдЯреЗрдВрд╕рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдпрд╣рд╛рдБ рдХреБрдЫ рдХрд╛рдо рд╣реЛрдЧрд╛ред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╣рдо рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рднреА рд╕рдХрддреЗ рд╣реИрдВ, рдорд╛рди рд▓реАрдЬрд┐рдП
def is_contiguous(format=nchw):
...
def contiguous(format=nchw)
...
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ nchw рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреЛ рдЙрди рдУрдкреА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ nchw рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╣рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
- рд╡рд┐рднрд┐рдиреНрди рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдЯреЗрдВрд╕рд░ (рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдмрд╕ рдЖрдпрд╛рдо рдХреНрд░рдо) PyTorch рдореЗрдВ Eager рдФрд░ JIT рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдЕрд╡рд░реБрджреНрдз рд▓реЗрдЖрдЙрдЯ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЕрдЪреНрдЫреЗ рд╣реИрдВред
- рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдЬрд░-рдПрдХреНрд╕рдкреЛрдЬреНрдб рдПрдкреАрдЖрдИ
- рдХреЛрд░ рд╕реАрдПрдирдПрди рдСрдкрд░реЗрд╢рдВрд╕ рд╡рд┐рднрд┐рдиреНрди рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдФрд░ рддреЗрдЬреА рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд░реВрдЯрд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
- JIT рдкрд╛рд╕ рдореЗрдВ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
рдмрдврд╝рд┐рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡! рдХреНрдпрд╛ рдореИрдВ рдЕрдкрдиреА рд╕рдордЭ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╣реИ (рдПрдордХреЗрдПрд▓-рдбреАрдПрдирдПрди рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рд╕рд╣рд┐рдд):
рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ "рдкреНрд░рд╛рд░реВрдк" рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬрдм рддрдХ рдпрд╣ рдХреНрд╡реЗрд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдкреАрдЖрдИ рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ, рд╣рдо рдПрдордХреЗрдПрд▓-рдбреАрдПрдирдПрди рдЬрдЯрд┐рд▓ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд░рд╛рд╕рдд/рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рдЕрдиреНрдп рддрд░реАрдХреЗ рдЬрдм рддрдХ рдпрд╣ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдврд╛рдВрдЪрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЙрди рд╕реВрдХреНрд╖реНрдо рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рд╣рдореЗрдВ рдСрдлрд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
рдУрдкреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдУрдкреА рдореЗрдВ рдПрдХ рдкрд╕рдВрджреАрджрд╛ рдкреНрд░рд╛рд░реВрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рдВрдЧрдд рдкреНрд░рд╛рд░реВрдк рдЬреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реЛред рддрддреНрд╡-рд╡рд╛рд░ рдСрдкрд░реЗрдЯрд░ (рдпрд╛ рдЕрдзрд┐рдХ рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓рддреЗ рд╣реБрдП, рдореЗрдореЛрд░реА рдмрд╛рдзреНрдп рдУрдкреА) рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдХреЛрдИ рд╡рд░реАрдпрддрд╛ рдирд╣реАрдВ рд╣реИред рдУрдкреА рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдо рдЯреЗрдВрд╕рд░ рдХреЛ "рдкреНрд░рд╛рд░реВрдк" рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдкреНрд░рд╛рд░реВрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд╛рдЗрдЯреЛрд░рдЪ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреНрд╡реЗрд░реА/рдмрджрд▓рддреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрд╡рд░реВрдкреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ conv2d (ReLU (conv2d)) рдорд╛рдорд▓рд╛)
@uyongw рдореИрдВ рдЖрдкрдХреЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрдк рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, "рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ NCHW рдЯреЗрдВрд╕рд░ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рддрдм рдПрдХ рдЕрдЬреАрдм рддрд░реАрдХреЗ рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрд╝ рдХрд┐рдпрд╛ рдерд╛ (рдЗрд╕рд▓рд┐рдП рдЕрдм рдпрд╣ NWCH рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ); рдЕрдм рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ NHWC рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИред" рд▓реЗрдХрд┐рди рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХрд╛ рдпрд╣ рдЧрд▓рдд рддрд░реАрдХрд╛ рд╣реИред рдПрдХ рдмреЗрд╣рддрд░ рд╕реВрддреНрд░реАрдХрд░рдг рд╣реИ, "рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ NHWC рдЯреЗрдВрд╕рд░ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдмрд╛рдж рдореЗрдВ NCHW рдЯреЗрдВрд╕рд░ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред"
рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреЗрдВрд╕рд░ рдХреЗ рднреМрддрд┐рдХ рдЖрдпрд╛рдореЛрдВ рдХрд╛ рдХреЛрдИ рдЖрдВрддрд░рд┐рдХ рдЕрд░реНрде рдирд╣реАрдВ рд╣реИ (рдЬрдм рд╣рдо рдкреНрд░рдЧрддрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ)ред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рддрднреА рдЕрд░реНрде рджреЗрддреЗ рд╣реИрдВ рдЬрдм рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдЯреЗрдВрд╕рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдХрд╛рд░, рд╕реНрдЯреНрд░рд╛рдЗрдб рдФрд░ рд╕реНрдЯреНрд░рд╛рдЗрдб_рдЗрдВрдбреЗрдХреНрд╕ рд╣реИрдВ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ stride_indexes
рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдЦреНрддреА рд╕реЗ рдмреЗрдорд╛рдиреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╣реИ "рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рд░рд┐рд╡рд░реНрд╕?) рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╕рдЪреНрдЪреА рдкреНрд░рдЧрддрд┐ред) @VitalyFedyunin рдФрд░ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ рдХрд┐ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдХреИрд╢ рдХрд░рдирд╛ рдЕрднреА рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЦреБрдж рд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдПрдХ рджрд░реНрдж рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ nchw рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИред
рд╣рд╛рдВ, рдпрд╣ рдореЗрд░реА рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд░рд╣рд╛ рд╣реИред
@CaoZhongZ
рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ "рдкреНрд░рд╛рд░реВрдк" рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬрдм рддрдХ рдпрд╣ рдХреНрд╡реЗрд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдкреАрдЖрдИ рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ, рд╣рдо рдПрдордХреЗрдПрд▓-рдбреАрдПрдирдПрди рдЬрдЯрд┐рд▓ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд░рд╛рд╕рдд/рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рдЕрдиреНрдп рддрд░реАрдХреЗ рдЬрдм рддрдХ рдпрд╣ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдврд╛рдВрдЪрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЙрди рд╕реВрдХреНрд╖реНрдо рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рд╣рдореЗрдВ рдСрдлрд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╕рдЯреАрдХ рд╡рд┐рд╡рд░рдг рд╣реИред рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рд╕рдорд░реНрдерди рдЬреЛ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд▓реЗрдЖрдЙрдЯ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рднреА рдЬреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреНрд▓реЙрдХ рд▓реЗрдЖрдЙрдЯ) рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рд╣рдорд╛рд░реЗ рдЕрдзрд┐рдХ рднрд╛рд░реА рд╡рдЬрди рд╡рд╛рд▓реЗ "рд▓реЗрдЖрдЙрдЯ" рддрдВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреЗрдВрд╕рд░ рдХреЗ рднреМрддрд┐рдХ рдЖрдпрд╛рдореЛрдВ рдХрд╛ рдХреЛрдИ рдЖрдВрддрд░рд┐рдХ рдЕрд░реНрде рдирд╣реАрдВ рд╣реИ (рдЬрдм рд╣рдо рдкреНрд░рдЧрддрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ)ред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рддрднреА рдЕрд░реНрде рджреЗрддреЗ рд╣реИрдВ рдЬрдм рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣рдордд :-) рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдирд╣реАрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ nhwc рдЯреЗрдВрд╕рд░ рд╣реИред рдлрд┐рд░ рдореИрдВ рдЗрд╕реЗ nwhc рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реВрдВред рдореИрдВ рдЖрдЧреЗ nhwc рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдлрд┐рд░ рдПрдХ рд╕рдиреНрдирд┐рд╣рд┐рдд () рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА nhwc рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИред рдХреНрдпрд╛ рдпрд╣ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реИ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ stride_indexes рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдЦреНрддреА рд╕реЗ рдмреЗрдорд╛рдиреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╣реИ "рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рд░рд┐рд╡рд░реНрд╕?) рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╕рд╣реА рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВред)
рдЖрдИрдПрдордПрдЪрдУ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдирдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА (рднреМрддрд┐рдХ) рдореЗрдВ рдХрджрдо рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЖрдХрд╛рд░ (рддрд░реНрдХ) рдХреЗ рд╕рд╛рде рд╕рд╣реА рдореИрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрджреЗрд╢ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЙрдкрд╛рдп рдирд╣реАрдВ рд╣реИред
рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рд░рд┐рд╡рд░реНрд╕ рдореИрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдФрд░ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП, nchw рдХреЗ рд▓рд┐рдП, рдпрд╣ (0, 1, 2, 3) рд╣реИ, nhwc рдХреЗ рд▓рд┐рдП, рдпрд╣ (0, 2, 3, 1) рдХреЗ рдмрдЬрд╛рдп (0, 3, 1, 2) рд╣реИред рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ stride_index рд╣реА рд╣рдореЗрд╢рд╛ NCHW рднреА рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ nChw16c рдпрд╛ OIhw16i16o рдЬреИрд╕реЗ рдЕрд╡рд░реБрджреНрдз рд╕реНрд╡рд░реВрдкреЛрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрд╡рд░реБрджреНрдз рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ; рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╣рдо рдЙрдиреНрд╣реЗрдВ 'рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ' рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рд╛рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рднреА рдореМрдЬреВрджрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдорд╛рди рдпрд╛ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣рдордд :-) рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдирд╣реАрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ nhwc рдЯреЗрдВрд╕рд░ рд╣реИред рдлрд┐рд░ рдореИрдВ рдЗрд╕реЗ nwhc рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реВрдВред рдореИрдВ рдЖрдЧреЗ nhwc рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдлрд┐рд░ рдПрдХ рд╕рдиреНрдирд┐рд╣рд┐рдд () рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА nhwc рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИред рдХреНрдпрд╛ рдпрд╣ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реИ?
рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдордЭрдирд╛ рдХрдард┐рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдмреЛрд▓рдЪрд╛рд▓ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджреЛрдВ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╕рдЯреАрдХрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдиреЗ рдЬреЛ рдХрд╣рд╛ рд╣реИ рдЙрд╕рдХреА рдореИрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
y = x.permute(0, 2, 3, 1)
рдЪрд▓рд╛рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд▓реЙрдЬрд┐рдХрд▓ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рднреМрддрд┐рдХ рд▓реЗрдЖрдЙрдЯ рдирд╣реАрдВред (рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХрд╛ рдорддрд▓рдм рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреА рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЖрдкрдиреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди x.permute(0, 3, 1, 2)
рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛z = y.permute(0, 2, 3, 1)
ред рддреЛ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЯреЗрдВрд╕рд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рддрд╛рд░реНрдХрд┐рдХ рд▓реЗрдЖрдЙрдЯ рднреМрддрд┐рдХ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо z.contiguous()
рдкреВрдЫреЗрдВ рддреЛ рд╣рдореЗрдВ рд╕рдЪ рдорд┐рд▓реЗрдЧрд╛ (рдФрд░, рднреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ, z.contiguous(memory_layout=NCHW)
рднреА рд╕рдЪ рд╣реЛрдЧрд╛ред) рд▓реЗрдХрд┐рди рдпрд╣ NHWC рд╕рдиреНрдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛редрдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╣ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдерд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ "рдкрд░рдореНрдпреВрдЯ" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред
рдЖрдИрдПрдордПрдЪрдУ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдирдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА (рднреМрддрд┐рдХ) рдореЗрдВ рдХрджрдо рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЖрдХрд╛рд░ (рддрд░реНрдХ) рдХреЗ рд╕рд╛рде рд╕рд╣реА рдореИрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрджреЗрд╢ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЙрдкрд╛рдп рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╕рд╛рд░ рд╣реИ: рд╣рдо рдПрдирд╕реАрдПрдЪрдбрдмреНрд▓реНрдпреВ рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рджреЗрддреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рддрд╛рд░реНрдХрд┐рдХ рд▓реЗрдЖрдЙрдЯ NCHW рд╣реИред рдЗрд╕рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рджреВрд░ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЖрдк рдЙрди рдЯреЗрдВрд╕рд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рддрд╛рд░реНрдХрд┐рдХ рд▓реЗрдЖрдЙрдЯ NCHW рдирд╣реАрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдереЛрдбрд╝рд╛ рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИред
@dzhulgakov
рд╕рдВрдЪрд╛рд▓рди рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
рдпрджрд┐ рднреМрддрд┐рдХ NHWC рдЯреЗрдВрд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ BC-рдмреНрд░реЗрдХрд┐рдВрдЧ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдЯреИрдЧ рдХреЗ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдЕрд░реНрде рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реИред) рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рдХреЗ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред
рдпрджрд┐ рднреМрддрд┐рдХ NHWC рдЯреЗрдВрд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ BC-рдмреНрд░реЗрдХрд┐рдВрдЧ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдЯреИрдЧ рдХреЗ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдЕрд░реНрде рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реИред) рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рдХреЗ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ 'рд╕реНрдЯрд┐рдХреА' рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдСрдк рдУрд╡рд░ рдореЗрдореЛрд░реА рдлреЙрд░рдореЗрдЯреЗрдб рдЯреЗрдВрд╕рд░ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХрд┐рдП рдЧрдП рдЯреЗрдВрд╕рд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред рдЗрд╕рд╕реЗ рдмреАрд╕реА рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ рдмрд╛рдЗрдирд░реА (рдпрд╛ рдЕрдзрд┐рдХ рд╕рджрд╕реНрдп) рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдм рдЯреЗрдВрд╕рд░ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рд╣реЛрддреЗ рд╣реИрдВред
@ezyang рдУрд╣ рдореИрдВрдиреЗ рдЕрднреА рдкрд╛рдпрд╛ рдХрд┐ рдореЗрд░реЗ рдЙрдкрд░реЛрдХреНрдд рдЙрддреНрддрд░ рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдкреЛ рд╣реИред (рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рднреА рд╕рд╣реА рд╣реИред) рдореБрдЭреЗ рдЗрд╕реЗ рдиреАрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрди: рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рджреЗрдВ:
рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪрд░рдг 2 рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА NHWC рд╕рдиреНрдирд┐рд╣рд┐рдд рдкрд╛рдпрд╛ред рдлрд┐рд░ рдореИрдВ рдЪрд░рдг 3 рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ рдЪрд░рдг 4 рдореЗрдВ NHWC рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯреЗрдВрд╕рд░ рдХрд╛ рднреМрддрд┐рдХ рдХреНрд░рдо рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
рдЕрд╡рд░реБрджреНрдз рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ; рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╣рдо рдЙрдиреНрд╣реЗрдВ 'рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ' рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рд╛рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рднреА рдореМрдЬреВрджрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдорд╛рди рдпрд╛ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рд╛рдБ, рд╣рдо рдкрд╣рд▓реЗ рдХрджрдо рдХреЗ рд░реВрдк рдореЗрдВ NHWC рдХреЛ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рдкреНрд░рд╛рд░реВрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИред рдЗрд╕реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдЕрдореВрд░реНрдд рдХреЗ рд╕рд╛рде)ред рдпрджрд┐ рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╛рд░реВрдк рд╡рд┐рд╡рд░рдг рд╣реИ, рддреЛ рдЕрдиреНрдп рдХреЗрд╡рд▓ рдирдП рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЕрд╡рд░реБрджреНрдз/рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдзрд┐рдХ рдЕрдЧрд░ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд░реНрдерди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдм рдХреБрдЫ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЫрд┐рдкреА рд╣реБрдИ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдВрджрд░ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рджреБрдирд┐рдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ/рдХреЗ рдмреАрдЪ рдПрдХ рдореБрджреНрджрд╛ рдмрди рд╕рдХрддрд╛ рд╣реИред
рд╡реИрд╕реЗ рднреА рдЕрд╡рд░реБрджреНрдз рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдмрд╣реБрдд рджреВрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪрд░рдг 2 рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА NHWC рд╕рдиреНрдирд┐рд╣рд┐рдд рдкрд╛рдпрд╛ред рдлрд┐рд░ рдореИрдВ рдЪрд░рдг 3 рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ рдЪрд░рдг 4 рдореЗрдВ NHWC рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯреЗрдВрд╕рд░ рдХрд╛ рднреМрддрд┐рдХ рдХреНрд░рдо рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдореИрдВ рдЕрдм рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдордЭрддрд╛ рд╣реВрдВред рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд░рдг 2 рдкрд░ рд░реБрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ NCHW рдЯреЗрдВрд╕рд░ рд╣реЛ; рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ W рдХреЛ C, рдЖрджрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛рдпрд┐рдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░рд╛рдЗрдб-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рд╣реИ ( @dzhulgakov , рд╣рдореЗрдВ рд╢рд╛рдпрдж рдЗрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХреБрдЫ рдкреНрд░рд╛рд╡рдзрд╛рди рд╣реИрдВ:
рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдЯреЗрдВрд╕рд░ рдкрд░ "рд╕реЙрдлреНрдЯ" рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдЯреИрдЧ рдкреЗрд╢ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЯреЗрдВрд╕рд░ рдкрд░ рдХрд┐рдП рдЧрдП рдЕрдВрддрд┐рдо рдЯреВ (рдореЗрдореЛрд░реА_рдлреЙрд░реНрдореИрдЯ) рдХреЙрд▓ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдПрдиреЛрдЯреЗрд╢рди "рд╕реЙрдлреНрдЯ" рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмреЗрдореЗрд▓ рдПрдиреЛрдЯреЗрд╢рди рдкрд░ рд╣рд╛рд░реНрдб-рдПрд░рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдмрд▓реНрдХрд┐ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рджреЗрдВрдЧреЗред
рд╕реЙрдлреНрдЯ рдореЗрдореЛрд░реА рдлрд╝реЙрд░реНрдореЗрдЯ рдЯреИрдЧ рдЖрдкрдХреЛ рдПрдХ NCHW рдЯреЗрдВрд╕рд░ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдЕрдиреБрдорддрд┐ рджреА рдереА, рдмрдирд╛рдо рдПрдХ рдЯреЗрдВрд╕рд░ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ, NHWC рд╣реИред рд▓реЗрдХрд┐рди рд╕реЙрдлреНрдЯ рдЯреИрдЧ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрд╡рд░реВрдк рдореЗрдВ рдЧреИрд░-рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рд╣реИред рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рдХреЗ рд╕рд╛рде, рд╣рдо (рддрд╛рд░реНрдХрд┐рдХ) рдЖрдпрд╛рдореЛрдВ рдкрд░ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдПрдХ рдЯреЗрдВрд╕рд░ рдХреЛ NCHW (рдорд╛рди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ) рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рдкреНрд░рд╛рд░реВрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИред рдЗрд╕реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдЕрдореВрд░реНрдд рдХреЗ рд╕рд╛рде)ред рдпрджрд┐ рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╛рд░реВрдк рд╡рд┐рд╡рд░рдг рд╣реИ, рддреЛ рдЕрдиреНрдп рдХреЗрд╡рд▓ рдирдП рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЕрд╡рд░реБрджреНрдз/рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдФрд░ рднреА рдХрдореЗрдВрдЯреНрд░реА рд╣реИрдВ: https://github.com/pytorch/pytorch/issues/16038#issuecomment -454490374
@ezyang рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рд╛рдБ рдирд░рдо рдкреНрд░рд╛рд░реВрдк рдЯреИрдЧ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЪрд┐рдВрддрд╛ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдпрд╛рдо рдХреНрд░рдо рдордирдорд╛рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рде рд╣реА рдпрд╣ рд╕реНрд╡рдпрдВ рдЧрдгрдирд╛ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред рдирд╛рдорд╛рдВрдХрд┐рдд рдЯреЗрдВрд╕рд░ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрд╛рдо рдХреЗ рд▓рд┐рдП рдЕрд░реНрдердкреВрд░реНрдг рдЕрд░реНрде рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реНрдЯреНрд░рд╛рдЗрдб рдСрд░реНрдбрд░ (рднреМрддрд┐рдХ) рд╕реЗ рдПрдирд╕реАрдПрдЪрдбрдмреНрд▓реНрдпреВ рдЖрдХрд╛рд░ рдСрд░реНрдбрд░ (рддрд╛рд░реНрдХрд┐рдХ) рддрдХ рдПрдХ рдирдХреНрд╢рд╛ рдкреЗрд╢ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдПрдирд╕реАрдПрдЪрдбрдмреНрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд▓рдЧрднрдЧ рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд╕рдорд╛рди рд╣реИ; NHWC рдХреЗ рд▓рд┐рдП, sizes
рдЕрднреА рднреА NCHW рд╣реИ, strides
(N, H, W, C) рдХреНрд░рдо рдореЗрдВ рд╣реЛрдЧрд╛ред рдФрд░ рд╣рдо рдХрджрдореЛрдВ рдХреЗ рдЖрдпрд╛рдо рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП stride_index
= (0, 2, 3, 1) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдзрд┐рдХ, strides
рдФрд░ stride_index
рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдЯреЗрдВрд╕рд░ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреЛ рдирдП рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЪреАрд▓рд╛рдкрди рджреЗ рд╕рдХрддрд╛ рд╣реИред
@ezyang
рд╕рдВрдЪрд╛рд▓рди рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
рдпрджрд┐ рднреМрддрд┐рдХ NHWC рдЯреЗрдВрд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ BC-рдмреНрд░реЗрдХрд┐рдВрдЧ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдЯреИрдЧ рдХреЗ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдЕрд░реНрде рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реИред) рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рдХреЗ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред
рдЬрдм рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдереНрд░реЗрд╢реЛрд▓реНрдб рдХреЛ TensorIterator рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛, рдЬреЛ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ BC-рдмреНрд░реЗрдХрд┐рдВрдЧ рдерд╛ (рдХреНрдпреЛрдВрдХрд┐ рдСрдкрд░реЗрдВрдб рдХреЗ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛, рдФрд░ TensorIterator рдЗрд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ)ред рдпрдерд╛рд╕реНрдерд┐рддрд┐ рдЕрдм рдмрд╣реБрдд рдЕрд╕рдВрдЧрдд рд╣реИ - рдереНрд░реЗрд╢реЛрд▓реНрдб рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдп рд╕рднреА рдпреВрдирд░реА рдСрдкрд░реЗрд╢рдВрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЯреЙрд░реНрдЪред рдЬрд╣рд╛рдВ рдирд╣реАрдВ, рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рджреЛрдиреЛрдВ рдСрдкрд░реЗрдВрдб рдХрд╛ рд▓реЗрдЖрдЙрдЯ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди "рдПрдирд╕реАрдПрдЪрдбрдмреНрд▓реНрдпреВ" рдпрд╛ рдЯреЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐ contiguous
рд╡рд░реНрддрдорд╛рди рд╕рдордЭ рдореЗрдВ рдпрджрд┐ рдХреЛрдИ рдмреЗрдореЗрд▓ рд╣реИ, рддреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдЖрдк empty_like
рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЕрдЪреНрдЫреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рддрд░рд╣ рдмреАрд╕реА рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдЗрд╕реЗ рдПрдХ рд▓реЗрдЖрдЙрдЯ рддрд░реНрдХ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреИрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ is_contiguous
x.is_contiguous(torch.memory_format.channels_first)
@ezyang @ngimel
рдЦрд╛рд▓реА_рд╕рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ; рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд╕рднреА рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдФрд░ рдмреАрд╕реА рд╣реЛрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдЖрдк рдЦрд╛рд▓реА_рд╕рдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рдореБрджреНрджрд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рддрд░рд╣ рдмреАрд╕реА рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рд╣рдо рднреМрддрд┐рдХ рдЖрджреЗрд╢ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдореЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ empty_like
BC рдХреЛ рддреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдЯреЗрдВрд╕рд░ рдореЗрдВ 3 рдкреНрд░рдХрд╛рд░ рдХреА рдЖрдпрд╛рдо рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ:
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рднреМрддрд┐рдХ рдХреНрд░рдо рдЖрдХрд╛рд░/рдЖрдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рд▓реЙрдЬрд┐рдХ рдСрд░реНрдбрд░ рдХреЛ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЖрдХрд╛рд░ рдФрд░ рднреМрддрд┐рдХ рдХреНрд░рдо рдХреЛ рдЕрд▓рдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдХреЗрд╡рд▓ рддрд░реНрдХ рдХреНрд░рдо рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЖрдХрд╛рд░ рдФрд░ рднреМрддрд┐рдХ рдХреНрд░рдо рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ empty_like
ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ size()
рдФрд░ stride_index()
рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди stride()
рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, NHWC рдЯреЗрдВрд╕рд░ рдХрд╛ empty_like
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде NHWC рд╕рдиреНрдирд┐рд╣рд┐рдд рдЯреЗрдВрд╕рд░ рд▓реМрдЯрд╛рдПрдЧрд╛ред
@uyongw рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ empty_like
рдХреЛ рдмрджрд▓рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдЧрд╛; рдЕрднреА рдЗрд╕рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде numpy рдХреЗ empty_like
рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдпрдерд╛рд╕реНрдерд┐рддрд┐ рдЕрдм рдмрд╣реБрдд рдЕрд╕рдВрдЧрдд рд╣реИ - рдереНрд░реЗрд╢реЛрд▓реНрдб рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдп рд╕рднреА рдпреВрдирд░реА рдСрдкрд░реЗрд╢рдВрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЯреЙрд░реНрдЪред рдЬрд╣рд╛рдВ рдирд╣реАрдВ, рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рджреЛрдиреЛрдВ рдСрдкрд░реЗрдВрдб рдХрд╛ рд▓реЗрдЖрдЙрдЯ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди "рдПрдирд╕реАрдПрдЪрдбрдмреНрд▓реНрдпреВ" рдпрд╛ рдЯреЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдЧрд╛ рдЬреЛ рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИ рд╡рд░реНрддрдорд╛рди рд╕рдордЭ рдЕрдЧрд░ рдХреЛрдИ рдмреЗрдореЗрд▓ рд╣реИ, рддреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
@ngimel , рд╣рд╛рдБ, рдпреЗ рдЕрднреА рдмрд╣реБрдд рд╕реБрд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдПрдХ рд╕реБрд╕рдВрдЧрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ
@ zou3519 numpy's empty_like рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рд╣реИ, рдореЗрдВ order
рддрд░реНрдХ рд╣реИ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ "рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓реЗрдЖрдЙрдЯ рд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред"ред рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ empty_like
pytorch рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ "nchw" - рд╕рдиреНрдирд┐рд╣рд┐рдд рдЯреЗрдВрд╕рд░ рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЕрд╕рдВрдЧрдд рд╣реЛ)
рдУрд╣, рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рдерд╛, рдореИрдВ рд╡рд╣ рдмрд╣реБрдд рдЬрд▓реНрджреА рдкрдврд╝ рд░рд╣рд╛ рдерд╛ред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░рд╛ рдЦрд╛рд▓реА_рд╕рдорд╛рди рдореИрдЪ numpy рднреА рд╣реЛ рдФрд░ рдпрд╣ (рд╢рд╛рдпрдж?) рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
@ zou3519 рд╣рд╛рдБ, рдореИрдВ рдЬреЛ рдХрд╣рдирд╛ рдЪрд╛рд╣ рд░рд╣рд╛ рд╣реВрдБ, рд╡рд╣ рд╣реИ рд╡рд░реНрддрдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ (рдЙрд▓реНрд▓реЗрдЦрд┐рдд @ezyang рдФрд░ @ngimel рдХреЗ рд░реВрдк рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рдХреНрд░рдо
рджреЛ рд╕рд╡рд╛рд▓:
рдпрджрд┐ рд╣рдо рдЕрдВрддрд┐рдо рдмреБрд▓реЗрдЯ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде (рдмреА) рдХреЗ рдХреЙрди рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ (рдмреА) рдореБрдЭреЗ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рднреА рдореМрдЬреВрджрд╛ рдСрдкреНрд╕ рдЯреЗрдВрд╕рд░ рдкрд░ рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдиреНрдирд┐рд╣рд┐рдд рдЯреЗрдВрд╕рд░ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдСрдкреНрд╕ рдЬреЛ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ (рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрд░реВрдк) рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рднреА рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧрд╛ред
@ zou3519 numpy's empty_like рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рд╣реИ, рдореЗрдВ
order
рддрд░реНрдХ рд╣реИ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ "рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓реЗрдЖрдЙрдЯ рд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред"ред рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛempty_like
pytorch рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ "nchw" - рд╕рдиреНрдирд┐рд╣рд┐рдд рдЯреЗрдВрд╕рд░ рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЕрд╕рдВрдЧрдд рд╣реЛ)
рд╣рдо рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреНрд░рд╛рд░реВрдк рд░рдЦрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ (рд╕реНрдореГрддрд┐ рд╕реНрд╡рд░реВрдкрд┐рдд рдЯреЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП)
рдпрджрд┐ NHWC рдЯреЗрдВрд╕рд░ рдХреЛ NCHW рдЯреЗрдВрд╕рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рд╕реНрдореГрддрд┐ рд╕реНрд╡рд░реВрдкрд┐рдд рдЯреЗрдВрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рд╕реНрдореГрддрд┐ рд╕реНрд╡рд░реВрдкрд┐рдд рдЯреЗрдВрд╕рд░ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдпрджрд┐ рджреЛрдиреЛрдВ рдЯреЗрдВрд╕рд░ рдореЗрдореЛрд░реА рд╕реНрд╡рд░реВрдкрд┐рдд рд╣реИрдВ, рддреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк рдкрд╣рд▓реЗ рдЯреЗрдВрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореИрдВ рджреЛ рдЪреАрдЬреЗрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛:
рд╣рдо рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреНрд░рд╛рд░реВрдк рд░рдЦрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ (рд╕реНрдореГрддрд┐ рд╕реНрд╡рд░реВрдкрд┐рдд рдЯреЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП)
рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ рдЙрдкрдпреЛрдЧреЛрдВ рдХрд╛ рдСрдбрд┐рдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЕрдХреНрд╕рд░ рдСрдкрд░реЗрдЯрд░ empty_like
рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдлрд┐рд░ рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рд╡реЗ NCHW рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИрдВред рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╣рдо рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдХреЛрдб рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдмреАрд╕реА рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ numpy рд╕реЗ рдЕрд▓рдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рд╕реНрдореГрддрд┐ рд╕реНрд╡рд░реВрдкрд┐рдд рдЯреЗрдВрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рд╕реНрдореГрддрд┐ рд╕реНрд╡рд░реВрдкрд┐рдд рдЯреЗрдВрд╕рд░ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдпрджрд┐ рджреЛрдиреЛрдВ рдЯреЗрдВрд╕рд░ рдореЗрдореЛрд░реА рд╕реНрд╡рд░реВрдкрд┐рдд рд╣реИрдВ, рддреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк рдкрд╣рд▓реЗ рдЯреЗрдВрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореИрдВ рдпрд╣ рднреА рдЬреЛрдбрд╝реВрдВрдЧрд╛, рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд┐рд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИ - рдЖрдЙрдЯрдкреБрдЯ рдЯреЗрдВрд╕рд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред
рдЦрд╛рд▓реА_рд╕рдорд╛рди рдкрд░ рд╕рд╣рдордд рд╣реИрдВ, рдРрд╕реЗ рдХреБрдЫ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЦрд╛рд▓реА_рд▓рд╛рдЗрдХ/рд╢реВрдиреНрдп_ рдЬреИрд╕рд╛ рдЖрджрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдирд╕реАрдПрдЪ-рд╕рдиреНрдирд┐рд╣рд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдиреНрдирд┐рд╣рд┐рдд рдореБрдЭреЗ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЫрд╡рд┐ рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ рд╣реИ)ред
рдЖрдЙрдЯрдкреБрдЯ рдЯреЗрдВрд╕рд░ рдкрд╛рд╕ рдХрд░рдирд╛ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ out
kwarg рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реА рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рд▓реЗрдЖрдЙрдЯ рдХреА рдЕрд╕рдВрдЧрддрд┐ рд╕реЗ рдЖрддреА рд╣реИрдВред рд╣рдо рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╕рд╛рде рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдЧрддрд┐ рдХреЗ рд▓рд┐рдП) рдФрд░ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЦрддреНрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдпрд╣рд╛рдБ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред
рдкрд╛рдпрдерди рдПрдкреАрдЖрдИ
рдирдИ рдорд╢рд╛рд▓ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВред рдореЗрдореЛрд░реА_рдлреЙрд░реНрдореЗрдЯ
torch_memory_format.any # default value
torch_memory_format.preserve
torch.memory_format.contiguous # what most of the functions now behave as default
torch.memory_format.nchw # requires 4D tensor, contiguous memory
torch.memory_format.nhwc # requires 4D tensor, restrided/permuted memory
рдЯреЗрдВрд╕рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
x = torch.zeros((10,3,32,32)) # NCHW
x.permute(0,2,3,1).is_contiguous(memory_format=torch.memory_format.nhwc) == False # because memory still layed out as NCHW
рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде 'рдЯреИрдЧ' рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
y = x.to(memory_format=torch.memory_format.nhwc)
y.is_contiguous(memory_format=torch.memory_format.nhwc) == True # We got new tensor with proper memory layout
y.is_contiguous() == False # Required for back compatibility
y.stride() == (3072, 3, 1, 96)
рдЕрдм рдЦрд╛рд▓реА_рд╕рдорд╛рди рдФрд░ рд╕рдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:
z = torch.empty_like(y)
z.is_contiguous() == True # For BC
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ:
z = torch.empty_like(y, memory_format=torch.memory_format.any )
рдЕрдЧрд░ рд╣рдо рдкреНрд░рд╛рд░реВрдк рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
z = torch.empty_like(y, memory_format=torch_memory_format.preserve)
z.is_contiguous() == False
z.is_contiguous(memory_format=torch.memory_format.nhwc) == True
рдЗрд╕реА рддрд░рд╣:
z = torch.empty_like(y, memory_format=memory_format=torch.memory_format.nhwc)
z.is_contiguous() == False
z.is_contiguous(memory_format=torch.memory_format.nhwc) == True
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдзреАрд░реЗ-рдзреАрд░реЗ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдореЛрд░реА_рдлреЙрд░реНрдореЗрдЯ рдбрд┐рдлреЙрд▓реНрдЯ рдХреЛ рджреБрдирд┐рдпрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдзреНрдпрд╛рди рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЯреЗрдВрд╕рд░ рдЯреЗрдВрд╕рд░рдСрдкреНрд╢рди рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реЗ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддреЗ рд╣реИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдбрд┐рд╡рд╛рдЗрд╕ рд╡рд┐рдХрд▓реНрдк out
рдЯреЗрдВрд╕рд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛)ред
рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╣рд▓реНрдХрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдЗрд╕реЗ рдЦреЛ рджреЗрдЧрд╛ред
x.zeros((10,3,32,32), memory_format=torch.memory_format.nhwc)
x = x.permute(0,1,3,2).permute(0,1,3,2)
x.is_contiguous(memory_format=torch.memory_format.nhwc) == False (even if strides are similar)
рдкреИрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдВ рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗред
рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╣рдо x.to(memory_format=torch.memory_format.nhwc) 'рдЯреИрдЧ' рдЯреЗрдВрд╕рд░ рдХреЛ рдЙрдЪрд┐рдд рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд╡рдпрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдмрд╣реБ
рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк 'рдЯреИрдЧ' рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░реЗрдЧрд╛
рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ
рдПрдкреАрдЖрдИ рдКрдкрд░ рдЖрдпрд╛рдореЛрдВ/рдХрджрдореЛрдВ/рдЖрдХрд╛рд░реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрд╕реА рдПрдкреАрдЖрдИ рдХреЛ рд░рдЦрддреЗ рд╣реБрдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдВрддрд░рд┐рдХ рдПрдкреАрдЖрдИ
рдСрдкрд░реЗрдЯрд░ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмреНрд░рд╛рдВрдЪ рдХрд░ рд╕рдХреЗрдВрдЧреЗ
if (self.memory_format(nhwc)) {
// fast path
} else
{
// classic implementation
}
рдпрджрд┐ рд╣рдо TensorOptions рдХреЗ рд░реВрдк рдореЗрдВ memory_format рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреНрд░реЗрд╖рдг рд╕реНрддрд░ рдкрд░ рд╢рд╛рдЦрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕реА рддрд░рд╣ рдбрд┐рд╡рд╛рдЗрд╕, рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП)
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЫреЛрдЯрд╛ рдЯреБрдХрдбрд╝рд╛ @VitalyFedyunin рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ 4D рдЯреЗрдВрд╕рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
torch.memory_format.nchw # requires 4D tensor, contiguous memory
torch.memory_format.nhwc # requires 4D tensor, restrided/permuted memory
рд░рд╛рд╕реНрддрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо 2D рдХреЗ рдЕрд▓рд╛рд╡рд╛ 1D рдФрд░ 3D рдХреЛ рднреА рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ), рдФрд░ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ channels_first/channels_last
рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рдереЗред
рд╕рд╣рдордд рд╣реВрдВ, рд╣рдореЗрдВ рдмреЗрд╣рддрд░ рдирд╛рдордХрд░рдг рдХреА рдЬрд░реВрд░рдд рд╣реИред channels_first
рдмреИрдЪ рдкрд╣рд▓реЗ рдЬрд╛рдиреЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд▓рдЧрднрдЧ рд╕рд╣реА рд▓рдЧрддрд╛ рд╣реИ =)
рдореБрдЭреЗ рдЖрдкрдХрд╛ рдирд╡реАрдирддрдо рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рд╣реИред рдХреНрдпрд╛ .contiguous() рдХреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдмрджрд▓ рдЬрд╛рдПрдЧреА? рдХреНрдпрд╛ рдЖрдкрдХреЛ .contiguous(memory_format=<...>) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдСрдкреНрд╕ рдмрд╕ .contiguous() рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рднреА рд╡реЗ рдореЗрдореЛрд░реА рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдлреЙрд░реНрдореЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрдИ рдСрдкрд░реЗрд╢рди рдЖрдЬ рднреА рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЦрд╛рд▓реА_рд▓рд╛рдЗрдХ () рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рднрд╛рд╡ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЗрдирдкреБрдЯ рдХреЗ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рд╕рд╣реА рд╕рдиреНрдирд┐рд╣рд┐рдд рдФрд░ рдЦрд╛рд▓реА_рд╕рдорд╛рди рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдиреНрд╣реЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реЛрдЧреА?
рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдФрд░ рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп) .contiguous()
рдХреЛ рдЕрд╡рд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рд╛рде рд╕реНрдореГрддрд┐ рд╕рдиреНрдирд┐рд╣рд┐рдд рдЯреЗрдВрд╕рд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рдЗрд╕ рдЕрдиреБрдмрдВрдз рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝ рд╕рдХрддреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ: рдЬреИрд╕реЗ рд╣реА рд╣рдо рдореЗрдореЛрд░реА_рдлреЙрд░реНрдореЗрдЯ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЗрдЖрдИрдЯреА рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрдЬрд╛рдп .contiguous(memory_format=...)
рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдХрдм рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИред
@VitalyFedyunin рдХреНрдпрд╛ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕рдВрдЪрд╛рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ?
x.zeros(10,3,32,32)
# x is in nchw (default)
# x.size() is [10,3,32,32]
# x.stride() is [3*32*32, 32*32, 32,1]
x = x.permute(0,2,3,1)
# At this point
# x.size() is [10,32,32,3], size is not in nchw order
# x.stride() is [3*32*32, 32,1,32*32]
# How can this be supported?
y = x.to(memory_format=torch.memory_format.nhwc)
рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
x.zeros(10,3,32,32)
# `x` is in nchw (default)
# x.size() is [10,3,32,32]
# x.stride() is [3*32*32, 32*32, 32,1]
x = x.permute(0,2,3,1)
x=x.contiguous()
# At this point
# x.size() is [10,32,32,3], size is not in nchw order
# x.stride() is [32*32*3, 32*3,3,1]
# How can this be supported?
y = x.to(memory_format=torch.memory_format.nhwc)
@ raghuramank100 - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ .permute(0,2,3,1)
рдХреНрдпреЛрдВ рдХреЙрд▓ рдХрд░реЗрдЧрд╛? рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕рднреА рдЯреЗрдВрд╕рд░реЛрдВ рдХрд╛ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЖрдХрд╛рд░ (рдПрди, рд╕реА, рдПрдЪ, рдбрдмреНрд▓реНрдпреВ) рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдХрд╛рд░ (1) рдЖрдкрдХреЛ рдЪреИрдирд▓ рджреЗрддрд╛ рд╣реИред рдЖрдЬ рдкреАрдЯреА рдХрд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдпрд╣реА рдорд╛рдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рднреА рд╡рд╣ рдХреНрдпрд╛ рдорд╛рдиреЗрдЧрд╛ред рддреЛ рдХреЛрдИ рднреА .permute рдХреЛ рдХрднреА рднреА рдХреЙрд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛
рдХреНрдпрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдЯреЗрдВрд╕рд░ рдХреЗ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ?
with torch.memory_format(torch.memory_format.nhwc):
# a will be allocated with the context managed memory format
a = torch.randn(...)
# b will be allocated matching some assumed default format
b = torch.randn(...)
рдореБрдЭреЗ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрдореЛрд░реА_рдлреЙрд░реНрдореИрдЯ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдвреАрд▓рд╛ рдХрд░ рджреЗрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
with torch.memory_format(torch.channels_last):
x = torch.randn(10,3,32,32) # this one is NHWC
y = torch.randn(10,10) @ this one is not
рдЬрдм рд╕реНрдкрд╖реНрдЯ memory_format рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ:
x = torch.randn(10,3,32,32).to(memory_format=torch.channels_last) # this one is NHWC
y = torch.randn(10,10).to(memory_format=torch.channels_last) # This is errors out as dim == 2
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╣рдо рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
x = torch.randn(10,3,32,32, memory_format=torch.channels_last)
@raghuramank100 рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
y = x.to(memory_format=torch.channels_last)
рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рднреА рдЧрдВрджреЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдбрд┐рдореНрд╕ рдСрд░реНрдбрд░ рдХреЛ x рдЬреИрд╕рд╛ рд╣реА рд░рдЦрддреЗ рд╣реБрдПред
рдЗрд╕рд▓рд┐рдП:
x = torch.randn(10, 3, 32, 32)
nhwc = x.to(memory_format=torch.channels_last)
self.assertFalse(nhwc.is_contiguous())
self.assertTrue(nhwc.is_contiguous(memory_format=torch.channels_last))
self.assertEqual(nhwc, x)
рдФрд░ рдЖрдк рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ nhwc рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ
nhwc[N][C][H][W]
@VitalyFedyunin рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдордХрд░рдг (рдпрджрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд░рд╣рддрд╛ рд╣реИ) рдореБрдЭреЗ рднреНрд░рд╛рдордХ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ "to" рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП Tensor рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рд╣реИред
рд╕рд╛рде рд╣реА, C_ORDER рдФрд░ F_ORDER рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Numpy's one рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
numpy.asfortranarray()
numpy.ascontiguousarray()
рдХреЛрдИ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
torch.randn(32, 3, 64, 64).to(device).as_nhwc()
@VitalyFedyunin : рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдЕрд▓рдЧ рдореЗрдореЛрд░реА_рдлреЙрд░реНрдореИрдЯ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдмрд╛рд░ рдЬрдм рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЯреЙрд░реНрдЪ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрдкрд░реЛрдХреНрдд рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЪреЗрддрд╛рд╡рдиреА/рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реЛ рдХрд┐ рд▓реЗрдЖрдЙрдЯ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред
@VitalyFedyunin : рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдЕрд▓рдЧ рдореЗрдореЛрд░реА_рдлреЙрд░реНрдореИрдЯ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдмрд╛рд░ рдЬрдм рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЯреЙрд░реНрдЪ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрдкрд░реЛрдХреНрдд рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЪреЗрддрд╛рд╡рдиреА/рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реЛ рдХрд┐ рд▓реЗрдЖрдЙрдЯ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ рддрднреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬрдм рд╣рдо рдирд╛рдорд╛рдВрдХрд┐рдд рдЯреЗрдВрд╕рд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдХреНрдпреЛрдВрдХрд┐ рдЕрднреА:
x.zeros(10,10,10,10)
x = x.permute(0,2,3,1)
рдХреЛрдИ рдореБрдЭреЗ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА nchw рдмрдирд╛рдпрд╛ рд╣реИ рдпрд╛ nhwcред
рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рдЯреИрдЧ рдирд╣реАрдВ рд╣реИ?
@VitalyFedyunin рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдЬрдм рдпрд╣ рдПрдкреАрдЖрдИ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдП рддреЛ рдпрд╣ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
@dzhulgakov @VitalyFedyunin # x[0]
; рдпрджрд┐ x рдкрд╣рд▓реЗ NHWC рдЯреЗрдВрд╕рд░ рдерд╛, рддреЛ рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж HWC рдЯреЗрдВрд╕рд░ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд╡рд┐рдЯрд╛рд▓реА рдХрд╛ рдкреИрдЪ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рд╡рд╣реА рдСрдкрд░реЗрдЯрд░ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдЧрдбрд╝рдмрдбрд╝ рдХрд░рддреЗ рд╣реИрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдСрдбрд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ?
рд░реБрдХреЛ, рдЯреЗрдВрд╕рд░ рдЕрднреА рднреА рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╣реИрдВ: 0-рдордВрдж рдПрди; рдкрд╣рд▓рд╛-рдордВрдж рд╕реА; 2-рдордВрдж рдПрдЪ; 3-рдордВрдж W. рддреЛ x[0] 0-рдордВрдж C рдХреЗ рд╕рд╛рде рдЯреЗрдВрд╕рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ; рдкрд╣рд▓рд╛-рдордВрдж рдПрдЪ; рджреВрд╕рд░рд╛-рдордВрдж W. рднрд▓реЗ рд╣реА x channel_first рдпрд╛ channel_last рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рд╣реЛред
рдЕрдиреНрдпрдерд╛ memory_format рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЯреЗрдВрд╕рд░ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рдЯреИрдЧ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдХреЛ channels_last
рдЯреИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдирдП рдЯреЗрдВрд╕рд░ рдХреЛ any
cc @zou3519 , рдпрд╣рд╛рдБ рд▓реЗрдЖрдЙрдЯ рдкреНрд░рд╕рд╛рд░ рддрд░реНрдХ рдореБрдЭреЗ рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рдХрд╛рд░реНрдп рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдирд╛рдорд┐рдд рдЖрдпрд╛рдо рдкреНрд░рд╕рд╛рд░ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИред
рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдкрдХрдбрд╝ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди @ezyang рд╣рдо рдкреНрд░рддрд┐-рдЖрдпрд╛рдо рдзреНрд╡рдЬ (рдпрд╛ рдирд╛рдо) рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рдХреЗ рд▓реЗрдЖрдЙрдЯ рдкреНрд░рдЪрд╛рд░ рддрд░реНрдХ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдпрд╣ рдирд╛рдо рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЗ рд╕рд╛рде рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛
рдпрд╣ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдореЗрдореЛрд░реА рдЯреИрдЧ рд▓реЙрдЬрд┐рдХ рдФрд░ рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рд▓реЙрдЬрд┐рдХ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрде рд╣реЛрдВред
рджреЛ рдЯреЗрдВрд╕рд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ .is_contiguous
рдФрд░ .contiguous
(рдкрд╛рдпрдерди рдФрд░ рд╕реА ++ рдПрдкреАрдЖрдИ рджреЛрдиреЛрдВ) рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рдиреЛрдЯ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ .to(memory_format)
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рд╢рд┐рдХрд╛рдпрддреЗрдВ рдереАрдВ, рдФрд░ рд╣рдордиреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
.contiguous
рдЕрдм рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреАрд╡рд░реНрдб-рдХреЗрд╡рд▓ рддрд░реНрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ - memory_format
, рдЬреЛ рдпрд╛ рддреЛ torch.contiguous_format
рдпрд╛ torch.channels_last
ред
torch.contiguous_format
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдореМрдЬреВрджрд╛ .contiguous()
рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╣реЗрдЧрд╛ред
рдХреЙрд▓ рдХрд░рдирд╛ x.contiguous(memory_format=torch.channels_last)
рдирдпрд╛ рдЯреЗрдВрд╕рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рди рдЕрд░реНрдердкреВрд░реНрдг рд▓реЗрдЖрдЙрдЯ (NCHW) рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдкреИрдЯрд░реНрди рд╣реИред
x.contiguous(memory_format=torch.channels_last)
рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдХреЗ 3d, 4d рдпрд╛ 5d рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ; рдФрд░ рдЕрдиреНрдпрдерд╛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред
.is_contiguous
рдЕрдм рдХреЗрд╡рд▓ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ - memory_format
, рдЬреЛ рдпрд╛ рддреЛ torch.contiguous_format
рдпрд╛ torch.channels_last
ред
x.is_contiguous(memory_format=torch.contiguous_format)
x.is_contiguous()
рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддрд╛ рд╣реИред
x.is_contiguous(memory_format=torch.channels_last)
рдЕрдЧрд░ рдП) рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИ рдФрд░ рдмреА) рдПрдирдбрдмреНрд▓реНрдпреВрдПрдЪрд╕реА (рдпрд╛ 3 рдбреА, 5 рдбреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди) рдореЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдЪ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдиреЛрдЯ: рдЪрд░рдг рдХреЗ рдЕрдВрдд рддрдХ x.is_contiguous(memory_format=torch.channels_last)
рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдкрд░ рдЯреЗрдВрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрд╛рдж рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рдПрдЧреАред
рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░реЗрдВ:
рдпреВрдирд░реА рддрддреНрд╡-рд╡рд╛рд░ рдСрдкрд░реЗрдЯрд░ channel_last рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрддреЗ рд╣реИрдВред
a = torch.randn(N,C,H,W)
b = a.contiguous(memory_format=torch.channels_last)
c = b.sin()
c.is_contiguous(memory_format=torch.channels_last) == True
рдмрд╛рдЗрдирд░реА рддрддреНрд╡-рд╡рд╛рд░ рдСрдкрд░реЗрдЯрд░ ( add
, sub
, mul
, div
) channel_last рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
a = torch.randn(N,C,H,W)
b = a.contiguous(memory_format=torch.channels_last)
c = b * torch.randn(H,W)
c.is_contiguous(memory_format=torch.channels_last) == True
рд╕рд╛рдЗрдЬрд╝, рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдФрд░ рдбрд┐рдореНрд╕ рдСрд░реНрдбрд░ рдкрд░ рдХреЛрдИ рднреА рдСрдкрд░реЗрд╢рди рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
a = torch.randn(N,C,H,W)
b = a.contiguous(memory_format=torch.channels_last)
c = b.permute(0,2,3,1).permute(0,3,1,2)
c.is_contiguous(memory_format=torch.channels_last) == False
рдЕрдирд┐рд░реНрдгреАрдд рд░рд╣рддрд╛ рд╣реИ
рдпрджрд┐ рдЖрдЙрдЯрдкреБрдЯ 'рдЪреИрдирд▓_рд▓рд╛рд╕реНрдЯ' рд╕реБрдкрд╛рдареНрдп рд╣реИ, рддреЛ рд░реАрд╢реЗрдк (рдФрд░ рд╕рдорд╛рди) рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо
import torch
a = torch.randn(N,C,H,W)
b = a.contiguous(memory_format=torch.channels_last)
c = b.reshape(N,C,-1)
c.is_contiguous(memory_format=torch.channels_last) # ?
рдиреЛрдЯ: рд╡рд░реНрддрдорд╛рди рдореЗрдВ memory_format рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ
NHWC + NCHW рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд░рд┐рдгрд╛рдоред рдХреНрдпрд╛ рдпрд╣ рдПрдирдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА рд╣реИ?
рдиреЛрдЯ: рд╡рд░реНрддрдорд╛рди рдореЗрдВ NHWC + NCHW -> NHWC рдФрд░ NCHW + NHWC -> NHWC
рдмрд┐рд▓реНрд▓реА/рд╡рд┐рднрд╛рдЬрди рдЬреИрд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЙрдирдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
@ezyang - рдЕрдиреБрдХреНрд░рдордг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд╣реАрдВ рд░реБрдХ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рднрд┐рдиреНрди рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдСрдкреНрд╕ рдХреЛ рдЙрдирдХреА рдЕрд╡рд╣реЗрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ x[0]
рдХреЛ x[0].unsqueeze(0)
рд╕рд╣рд┐рдд рдЯреИрдЧ рдХреЛ рдорд┐рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП
рдЬреИрд╕рд╛ рдХрд┐ рд░рдШреБ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдмрд┐рд▓реНрд▓реА/рд╡рд┐рднрд╛рдЬрди рдХреЛ рдЯреИрдЧ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрдЧреВрдареЗ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рддрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд░реИрдВрдХ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдпрд╛ рдзреБрд░реА рдХреЛ рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЯреИрдЧ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд░реИрдВрдХ рдмрджрд▓рддрд╛ рд╣реИ - рд╕рднреА рдмреЗрдЯреНрд╕ рдмрдВрдж рд╣реИрдВред
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдо рдЯреИрдЧ рдЦреЛ рджреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдореИрдВ x[0]
рдмрд╛рд░реЗ рдореЗрдВ рдЕрд╕рд╣рдордд рд╣реВрдВред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП NCHW
рд╕реЗ CHW
рддрдХ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рдж рдХрд┐ Tensors рдХреЛ channel_last 'рдЯреИрдЧ' рд▓реЗ рдЬрд╛рдиреЗ (рдпрд╛ рдирд╣реАрдВ) рдХрд░рдиреЗ рдореЗрдВ рдХрд┐рддрдирд╛ рднреНрд░рдорд┐рдд рд╣реИ, рд╣рдордиреЗ bc-рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдЪреИрдирд▓_рд▓рд╛рд╕реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдСрдЯреЛ-рдкреНрд░рдореЛрд╢рди рдЯреЗрдВрд╕рд░ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ:
N,1,H,[W,[D]] рдЬреИрд╕реЗ рд╕реНрдЯреНрд░рд╛рдЗрдб рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА 3d, 4d, 5d рдЯреЗрдВрд╕рд░ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ channel_last рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддреЗрдВрдЧреЗ рдХрд┐ channel_last tensors рдкрд░ рдСрдкрд░реЗрдЯрд░ рдЬреЛ channel_last tensors рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХрд╛ рдХрдо рд╕реЗ рдХрдо рд╕рдиреНрдирд┐рд╣рд┐рдд рдЯреЗрдВрд╕рд░ рдкрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рдорд╛рди рдкреНрд░рджрд░реНрд╢рди рд╣реЛрдЧрд╛ред
рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ:
1) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ .contiguous() рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
2) рд╣рдо рдСрдЯреЛ-рдкреНрд░рдореЛрд╢рди рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рд▓рдЧрднрдЧ рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛ред
рдРрд╕реЗ рдСрдЯреЛ рдкреНрд░рдЪрд╛рд░ рдХреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реИрдВ:
import torch
x = torch.randn(10,16,16,3).permute(0,3,1,2)
x.is_contiguous(memory_format=torch.channels_last) == True
рджреВрд╕рд░реА рдУрд░ рдпрд╣ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рд╣рд▓реНрдХреЗ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рдмрд╛рдж):
import torch
x = torch.randn(10,3,16,16).contiguous(memory_format=torch.channels_last)
x = x[0].unsqueeze(0)
x.is_contiguous(memory_format=torch.channels_last) == True
рд╕реБрд╕реНрдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рд╕реЗ, @ezyang рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░
рдирддрд╛рд▓рд┐рдпрд╛ рдЧрд┐рдореЗрд▓рд╢реЗрди [2:19 рдЕрдкрд░рд╛рд╣реНрди]
рдЗрд╕рд▓рд┐рдП рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЯреИрдЧ рдХреА рдХреЛрдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
import torch
#batch = 10, channels = 4, spatial dimensions = 16
x = torch.randn(10,16,16,4).permute(0,3,1,2)
x.is_contiguous(memory_format=torch.channels_last) == True
y = torch.randn(10,16,16,2).permute(0,3,1,2)
x1,x2 = x.chunk(2, dim=1) #chunk along channels dimension, no longer contiguous
x1.is_contiguous(memory_format=torch.channels_last) == False #right? So, if a tensor like this comes into e.g. convolution, what am I supposed to do with it? Did it want to be NHWC? Did it want to be nchw?
z=y+x1 #y is channels_last, x1 is something, what is the z layout?```
рд╡рд┐рдЯрд╛рд▓реА рдлреЗрдбреНрдпреБрдирд┐рди [8:23 рдкреВрд░реНрд╡рд╛рд╣реНрди]
z channel_last . рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
рд╡рд┐рдЯрд╛рд▓реА рдлреЗрдбреНрдпреБрдирд┐рди [8:25 рдкреВрд░реНрд╡рд╛рд╣реНрди]
рдпрджрд┐ X1 рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ channel_last рдирд╣реАрдВ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЪрдВрдХ рдлрдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рддреЗ рд╣реИрдВ), рддреЛ рдХрдирд╡рд▓реНрд╢рди рдЗрд╕реЗ рд╕рдиреНрдирд┐рд╣рд┐рдд (рдЪреИрдирд▓_рдлрд░реНрд╕реНрдЯ) рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ рдФрд░ рд╕рдиреНрдирд┐рд╣рд┐рдд рднреА рд▓реМрдЯрд╛рдПрдЧрд╛
рд╡рд┐рдЯрд╛рд▓реА рдлреЗрдбреНрдпреБрдирд┐рди [9:12 AM]
@ngimel рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рджреГрд╢реНрдп-рд╕рдорд╛рди рд╕рдВрдЪрд╛рд▓рди рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо
рдирддрд╛рд▓рд┐рдпрд╛ рдЧрд┐рдореЗрд▓рд╢реЗрди [9:36 рдкреВрд░реНрд╡рд╛рд╣реНрди]
рдПрдХ рдзрд╛рдЧреЗ рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛:
рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдирд╣реАрдВ? рдЪреИрдирд▓реЛрдВ рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдкрдирд╛ рдЬреИрд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВред рддреЛ рдЕрдЧрд░ рдЯреЗрдВрд╕рд░ рдЪреИрдирд▓ рдкрд╣рд▓реЗ рдЯреЗрдВрд╕рд░ рдХреЛ рдЦрдВрдбрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдирд╡рд▓реНрд╢рди рдЖрдЙрдЯрдкреБрдЯ рдЪреИрдирд▓-рдлрд░реНрд╕реНрдЯ рд╣реЛрдЧрд╛ (рдЬреЛ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ), рдпрджрд┐ рдЯреЗрдВрд╕рд░ рдЪреИрдирд▓-рдЖрдЦрд┐рд░реА рд╣реИ рддреЛ рдХрдиреНрд╡реЗрдХреНрд╢рди рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЪреИрдирд▓ рдкрд╣рд▓реЗ рд╣реЛрдЧрд╛?
рдирддрд╛рд▓рд┐рдпрд╛ рдЧрд┐рдореЗрд▓рд╢реЗрди [9:39 рдкреВрд░реНрд╡рд╛рд╣реНрди]
рдПрдХ рдзрд╛рдЧреЗ рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛:
рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЧреИрд░-рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рдЬреЛрдбрд╝ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рдФрд░ y
рдкрд╣рд▓реЗ рддрд░реНрдХ рдФрд░ рдЪреИрдирд▓ рдЖрдЦрд┐рд░реА рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рд╣реИ рдирд╛? x1+y
рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╣реАрдВ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдкреНрд░рдЪрд╛рд░ рдирд┐рдпрдо рд╣реИрдВ?
рд╡рд┐рдЯрд╛рд▓реА рдлреЗрдбреНрдпреБрдирд┐рди [10:44 рдкреВрд░реНрд╡рд╛рд╣реНрди]
1) рд╣рд╛рдБ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдЕрднреА рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ (рдпрд╛ рджреЛ рджрд┐рдиреЛрдВ рдореЗрдВ) рд▓рд┐рдЦреВрдВрдЧрд╛ред
2) x1+y - рднреА channel_last рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдиреНрдпрдерд╛ рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдФрд░ рд╣рд╛рдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реЗрдЖрдЙрдЯ рдкреНрд░рдЪрд╛рд░ рдирд┐рдпрдо рд▓рд┐рдЦреЗ рд╣реЛрдВрдЧреЗред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдордиреЗ рдЗрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рддреЛ рдореИрдВрдиреЗ @VitalyFedyunin рдХреЛ рдЬреЛ рдЕрд╡рд▓реЛрдХрди рдХрд┐рдпрд╛ (рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рд▓рд┐рдЦрдирд╛ рдпрд╛рдж рдЖрдпрд╛), рдпрд╣ рд╣реИ рдХрд┐
рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдереНрд░реИрд╢ рдЖрдЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рд╡рд░рдг рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдВрдд рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рддреЛ рдХрдирд╡рд▓реНрд╢рди рдХреА рдЖрд▓рд╕реНрдп (рдФрд░ рдЕрдиреНрдп рд▓реЗрдЖрдЙрдЯ-рдЬрд╛рдЧрд░реВрдХ рдСрдкрд░реЗрдЯрд░реЛрдВ, рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдкрд╕реИрдВрдкрд▓рд┐рдВрдЧ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрдирдкреБрдЯ рдкрд░ .contiguous() рдХреЙрд▓ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ - рддреЛ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?) рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░рдг рдерд╛ рдЯреИрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдИрдЖрдИрдЖрд░рд╕реАред
рд╣рд╛рдБ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЯреИрдЧ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо
рдЗрди рдЯреИрдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛,
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЬрдм рдЖрдк рд▓реЗрдЖрдЙрдЯ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдЪрдВрдХрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрддрд╛)
рдЪреИрдирд▓реЛрдВ рдкрд░)ред рдореБрдЭреЗ рдХреБрдЫ "рд╡рд░реНрддрдорд╛рди рд▓реЗрдЖрдЙрдЯ" рдмрдирд╛рдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рд╢реМрдХ рд╣реИ
рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рдХреА рддрд░рд╣, рдЗрд╕реЗ рдбреЗрдЯрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдпред
рдирдЧрд┐рдореЗрд▓ рдХреЗ 2019-06-19 12:43:45 -0700 рдХреЗ рд╕рдВрджреЗрд╢ рдХреЗ рдЕрдВрд╢:
рддреЛ рдХрдирд╡рд▓реНрд╢рди рдХреА рдЖрд▓рд╕реНрдп (рдФрд░ рдЕрдиреНрдп рд▓реЗрдЖрдЙрдЯ-рдЬрд╛рдЧрд░реВрдХ рдСрдкрд░реЗрдЯрд░реЛрдВ, рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдкрд╕реИрдВрдкрд▓рд┐рдВрдЧ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрдирдкреБрдЯ рдкрд░ .contiguous() рдХреЙрд▓ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ - рддреЛ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?) рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░рдг рдерд╛ рдЯреИрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдИрдЖрдИрдЖрд░рд╕реАред
BTW рд╣рдореЗрдВ рдХреЗрд╡рд▓ layout
рдЪрд┐рдкрдХреЗ рд░рд╣рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреНрдпреЛрдВ рдмрдирд╛рдиреА рд╣реИ? рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд┐рд░рд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ "рдЪреИрдирд▓_рд▓рд╛рд╕реНрдЯ" рдЬреИрд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ memory_formats * layouts
рдЙрддреНрдкрд╛рдж рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ( layouts
рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ ), рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ memory_format + layouts
рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрд╕реА рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рд╣рдо рдХрд░рддреЗ рдереЗ? рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рджреЛрдиреЛрдВ рдЫреЛрдЯреЗ, рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдПрдХ рд╣рдЬрд╛рд░ рддрд░реНрдХреЛрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рджреЗрдВрдЧреЗред
рд▓реЗрдЖрдЙрдЯ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ), рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ рдФрд░ рд╕рд╛рде рд╣реА рдСрдЯреЛ рдХрдиреНрд╡рд░реНрдЯрд┐рдВрдЧ рдЯреЗрдВрд╕рд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдореЗрдореЛрд░реА_рдлреЙрд░реНрдореИрдЯ рдкрд░ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред
рдЖрдЦрд┐рд░рдХрд╛рд░ рдореЗрдореЛрд░реА_рдлреЙрд░реНрдореИрдЯ рдЯреЗрдВрд╕рд░ рдХреЛ рд╕реНрдЯреНрд░рд╛рдЗрдб рдХрд░рдиреЗ рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реНрдиреЗрд▓ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓реЗрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреНрд░рд╛рдЗрдбреЗрдб рдЯреЗрдВрд╕рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдирд╣реАрдВ
рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ рд╕реНрдкреИрд╕ рд▓реЗрдЖрдЙрдЯ рднреА рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реНрдиреЗрд▓ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪреБрдирдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдЕрдзрд┐рдХрддрд░ рд╢реВрдиреНрдп рд╣реИ рдХреНрдпрд╛ рдЖрдк "рдлреНрд▓рд╛рдИ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдореЗрдореЛрд░реА_рдлреЙрд░реНрдореИрдЯ рдкрд░ рдСрдЯреЛ рдХрдирд╡рд░реНрдЯрд┐рдВрдЧ рдЯреЗрдВрд╕рд░ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде" рднрд╛рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?
рдпрд╣ рдПрдХ рднреЛрд▓рд╛ рд╕рд╡рд╛рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ PyTorch рдЗрд╕ рдПрдкреАрдЖрдИ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдмрдирд╛рдо рд╕рд┐рд░реНрдл рдСрдкреНрд╕ рдореЗрдВ NHWC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рд╕реАрдзреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд CuDNN рдХрд░реНрдиреЗрд▓ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ?
рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ (рдПрд▓рдПрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдСрдкреНрд╕ рдЬреИрд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рдкреВрд▓рд┐рдВрдЧ рдХреЛ рдорд┐рд▓рд╛рдХрд░) рдпрд╣ рдПрдХ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ Conv2d(..., nhwc=True)
рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ?
@rewonc рд╣рдордиреЗ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ (
nhwc=True
рд╡рд┐рдХрд▓реНрдк рднреА рди рд╣реЛредnhwc=True
рд╡рд┐рдХрд▓реНрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАредрдкреБрдирд╢реНрдЪ. рдпрджрд┐ рдЖрдк CudNN Ex
рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ, рддреЛ рд╣рдо cudnn_batch_norm_nhwc
рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдмреЗрдирдХрд╛рдм рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╣рд╛рдп @VitalyFedyunin , рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рдХреЛ PyTorch 1.3 рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрдпрд╛ рдпрд╣ NHWC (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрд╡рд░реБрджреНрдз) рдкреНрд░рд╛рд░реВрдк рд╕рдорд░реНрдерди рдкрд░ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╣рд▓ (рдпрд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓) рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ NHWC рд░рд╛рдЬреНрдп рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?
рд╣рдо рдЪреИрдирд▓реЛрдВ рдХреЗ рдЕрдВрддрд┐рдо рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдпрд╣рд╛рдВ рдФрд░ рд╕реБрд╕реНрдд рдЪреИрдирд▓реЛрдВ рдореЗрдВ рд░реЛрдбрдореИрдк рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реВрдВрдЧрд╛ред рд╣рдо рдЬрд▓реНрдж рд╣реА рдХрд┐рд╕реА рднреА рд╕рдордп рдЕрд╡рд░реБрджреНрдз рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛)ред
рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛!
https://github.com/pytorch/pytorch/issues/28619 . рдХреЗ рдЕрдВрджрд░ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреНрд░рдЧрддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
BTW рд╣рдореЗрдВ рдХреЗрд╡рд▓
layout
рдЪрд┐рдкрдХреЗ рд░рд╣рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреНрдпреЛрдВ рдмрдирд╛рдиреА рд╣реИ? рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд┐рд░рд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ "рдЪреИрдирд▓_рд▓рд╛рд╕реНрдЯ" рдЬреИрд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВmemory_formats * layouts
рдЙрддреНрдкрд╛рдж рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (layouts
рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ ), рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓memory_format + layouts
рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрд╕реА рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рд╣рдо рдХрд░рддреЗ рдереЗ? рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рджреЛрдиреЛрдВ рдЫреЛрдЯреЗ, рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдПрдХ рд╣рдЬрд╛рд░ рддрд░реНрдХреЛрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рджреЗрдВрдЧреЗред