Pytorch: [рдЖрд░рдПрдлрд╕реА] рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк (рдЙрд░реНрдл рд▓реЗрдЖрдЙрдЯ рдЙрд░реНрдл тАЛтАЛрдПрдирдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА) рд╕рдорд░реНрдерди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдЕрдкреНрд░реИрд▓ 2019  ┬╖  68рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pytorch/pytorch

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг

рд╕реАрдПрдирдПрди рдСрдкрд░реЗрдЯрд░ рдЯреЗрдВрд╕рд░ рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╡рд┐рд╣рд┐рдд рдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд░реНрде рдЕрд░реНрде рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЖрдЬ PyTorch рдореЗрдВ 2D рдХреЗрд╕ рдХреЗ рд▓рд┐рдП рдЯреЙрд░реНрдЪ.nn.Conv2d рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ NCHW рдХреНрд░рдо рдореЗрдВ 4d рдЯреЗрдВрд╕рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП -.

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

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • рдПрдирдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА рдореЗрдВ рд╡реЛрд▓реНрдЯрд╛ рдкрд░ рдХреБрдбрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рддреЗрдЬ рд╣реИ
  • fbgemm рдФрд░ qnnpack NCHW рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
  • libxsmm NCHW рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдЬреБрд░реНрдорд╛рдирд╛ 50% (IIRC) рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИред

рдЪреБрдиреМрддреА рдпрд╣ рд╣реИ рдХрд┐ рдЖрдпрд╛рдо рдХреНрд░рдо рдХреЛ рдмрджрд▓рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрдм рдХрдИ рд╕реАрдПрдирдПрди рд╕рдВрдЪрд╛рд▓рди рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ conv(relu(conv))) ) рдПрдХ рдмрд╛рд░ рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрджрд▓рдирд╛, рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдлрд╛рдпрджреЗрдордВрдж

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

рд╣рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:

  • рд╡рд┐рднрд┐рдиреНрди рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдЯреЗрдВрд╕рд░ (рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдмрд╕ рдЖрдпрд╛рдо рдХреНрд░рдо) PyTorch рдореЗрдВ Eager рдФрд░ JIT рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдЕрд╡рд░реБрджреНрдз рд▓реЗрдЖрдЙрдЯ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЕрдЪреНрдЫреЗ рд╣реИрдВред
  • рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдЬрд░-рдПрдХреНрд╕рдкреЛрдЬреНрдб рдПрдкреАрдЖрдИ
  • рдХреЛрд░ рд╕реАрдПрдирдПрди рдСрдкрд░реЗрд╢рдВрд╕ рд╡рд┐рднрд┐рдиреНрди рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдФрд░ рддреЗрдЬреА рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд░реВрдЯрд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
  • 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 (рдХрдо рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП)
  • 1D рдЗрдореЗрдЬ / 3D рдЯреЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП рдорд╛рдиреЛрдВ рдХрд╛ рдорддрд▓рдм NCW, NWC, 2D рдЗрдореЗрдЬ рдХреЗ рд▓рд┐рдП / 4D рдЯреЗрдВрд╕рд░ - NCHW, NHWC, 3D рдЗрдореЗрдЬ / 5D рдЯреЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП - NCDHW, NDHWC рд╣реИ

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) рд▓реМрдЯрд╛рддрд╛ рд╣реИ

рд╕рдВрдЪрд╛рд▓рди рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:

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

    • NHWC + рдЕрджрд┐рд╢ тЖТ NHWC

    • NHWC + рдХреЙрд▓рдо рд╡реЗрдХреНрдЯрд░ тЖТ NHWC

  • рдХреЛрд░ рд╕реАрдПрдирдПрди рдСрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдмреИрдХрд╡рд░реНрдб рдСрдкрд░реЗрд╢рдВрд╕ рдЙрд╕реА рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдлреЙрд░рд╡рд░реНрдб рдкрд╛рде рдореЗрдВред (рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЧреНрд░реЗрдбрд┐рдпреЗрдВрдЯ рд╡рд┐рднрд┐рдиреНрди рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)

рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдПрдХ рдЯреЗрдВрд╕рд░ рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдХреНрд░рдорд╛рдВрдХрди/рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдЯреЗрдВрд╕рд░ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ)ред

рдХреНрд░рдорд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

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()

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ :

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

