Win32 API 日本語リファレンス
ホームAI.MachineLearning.DirectML › DML_SLICE_GRAD_OPERATOR_DESC

DML_SLICE_GRAD_OPERATOR_DESC

構造体
サイズx64: 48 バイト / x86: 24 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
InputGradientTensorDML_TENSOR_DESC*8/4+0+0入力される勾配テンソルです。通常は、直前の層の逆伝播の出力から得られます。一般に、このテンソルは順伝播における対応する DML_SLICE1_OPERATOR_DESC出力と同じサイズになります。
OutputGradientTensorDML_TENSOR_DESC*8/4+8+4逆伝播された勾配を格納する出力テンソルです。一般に、このテンソルは順伝播における対応する DML_SLICE1_OPERATOR_DESC入力と同じサイズになります。
DimensionCountDWORD4+16+8InputWindowOffsetsInputWindowSizesInputWindowStrides の各配列の要素数です。この値は、InputGradientTensor および OutputGradientTensor で指定された DimensionCount と等しくなければなりません。
InputWindowOffsetsDWORD*8/4+24+12DML_SLICE1_OPERATOR_DESCInputWindowOffsets を参照してください。
InputWindowSizesDWORD*8/4+32+16DML_SLICE1_OPERATOR_DESCInputWindowSizes を参照してください。
InputWindowStridesINT*8/4+40+20

DML_SLICE1_OPERATOR_DESCInputWindowStrides を参照してください。

DML_SLICE1_OPERATOR_DESC とは異なり、この演算子では 0 以外のストライドが必要である点に注意してください。ストライドが 0 の場合、どの入力要素が各出力要素に対応するのかがあいまいになり、逆伝播を実行できないためです。DML_SLICE1_OPERATOR_DESC と同様に、負のストライドはその軸に沿った入力ウィンドウの方向を反転させます。

公式ドキュメント

Slice(DML_SLICE1_OPERATOR_DESC を参照)の逆伝播勾配を計算します。

DML_SLICE1_OPERATOR_DESC は入力テンソルの部分領域を抽出する演算子です。同等の DML_SLICE1_OPERATOR_DESC出力と同じサイズを持つ InputGradientTensor を与えると、この演算子は DML_SLICE1_OPERATOR_DESC入力と同じサイズを持つ OutputGradientTensor を生成します。スライスされた要素は出力に伝播され、それ以外のすべての要素は 0 に設定されます。

例として、テンソルから次の要素を抽出する DML_SLICE1_OPERATOR_DESC を考えます。

InputTensor            OutputTensor
[[a, b, c, d],
 [e, f, g, h],   Slice   [[a, c],
 [i, j, k, l],    -->     [i, k]]
 [m, n, o, p]]

上記の例と同じ InputWindowOffsets/Sizes/Strides を指定した場合、この演算子は次の変換を実行します。

