DML_SLICE_GRAD_OPERATOR_DESC
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| InputGradientTensor | DML_TENSOR_DESC* | 8/4 | +0 | +0 | 入力される勾配テンソルです。通常は、直前の層の逆伝播の出力から得られます。一般に、このテンソルは順伝播における対応する DML_SLICE1_OPERATOR_DESC の出力と同じサイズになります。 |
| OutputGradientTensor | DML_TENSOR_DESC* | 8/4 | +8 | +4 | 逆伝播された勾配を格納する出力テンソルです。一般に、このテンソルは順伝播における対応する DML_SLICE1_OPERATOR_DESC の入力と同じサイズになります。 |
| DimensionCount | DWORD | 4 | +16 | +8 | InputWindowOffsets、InputWindowSizes、InputWindowStrides の各配列の要素数です。この値は、InputGradientTensor および OutputGradientTensor で指定された DimensionCount と等しくなければなりません。 |
| InputWindowOffsets | DWORD* | 8/4 | +24 | +12 | DML_SLICE1_OPERATOR_DESC の InputWindowOffsets を参照してください。 |
| InputWindowSizes | DWORD* | 8/4 | +32 | +16 | DML_SLICE1_OPERATOR_DESC の InputWindowSizes を参照してください。 |
| InputWindowStrides | INT* | 8/4 | +40 | +20 | DML_SLICE1_OPERATOR_DESC の InputWindowStrides を参照してください。 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 公式リファレンス: 英語 (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 Structureimport 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: pointerstruct 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