рд╡рд┐рдкрдХреНрд╖ :

  • .contiguous() рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ NCHW рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдФрд░ рдпрд╣ рджреБрд░реНрдШрдЯрдирд╛рд╡рд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рдХрд┐рд╕реА рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

    • рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдСрдбрд┐рдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

  • рдЕрд╡рд░реБрджреНрдз/рдЯрд╛рдЗрд▓ рд╡рд╛рд▓реЗ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ - рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЬрд░реВрд░рдд рд╣реИ

    • PyTorch рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдирд╛рдЧрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд╣реИ

    • рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реИрдВрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП MKLDNN рдЯреЗрдВрд╕рд░

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

рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдордВрд╢рд╛ рдХреЗ рд╕рд╛рде рд╣реИ ред рдпрд╣ рднреЗрдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдкреНрд░рд╛рд░реВрдк рдпрд╛ рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдЪрд╛рд╣рддрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВ, рдмрд╕ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдореМрдЬреВрджрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдУрд░ рдЬрд╛рддрд╛

рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдЯреЗрдВрд╕рд░ рдкрд░ "рд╕реЙрдлреНрдЯ" рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдЯреИрдЧ рдкреЗрд╢ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЯреЗрдВрд╕рд░ рдкрд░ рдХрд┐рдП рдЧрдП рдЕрдВрддрд┐рдо 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

рдкреНрд░рджрд░реНрд╢рди рдЯреВрд▓реАрдВрдЧ

рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП:

  • рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЗрдореЛрд░реА рд░реАрдСрд░реНрдбрд░рд┐рдВрдЧ рдХрд╣рд╛рдБ рд╣реЛрддреА рд╣реИ - рдпрд╛рдиреА .contiguous () рдХреЛ рдХреЙрд▓ рдЯреНрд░реИрдХ рдХрд░реЗрдВ
  • рдЯреНрд░реИрдХрд┐рдВрдЧ рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
  • рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░рдирд╛ рдЬреИрд╕реЗ рдмрд╛рдЗрдирд░реА рдСрдкреНрд╕ (рдЬрд╣рд╛рдВ "рд╕реЙрдлреНрдЯ" рдПрдиреЛрдЯреЗрд╢рди рдЙрдкрдпреЛрдЧреА рд╣реИ)

рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдСрди-рдбрд┐рдорд╛рдВрдб рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдЯреВрд▓ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдСрдЯреЛрдЧреНрд░реИрдб рд╣реИрдВрдбрд▓рд┐рдВрдЧ

рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдкрд┐рдЫрдбрд╝рд╛ рдкрд╛рд╕ рдЖрдЧреЗ рдХреЗ рд╕рдорд╛рди рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдлреЙрд░рд╡рд░реНрдб рдкрд╛рд╕ рдХреЛ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣рдЪрд╛рдирдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕реЗ рдСрдЯреЛрдЧреНрд░реИрдб рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдмреИрдХрд╡рд░реНрдб рдлрдВрдХреНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЧреНрд░реЗрдб рдЯреЗрдВрд╕рд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

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(...)

JIT . рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡

рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ:

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

рдкреНрд░рд╡рд░реНрддрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо assert x.is_contiguous(channels_last) рдЬреИрд╕реЗ рдХрдердиреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдкрд░реЗ: рдЕрд╡рд░реБрджреНрдз рд▓реЗрдЖрдЙрдЯ

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

  • рдХрд╕реНрдЯрдо рд╕реА рдкреНрд░рдХрд╛рд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЬреИрд╕реЗ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ред рдпрд╣ рдЕрдиреБрдорд╛рди рдореЗрдВ рдкреИрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЪреБрдирдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрд╣рд╛рдВ рдкреВрд░реНрдгрддрд╛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╡рд┐рдзрддрд╛ рдЕрдзрд┐рдХ рд╣реИ
  • рдЗрд╕ рдирдП рдкреНрд░рдХрд╛рд░ рдкрд░ рдмрд╛рдзреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХреБрдЫ (рд▓реЗрдХрд┐рди рд╕рднреА рдирд╣реАрдВ) рдХреЗ рд╕рд╛рде MKLDNNTensor рдЬреИрд╕реЗ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдЯреЗрдВрд╕рд░ рдкреНрд░рдХрд╛рд░

рдлрд┐рд░ рднреА рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреЛрд░ 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 рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд╣реИ)ред