InputGradientTensor       OutputGradientTensor
                             [[a, 0, c, 0],
      [[a, c],   SliceGrad    [0, 0, 0, 0],
       [i, k]]      -->       [i, 0, k, 0],
                              [0, 0, 0, 0]]
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// DML_SLICE_GRAD_OPERATOR_DESC  (x64 48 / x86 24 バイト)
typedef struct DML_SLICE_GRAD_OPERATOR_DESC {
    DML_TENSOR_DESC* InputGradientTensor;
    DML_TENSOR_DESC* OutputGradientTensor;
    DWORD DimensionCount;
    DWORD* InputWindowOffsets;
    DWORD* InputWindowSizes;
    INT* InputWindowStrides;
} DML_SLICE_GRAD_OPERATOR_DESC;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DML_SLICE_GRAD_OPERATOR_DESC
{
    public IntPtr InputGradientTensor;
    public IntPtr OutputGradientTensor;
    public uint DimensionCount;
    public IntPtr InputWindowOffsets;
    public IntPtr InputWindowSizes;
    public IntPtr InputWindowStrides;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DML_SLICE_GRAD_OPERATOR_DESC
    Public InputGradientTensor As IntPtr
    Public OutputGradientTensor As IntPtr
    Public DimensionCount As UInteger
    Public InputWindowOffsets As IntPtr
    Public InputWindowSizes As IntPtr
    Public InputWindowStrides As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class DML_SLICE_GRAD_OPERATOR_DESC(ctypes.Structure):
    _fields_ = [
        ("InputGradientTensor", ctypes.c_void_p),
        ("OutputGradientTensor", ctypes.c_void_p),
        ("DimensionCount", wintypes.DWORD),
        ("InputWindowOffsets", ctypes.c_void_p),
        ("InputWindowSizes", ctypes.c_void_p),
        ("InputWindowStrides", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct DML_SLICE_GRAD_OPERATOR_DESC {
    pub InputGradientTensor: *mut core::ffi::c_void,
    pub OutputGradientTensor: *mut core::ffi::c_void,
    pub DimensionCount: u32,
    pub InputWindowOffsets: *mut core::ffi::c_void,
    pub InputWindowSizes: *mut core::ffi::c_void,
    pub InputWindowStrides: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type DML_SLICE_GRAD_OPERATOR_DESC struct {
	InputGradientTensor uintptr
	OutputGradientTensor uintptr
	DimensionCount uint32
	InputWindowOffsets uintptr
	InputWindowSizes uintptr
	InputWindowStrides uintptr
}
type
  DML_SLICE_GRAD_OPERATOR_DESC = record
    InputGradientTensor: Pointer;
    OutputGradientTensor: Pointer;
    DimensionCount: DWORD;
    InputWindowOffsets: Pointer;
    InputWindowSizes: Pointer;
    InputWindowStrides: Pointer;
  end;
const DML_SLICE_GRAD_OPERATOR_DESC = extern struct {
    InputGradientTensor: ?*anyopaque,
    OutputGradientTensor: ?*anyopaque,
    DimensionCount: u32,
    InputWindowOffsets: ?*anyopaque,
    InputWindowSizes: ?*anyopaque,
    InputWindowStrides: ?*anyopaque,
};
type
  DML_SLICE_GRAD_OPERATOR_DESC {.bycopy.} = object
    InputGradientTensor: pointer
    OutputGradientTensor: pointer
    DimensionCount: uint32
    InputWindowOffsets: pointer
    InputWindowSizes: pointer
    InputWindowStrides: pointer
struct DML_SLICE_GRAD_OPERATOR_DESC
{
    void* InputGradientTensor;
    void* OutputGradientTensor;
    uint DimensionCount;
    void* InputWindowOffsets;
    void* InputWindowSizes;
    void* InputWindowStrides;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; DML_SLICE_GRAD_OPERATOR_DESC サイズ: 24 バイト(x86)
dim st, 6    ; 4byte整数×6(構造体サイズ 24 / 4 切り上げ)
; InputGradientTensor : DML_TENSOR_DESC* (+0, 4byte)  varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; OutputGradientTensor : DML_TENSOR_DESC* (+4, 4byte)  varptr(st)+4 を基点に操作(4byte:入れ子/配列)
; DimensionCount : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; InputWindowOffsets : DWORD* (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; InputWindowSizes : DWORD* (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; InputWindowStrides : INT* (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DML_SLICE_GRAD_OPERATOR_DESC サイズ: 48 バイト(x64)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; InputGradientTensor : DML_TENSOR_DESC* (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; OutputGradientTensor : DML_TENSOR_DESC* (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; DimensionCount : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; InputWindowOffsets : DWORD* (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; InputWindowSizes : DWORD* (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; InputWindowStrides : INT* (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global DML_SLICE_GRAD_OPERATOR_DESC
    #field intptr InputGradientTensor
    #field intptr OutputGradientTensor
    #field int DimensionCount
    #field intptr InputWindowOffsets
    #field intptr InputWindowSizes
    #field intptr InputWindowStrides
#endstruct

stdim st, DML_SLICE_GRAD_OPERATOR_DESC        ; NSTRUCT 変数を確保
st->DimensionCount = 100
mes "DimensionCount=" + st->DimensionCount