рдЗрд╕ рдЙрддреНрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВ:

  • рд╡рд┐рдХрд▓реНрдк рдП - рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ (рдКрдкрд░ рдкреНрд░рд╕реНрддреБрдд)ред рдЯреЗрдВрд╕рд░ рд▓реЗрдЖрдЙрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдЬреИрд╕реЗ рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    • .size(1) рдореБрдЭреЗ "рдЪреИрдирд▓" рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдВрддрд░рд┐рдХ рдореЗрдореЛрд░реА рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ

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

    • рд╡рд┐рдкрдХреНрд╖: рдкреНрд░рдЧрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрдИ рдСрдкрд░реЗрдЯрд░ .contiguous() рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЧрд▓рддреА рд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

    • рд╡рд┐рдкрдХреНрд╖: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐ рдСрдк рд░рд┐рдЯрд░реНрди рдХреА рдЧрд╛рд░рдВрдЯреА рдХреНрдпрд╛ рд╕рд░реНрд╡реЛрдкрд░рд┐ рд╣реИред рдпрд╣ IMO рд╕реНрдЯреНрд░рд╛рдЗрдб-рдУрдирд▓реА рдЕрдкреНрд░реЛрдЪ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдСрдк рдХреЛ рдХрд┐рд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдкреАрдЖрдИ рдирд╣реАрдВ рд╣реИ рдХрд┐ "рдореЗрд░реА рдкреНрд░рдЧрддрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ NCHW- рд╕рдиреНрдирд┐рд╣рд┐рдд рдЪреАрдЬрд╝ рд▓реМрдЯрд╛рдПрдВред" рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рд╕реАрдорд╛рдУрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИред

  • рд╡рд┐рдХрд▓реНрдк рдмреА - рд╕реНрдкрд╖реНрдЯ NHWC рдЯреЗрдВрд╕рд░ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯреЗрдВрд╕рд░ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдпрд╛рдо рдХреНрд░рдо рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЯреЗрдВрд╕рд░ рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рд╕реНрддрд░ рдкрд░ рдХреБрдЫ рдПрдиреЛрдЯреЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

    • .size(1) "рдКрдВрдЪрд╛рдИ" рд▓реМрдЯрд╛рддрд╛ рд╣реИ

    • рд╕рдорд░реНрдердХ: рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВ рдФрд░ рдмрд╣реБрдд рдЕрдиреБрдорд╛рдирд┐рдд

    • рд╡рд┐рдкрдХреНрд╖: рдПрдХ рд▓реЗрдЖрдЙрдЯ рд╕реЗ рджреВрд╕рд░реЗ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдореЙрдбрд▓ рдмрджрд▓рдирд╛ рдПрдХ рдЬрдЯрд┐рд▓ рдСрдкрд░реЗрд╢рди рдмрди рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ .size() рдФрд░ .reshape() рддрдХ рд╕рднреА рдПрдХреНрд╕реЗрд╕ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдпрд╛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдкреАрдЖрдИ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?)

  • рд╡рд┐рдХрд▓реНрдк рдмреА' - рд▓реЗрдЖрдЙрдЯ рдлреНрд▓реИрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рдПрдирдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА рдЯреЗрдВрд╕рд░ ред рдКрдкрд░ рдЬреИрд╕рд╛ рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЯреЗрдВрд╕рд░ рдХреЛ рдПрдиреЛрдЯреЗрд╢рди рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЗрд╕рдХреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рдСрдкреНрд╕ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЙрдкрднреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рддрдм рдСрдкрд░реЗрдЯрд░ рд╕реНрддрд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдПрдХ рдСрдкрд░реЗрдЯрд░ рдЗрдирдкреБрдЯ рдХреЗ рд▓реЗрдЖрдЙрдЯ рдзреНрд╡рдЬ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рд╡рд┐рдХрд▓реНрдк рд╕реА - рдирд╛рдорд╛рдВрдХрд┐рдд рдЯреЗрдВрд╕рд░ ред ( https://docs.google.com/document/d/1ynu3wA2hcjwOtEng04N904gJjEbZWcINXO_ardX6hxc/edit#heading =h.2gbe5xpga3w9)

    • .size(1) "рдКрдВрдЪрд╛рдИ" рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рд▓реЛрдЧреЛрдВ рд╕реЗ рдЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп .size('channel') рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред

    • рдкреНрд░реЛ: рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ

    • con: рд╕рдВрдХреНрд░рдордг рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдЬрд╛рдЧрд░реВрдХрддрд╛ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреЗ рдЧрдП рд╕рднреА рдХреЛрдб рдХреЛ рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрджрд┐ рдирд╣реАрдВ - рдКрдкрд░ рдХреА рддрд░рд╣ рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ

  • рд╡рд┐рдХрд▓реНрдк рдбреА - рд▓реЗрдЖрдЙрдЯ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдЯреЗрдВрд╕рд░ рдкреНрд░рдХрд╛рд░ рд╣реИ ред NHWC рдХреЗ рд╕рд╛рде рд╡реИрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ рдЬреИрд╕рд╛ рд╣рдо MKLDNN рдпрд╛ SparseTensor рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ - рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рд╕реНрдкреИрдЪрдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рдЯреЗрдВрд╕рд░ рдкреНрд░рдХрд╛рд░ред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдП рдХреА рддрд░рд╣ рд╣реИ рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреНрд░реЗрдбрдСрдл рдХреЗ рд╕рд╛рде - рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдСрдкреНрд╕ рдПрдирд╕реАрдПрдЪрдбрдмреНрд▓реНрдпреВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

    • .size(1) рдЕрднреА рднреА "рдЪреИрдирд▓" рд▓реМрдЯрд╛рддрд╛ рд╣реИ

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

    • рд╕рдорд░реНрдердХ/рд╡рд┐рдкрдХреНрд╖: рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдЖрдЙрдЯ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрджрд┐ рдХреБрдЫ рд╕реЗрд╢рди рдЧрд╛рдпрдм рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА рдХрд┐ рдпрд╣ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ

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

internals mkldnn triaged

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

BTW рд╣рдореЗрдВ рдХреЗрд╡рд▓ layout рдЪрд┐рдкрдХреЗ рд░рд╣рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреНрдпреЛрдВ рдмрдирд╛рдиреА рд╣реИ? рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд┐рд░рд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ "рдЪреИрдирд▓_рд▓рд╛рд╕реНрдЯ" рдЬреИрд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ memory_formats * layouts рдЙрддреНрдкрд╛рдж рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ( layouts рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ ), рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ memory_format + layouts рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрд╕реА рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рд╣рдо рдХрд░рддреЗ рдереЗ? рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рджреЛрдиреЛрдВ рдЫреЛрдЯреЗ, рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдПрдХ рд╣рдЬрд╛рд░ рддрд░реНрдХреЛрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рджреЗрдВрдЧреЗред

рд╕рднреА 68 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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 :

рдЖрдХрд╛рд░ рдореЗрдВ (рдПрди, рд╕реА, рдПрдЪ, рдбрдмреНрд▓реНрдпреВ)
рднреМрддрд┐рдХ рдХреНрд░рдо рдореЗрдВ рдХрджрдо , рдЕрд░реНрдерд╛рддреН

  • (n, c, h, w) рдХреЗ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдпрджрд┐ рдкреНрд░рд╛рд░реВрдк nchw . рд╣реИ
  • (n, h, w, c) рдХреЗ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдпрджрд┐ рдкреНрд░рд╛рд░реВрдк nhwc рд╣реИред

stride_indexes рдирдХреНрд╢реЗ nchw рдЖрдХрд╛рд░ рдХреА рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВ:

  • (0, 1, 2, 3) рдпрджрд┐ рдкреНрд░рд╛рд░реВрдк nchw рд╣реИ,
  • (0, 2, 3, 1) рдпрджрд┐ рдкреНрд░рд╛рд░реВрдк nhwc рд╣реИред

рдПрдирд╕реАрдПрдЪрдбрдмреНрд▓реНрдпреВ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИред рдПрдирдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред

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 рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИред рдХреНрдпрд╛ рдпрд╣ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реИ?

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдордЭрдирд╛ рдХрдард┐рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдмреЛрд▓рдЪрд╛рд▓ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджреЛрдВ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╕рдЯреАрдХрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдиреЗ рдЬреЛ рдХрд╣рд╛ рд╣реИ рдЙрд╕рдХреА рдореИрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

  • рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ "nhwc" рдЯреЗрдВрд╕рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, "рдЯреЗрдиреНрд╕рд░ рдЬрд┐рд╕рдХрд╛ рднреМрддрд┐рдХ рд▓реЗрдЖрдЙрдЯ NHWC рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдЯреНрд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рддрд╛рд░реНрдХрд┐рдХ рд▓реЗрдЖрдЙрдЯ NCHW рд╣реЛред"
  • "рдПрдХ (рдЯреЗрдиреНрд╕рд░ рдЬрд┐рд╕рдХрд╛ рд▓реЙрдЬрд┐рдХрд▓ рд▓реЗрдЖрдЙрдЯ рдПрдирд╕реАрдПрдЪрдбрдмреНрд▓реНрдпреВ рд╣реИ) рдЯреЗрдВрд╕рд░ рдЯреВ (рд▓реЙрдЬрд┐рдХрд▓ рд▓реЗрдЖрдЙрдЯ) рдПрдирдбрдмреНрд▓реНрдпреВрдПрдЪрд╕реА" рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП y = x.permute(0, 2, 3, 1) рдЪрд▓рд╛рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд▓реЙрдЬрд┐рдХрд▓ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рднреМрддрд┐рдХ рд▓реЗрдЖрдЙрдЯ рдирд╣реАрдВред (рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХрд╛ рдорддрд▓рдм рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреА рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЖрдкрдиреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди x.permute(0, 3, 1, 2) рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛
  • рдЗрд╕рдХреЗ рдмрд╛рдж (рддрд╛рд░реНрдХрд┐рдХ рд▓реЗрдЖрдЙрдЯ) NWHC рдЯреЗрдВрд╕рд░ рдХреЛ (рддрд╛рд░реНрдХрд┐рдХ рд▓реЗрдЖрдЙрдЯ) рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП NHWC рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди z = y.permute(0, 2, 3, 1) ред рддреЛ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЯреЗрдВрд╕рд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рддрд╛рд░реНрдХрд┐рдХ рд▓реЗрдЖрдЙрдЯ рднреМрддрд┐рдХ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо z.contiguous() рдкреВрдЫреЗрдВ рддреЛ рд╣рдореЗрдВ рд╕рдЪ рдорд┐рд▓реЗрдЧрд╛ (рдФрд░, рднреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ, z.contiguous(memory_layout=NCHW) рднреА рд╕рдЪ рд╣реЛрдЧрд╛ред) рд▓реЗрдХрд┐рди рдпрд╣ NHWC рд╕рдиреНрдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╣ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдерд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ "рдкрд░рдореНрдпреВрдЯ" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред

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

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

@dzhulgakov

рд╕рдВрдЪрд╛рд▓рди рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ

рдпрджрд┐ рднреМрддрд┐рдХ NHWC рдЯреЗрдВрд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ BC-рдмреНрд░реЗрдХрд┐рдВрдЧ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдЯреИрдЧ рдХреЗ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдЕрд░реНрде рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реИред) рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рдХреЗ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред

рдпрджрд┐ рднреМрддрд┐рдХ NHWC рдЯреЗрдВрд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ BC-рдмреНрд░реЗрдХрд┐рдВрдЧ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдЯреИрдЧ рдХреЗ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдЕрд░реНрде рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реИред) рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рдХреЗ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ 'рд╕реНрдЯрд┐рдХреА' рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдСрдк рдУрд╡рд░ рдореЗрдореЛрд░реА рдлреЙрд░рдореЗрдЯреЗрдб рдЯреЗрдВрд╕рд░ рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХрд┐рдП рдЧрдП рдЯреЗрдВрд╕рд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред рдЗрд╕рд╕реЗ рдмреАрд╕реА рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

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

@ezyang рдУрд╣ рдореИрдВрдиреЗ рдЕрднреА рдкрд╛рдпрд╛ рдХрд┐ рдореЗрд░реЗ рдЙрдкрд░реЛрдХреНрдд рдЙрддреНрддрд░ рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдкреЛ рд╣реИред (рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рднреА рд╕рд╣реА рд╣реИред) рдореБрдЭреЗ рдЗрд╕реЗ рдиреАрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрди: рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рджреЗрдВ:

  1. рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ NCHW рдЯреЗрдВрд╕рд░ (рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ, рд╕рдиреНрдирд┐рд╣рд┐рдд) рд╣реИред
  2. рдлрд┐рд░ рдореИрдВ рдЗрд╕реЗ NWHC (рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реВрдВред
  3. рдореИрдВ рдЗрд╕реЗ рдПрдирдПрдЪрдбрдмреНрд▓реНрдпреВрд╕реА рдХреЛ рдПрдХ рд╕рдиреНрдирд┐рд╣рд┐рдд() рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
  4. рдЗрд╕реЗ NHWC (рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪрд░рдг 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 рдХреЗ рд░реВрдк рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рдХреНрд░рдо

рджреЛ рд╕рд╡рд╛рд▓:

  • рдпрджрд┐ NHWC рдЯреЗрдВрд╕рд░ рдХреЛ NCHW рдЯреЗрдВрд╕рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
  • рдПрдХ рдЯреЗрдВрд╕рд░ рдкрд░ t.channel_dim () рдЬреИрд╕реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдХрд░ (рдмреА) рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдпрд╛рдо рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдХрд╣рд╛рдВ рд╣реИ? рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд┐рдирд╛ рдмреНрд▓реЙрдХ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдЬреИрд╕реЗ рдЕрдиреНрдп рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

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

@ 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) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рд╢рд┐рдХрд╛рдпрддреЗрдВ рдереАрдВ, рдФрд░ рд╣рдордиреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

  1. .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 рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ; рдФрд░ рдЕрдиреНрдпрдерд╛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

  2. .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) рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдкрд░ рдЯреЗрдВрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрд╛рдж рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рдПрдЧреАред

2 рдЪрд░рдг

рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░реЗрдВ:

  1. рдпреВрдирд░реА рддрддреНрд╡-рд╡рд╛рд░ рдСрдкрд░реЗрдЯрд░ 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
    
  2. рдмрд╛рдЗрдирд░реА рддрддреНрд╡-рд╡рд╛рд░ рдСрдкрд░реЗрдЯрд░ ( 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
    
  3. рд╕рд╛рдЗрдЬрд╝, рд╕реНрдЯреНрд░рд╛рдЗрдбреНрд╕ рдФрд░ рдбрд┐рдореНрд╕ рдСрд░реНрдбрд░ рдкрд░ рдХреЛрдИ рднреА рдСрдкрд░реЗрд╢рди рдореЗрдореЛрд░реА рдлреЙрд░реНрдореЗрдЯ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

    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
    

рдЕрдирд┐рд░реНрдгреАрдд рд░рд╣рддрд╛ рд╣реИ

  1. рдпрджрд┐ рдЖрдЙрдЯрдкреБрдЯ 'рдЪреИрдирд▓_рд▓рд╛рд╕реНрдЯ' рд╕реБрдкрд╛рдареНрдп рд╣реИ, рддреЛ рд░реАрд╢реЗрдк (рдФрд░ рд╕рдорд╛рди) рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо

    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 рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ

  2. 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 рдХрд░реНрдиреЗрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдиреНрдирд┐рд╣рд┐рдд рдЯреЗрдВрд╕рд░ рдХреЗ рдкреБрдирд░реНрд╡рд┐рдХреНрд░рдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
  • рдЕрдЧрд▓реЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЗрдирдкреБрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ (рд╕рдиреНрдирд┐рд╣рд┐рдд рдореЗрдВ) рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ nhwc=True рд╡рд┐рдХрд▓реНрдк рднреА рди рд╣реЛред
  • рдкреВрд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ NHWC рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЛ nhwc=True рд╡рд┐рдХрд▓реНрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдкреБрдирд╢реНрдЪ. рдпрджрд┐ рдЖрдк CudNN Ex рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ, рддреЛ рд╣рдо cudnn_batch_norm_nhwc рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдмреЗрдирдХрд╛рдм рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╣рд╛рдп @VitalyFedyunin , рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рдХреЛ PyTorch 1.3 рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрдпрд╛ рдпрд╣ NHWC (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрд╡рд░реБрджреНрдз) рдкреНрд░рд╛рд░реВрдк рд╕рдорд░реНрдерди рдкрд░ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╣рд▓ (рдпрд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓) рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдирд╛рдорд┐рдд рдЯреЗрдВрд╕рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ NHWC рд░рд╛рдЬреНрдп рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

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

рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛!

https://github.com/pytorch/pytorch/issues/28619 . рдХреЗ рдЕрдВрджрд░ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреНрд░рдЧрддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

mishraswapnil picture mishraswapnil  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

soumith picture soumith  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rajarshd picture rajarshd  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cdluminate picture cdluminate  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

negrinho picture negrinho  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