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

DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC

構造体
サイズx64: 128 バイト / x86: 64 バイト

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

フィールド

フィールドサイズx64x86説明
InputTensorDML_TENSOR_DESC*8/4+0+0入力データを格納するテンソルです。InputTensor に想定される次元は { InputBatchCount, InputChannelCount, InputHeight, InputWidth } です。
InputScaleTensorDML_TENSOR_DESC*8/4+8+4

入力のスケールデータを格納するテンソルです。InputScaleTensor に想定される次元は { 1, 1, 1, 1 } です。このスケール値は、入力値の逆量子化に使用されます。

メモ

スケール値が 0 の場合、動作は未定義になります。

InputZeroPointTensorDML_TENSOR_DESC*8/4+16+8入力のゼロ点データを格納する省略可能なテンソルです。InputZeroPointTensor に想定される次元は { 1, 1, 1, 1 } です。このゼロ点の値は、入力値の逆量子化に使用されます。
FilterTensorDML_TENSOR_DESC*8/4+24+12フィルターデータを格納するテンソルです。FilterTensor に想定される次元は { FilterBatchCount, FilterChannelCount, FilterHeight, FilterWidth } です。
FilterScaleTensorDML_TENSOR_DESC*8/4+32+16

フィルターのスケールデータを格納するテンソルです。FilterScaleTensor に想定される次元は、テンソル単位の量子化が必要な場合は { 1, 1, 1, 1 }、チャネル単位の量子化が必要な場合は { 1, OutputChannelCount, 1, 1 } です。このスケール値は、フィルター値の逆量子化に使用されます。

メモ

スケール値が 0 の場合、動作は未定義になります。

FilterZeroPointTensorDML_TENSOR_DESC*8/4+40+20フィルターのゼロ点データを格納する省略可能なテンソルです。FilterZeroPointTensor に想定される次元は、テンソル単位の量子化が必要な場合は { 1, 1, 1, 1 }、チャネル単位の量子化が必要な場合は { 1, OutputChannelCount, 1, 1 } です。このゼロ点の値は、フィルター値の逆量子化に使用されます。
BiasTensorDML_TENSOR_DESC*8/4+48+24バイアスデータを格納するテンソルです。バイアステンソルは、畳み込みの最後に出力テンソル全体へブロードキャストされ、結果に加算されるデータを格納するテンソルです。BiasTensor に想定される次元は、4D の場合 { 1, OutputChannelCount, 1, 1 } です。
OutputScaleTensorDML_TENSOR_DESC*8/4+56+28

出力のスケールデータを格納するテンソルです。OutputScaleTensor に想定される次元は { 1, 1, 1, 1 } です。この入力スケール値は、畳み込みの出力値の量子化に使用されます。

メモ

スケール値が 0 の場合、動作は未定義になります。

OutputZeroPointTensorDML_TENSOR_DESC*8/4+64+32フィルターのゼロ点データを格納する省略可能なテンソルです。OutputZeroPointTensor に想定される次元は { 1, 1, 1, 1 } です。この入力ゼロ点の値は、畳み込みの出力値の量子化に使用されます。
OutputTensorDML_TENSOR_DESC*8/4+72+36結果を書き込むテンソルです。OutputTensor に想定される次元は { OutputBatchCount, OutputChannelCount, OutputHeight, OutputWidth } です。
DimensionCountDWORD4+80+40畳み込み演算の空間次元の数です。空間次元とは、畳み込みフィルターテンソル FilterTensor の下位の次元を指します。この値は、StridesDilationsStartPaddingEndPadding の各配列のサイズも決定します。サポートされる値は 2 のみです。
StridesDWORD*8/4+88+44畳み込み演算のストライドです。これらのストライドは畳み込みフィルターに適用されます。これは DML_TENSOR_DESC に含まれるテンソルのストライドとは別のものです。
DilationsDWORD*8/4+96+48畳み込み演算のディレーションです。ディレーションは、フィルターカーネルの要素に適用されるストライドです。これにより、フィルターカーネルの内部要素を 0 で埋めることで、より大きなフィルターカーネルをシミュレートする効果が得られます。
StartPaddingDWORD*8/4+104+52畳み込み演算のフィルターおよび入力テンソルの各空間次元の先頭に適用されるパディング値です。
EndPaddingDWORD*8/4+112+56畳み込み演算のフィルターおよび入力テンソルの各空間次元の末尾に適用されるパディング値です。
GroupCountDWORD4+120+60畳み込み演算を分割するグループの数です。GroupCount に入力チャネル数と同じ値を設定することで、深さ方向の畳み込み (depth-wise convolution) を実現できます。これにより、畳み込みが入力チャネルごとの個別の畳み込みに分割されます。

公式ドキュメント

FilterTensorInputTensor の畳み込みを実行します。この演算子は、量子化されたデータに対して順方向の畳み込みを実行します。この演算子は、入力を逆量子化し、畳み込みを行い、その結果を量子化する処理と数学的に等価です。

この演算子で使用される量子化リニア関数は、次の線形量子化関数です。

逆量子化関数

f(Input, Scale, ZeroPoint) = (Input - ZeroPoint) * Scale

量子化関数

f(Input, Scale, ZeroPoint) = clamp(round(Input / Scale) + ZeroPoint, Min, Max)
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC  (x64 128 / x86 64 バイト)
typedef struct DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC {
    DML_TENSOR_DESC* InputTensor;
    DML_TENSOR_DESC* InputScaleTensor;
    DML_TENSOR_DESC* InputZeroPointTensor;
    DML_TENSOR_DESC* FilterTensor;
    DML_TENSOR_DESC* FilterScaleTensor;
    DML_TENSOR_DESC* FilterZeroPointTensor;
    DML_TENSOR_DESC* BiasTensor;
    DML_TENSOR_DESC* OutputScaleTensor;
    DML_TENSOR_DESC* OutputZeroPointTensor;
    DML_TENSOR_DESC* OutputTensor;
    DWORD DimensionCount;
    DWORD* Strides;
    DWORD* Dilations;
    DWORD* StartPadding;
    DWORD* EndPadding;
    DWORD GroupCount;
} DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC
{
    public IntPtr InputTensor;
    public IntPtr InputScaleTensor;
    public IntPtr InputZeroPointTensor;
    public IntPtr FilterTensor;
    public IntPtr FilterScaleTensor;
    public IntPtr FilterZeroPointTensor;
    public IntPtr BiasTensor;
    public IntPtr OutputScaleTensor;
    public IntPtr OutputZeroPointTensor;
    public IntPtr OutputTensor;
    public uint DimensionCount;
    public IntPtr Strides;
    public IntPtr Dilations;
    public IntPtr StartPadding;
    public IntPtr EndPadding;
    public uint GroupCount;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC
    Public InputTensor As IntPtr
    Public InputScaleTensor As IntPtr
    Public InputZeroPointTensor As IntPtr
    Public FilterTensor As IntPtr
    Public FilterScaleTensor As IntPtr
    Public FilterZeroPointTensor As IntPtr
    Public BiasTensor As IntPtr
    Public OutputScaleTensor As IntPtr
    Public OutputZeroPointTensor As IntPtr
    Public OutputTensor As IntPtr
    Public DimensionCount As UInteger
    Public Strides As IntPtr
    Public Dilations As IntPtr
    Public StartPadding As IntPtr
    Public EndPadding As IntPtr
    Public GroupCount As UInteger
End Structure
import ctypes
from ctypes import wintypes

class DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC(ctypes.Structure):
    _fields_ = [
        ("InputTensor", ctypes.c_void_p),
        ("InputScaleTensor", ctypes.c_void_p),
        ("InputZeroPointTensor", ctypes.c_void_p),
        ("FilterTensor", ctypes.c_void_p),
        ("FilterScaleTensor", ctypes.c_void_p),
        ("FilterZeroPointTensor", ctypes.c_void_p),
        ("BiasTensor", ctypes.c_void_p),
        ("OutputScaleTensor", ctypes.c_void_p),
        ("OutputZeroPointTensor", ctypes.c_void_p),
        ("OutputTensor", ctypes.c_void_p),
        ("DimensionCount", wintypes.DWORD),
        ("Strides", ctypes.c_void_p),
        ("Dilations", ctypes.c_void_p),
        ("StartPadding", ctypes.c_void_p),
        ("EndPadding", ctypes.c_void_p),
        ("GroupCount", wintypes.DWORD),
    ]
#[repr(C)]
pub struct DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC {
    pub InputTensor: *mut core::ffi::c_void,
    pub InputScaleTensor: *mut core::ffi::c_void,
    pub InputZeroPointTensor: *mut core::ffi::c_void,
    pub FilterTensor: *mut core::ffi::c_void,
    pub FilterScaleTensor: *mut core::ffi::c_void,
    pub FilterZeroPointTensor: *mut core::ffi::c_void,
    pub BiasTensor: *mut core::ffi::c_void,
    pub OutputScaleTensor: *mut core::ffi::c_void,
    pub OutputZeroPointTensor: *mut core::ffi::c_void,
    pub OutputTensor: *mut core::ffi::c_void,
    pub DimensionCount: u32,
    pub Strides: *mut core::ffi::c_void,
    pub Dilations: *mut core::ffi::c_void,
    pub StartPadding: *mut core::ffi::c_void,
    pub EndPadding: *mut core::ffi::c_void,
    pub GroupCount: u32,
}
import "golang.org/x/sys/windows"

type DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC struct {
	InputTensor uintptr
	InputScaleTensor uintptr
	InputZeroPointTensor uintptr
	FilterTensor uintptr
	FilterScaleTensor uintptr
	FilterZeroPointTensor uintptr
	BiasTensor uintptr
	OutputScaleTensor uintptr
	OutputZeroPointTensor uintptr
	OutputTensor uintptr
	DimensionCount uint32
	Strides uintptr
	Dilations uintptr
	StartPadding uintptr
	EndPadding uintptr
	GroupCount uint32
}
type
  DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC = record
    InputTensor: Pointer;
    InputScaleTensor: Pointer;
    InputZeroPointTensor: Pointer;
    FilterTensor: Pointer;
    FilterScaleTensor: Pointer;
    FilterZeroPointTensor: Pointer;
    BiasTensor: Pointer;
    OutputScaleTensor: Pointer;
    OutputZeroPointTensor: Pointer;
    OutputTensor: Pointer;
    DimensionCount: DWORD;
    Strides: Pointer;
    Dilations: Pointer;
    StartPadding: Pointer;
    EndPadding: Pointer;
    GroupCount: DWORD;
  end;
const DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC = extern struct {
    InputTensor: ?*anyopaque,
    InputScaleTensor: ?*anyopaque,
    InputZeroPointTensor: ?*anyopaque,
    FilterTensor: ?*anyopaque,
    FilterScaleTensor: ?*anyopaque,
    FilterZeroPointTensor: ?*anyopaque,
    BiasTensor: ?*anyopaque,
    OutputScaleTensor: ?*anyopaque,
    OutputZeroPointTensor: ?*anyopaque,
    OutputTensor: ?*anyopaque,
    DimensionCount: u32,
    Strides: ?*anyopaque,
    Dilations: ?*anyopaque,
    StartPadding: ?*anyopaque,
    EndPadding: ?*anyopaque,
    GroupCount: u32,
};
type
  DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC {.bycopy.} = object
    InputTensor: pointer
    InputScaleTensor: pointer
    InputZeroPointTensor: pointer
    FilterTensor: pointer
    FilterScaleTensor: pointer
    FilterZeroPointTensor: pointer
    BiasTensor: pointer
    OutputScaleTensor: pointer
    OutputZeroPointTensor: pointer
    OutputTensor: pointer
    DimensionCount: uint32
    Strides: pointer
    Dilations: pointer
    StartPadding: pointer
    EndPadding: pointer
    GroupCount: uint32
struct DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC
{
    void* InputTensor;
    void* InputScaleTensor;
    void* InputZeroPointTensor;
    void* FilterTensor;
    void* FilterScaleTensor;
    void* FilterZeroPointTensor;
    void* BiasTensor;
    void* OutputScaleTensor;
    void* OutputZeroPointTensor;
    void* OutputTensor;
    uint DimensionCount;
    void* Strides;
    void* Dilations;
    void* StartPadding;
    void* EndPadding;
    uint GroupCount;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC サイズ: 64 バイト(x86)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; InputTensor : DML_TENSOR_DESC* (+0, 4byte)  varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; InputScaleTensor : DML_TENSOR_DESC* (+4, 4byte)  varptr(st)+4 を基点に操作(4byte:入れ子/配列)
; InputZeroPointTensor : DML_TENSOR_DESC* (+8, 4byte)  varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; FilterTensor : DML_TENSOR_DESC* (+12, 4byte)  varptr(st)+12 を基点に操作(4byte:入れ子/配列)
; FilterScaleTensor : DML_TENSOR_DESC* (+16, 4byte)  varptr(st)+16 を基点に操作(4byte:入れ子/配列)
; FilterZeroPointTensor : DML_TENSOR_DESC* (+20, 4byte)  varptr(st)+20 を基点に操作(4byte:入れ子/配列)
; BiasTensor : DML_TENSOR_DESC* (+24, 4byte)  varptr(st)+24 を基点に操作(4byte:入れ子/配列)
; OutputScaleTensor : DML_TENSOR_DESC* (+28, 4byte)  varptr(st)+28 を基点に操作(4byte:入れ子/配列)
; OutputZeroPointTensor : DML_TENSOR_DESC* (+32, 4byte)  varptr(st)+32 を基点に操作(4byte:入れ子/配列)
; OutputTensor : DML_TENSOR_DESC* (+36, 4byte)  varptr(st)+36 を基点に操作(4byte:入れ子/配列)
; DimensionCount : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; Strides : DWORD* (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; Dilations : DWORD* (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; StartPadding : DWORD* (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; EndPadding : DWORD* (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; GroupCount : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC サイズ: 128 バイト(x64)
dim st, 32    ; 4byte整数×32(構造体サイズ 128 / 4 切り上げ)
; InputTensor : DML_TENSOR_DESC* (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; InputScaleTensor : DML_TENSOR_DESC* (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; InputZeroPointTensor : DML_TENSOR_DESC* (+16, 8byte)  varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; FilterTensor : DML_TENSOR_DESC* (+24, 8byte)  varptr(st)+24 を基点に操作(8byte:入れ子/配列)
; FilterScaleTensor : DML_TENSOR_DESC* (+32, 8byte)  varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; FilterZeroPointTensor : DML_TENSOR_DESC* (+40, 8byte)  varptr(st)+40 を基点に操作(8byte:入れ子/配列)
; BiasTensor : DML_TENSOR_DESC* (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; OutputScaleTensor : DML_TENSOR_DESC* (+56, 8byte)  varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; OutputZeroPointTensor : DML_TENSOR_DESC* (+64, 8byte)  varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; OutputTensor : DML_TENSOR_DESC* (+72, 8byte)  varptr(st)+72 を基点に操作(8byte:入れ子/配列)
; DimensionCount : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; Strides : DWORD* (+88, 8byte)  qpoke st,88,値 / qpeek(st,88)  ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; Dilations : DWORD* (+96, 8byte)  qpoke st,96,値 / qpeek(st,96)  ※IronHSPのみ。3.7/3.8は lpoke st,96,下位 : lpoke st,100,上位
; StartPadding : DWORD* (+104, 8byte)  qpoke st,104,値 / qpeek(st,104)  ※IronHSPのみ。3.7/3.8は lpoke st,104,下位 : lpoke st,108,上位
; EndPadding : DWORD* (+112, 8byte)  qpoke st,112,値 / qpeek(st,112)  ※IronHSPのみ。3.7/3.8は lpoke st,112,下位 : lpoke st,116,上位
; GroupCount : DWORD (+120, 4byte)  st.30 = 値  /  値 = st.30   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global DML_QUANTIZED_LINEAR_CONVOLUTION_OPERATOR_DESC
    #field intptr InputTensor
    #field intptr InputScaleTensor
    #field intptr InputZeroPointTensor
    #field intptr FilterTensor
    #field intptr FilterScaleTensor
    #field intptr FilterZeroPointTensor
    #field intptr BiasTensor
    #field intptr OutputScaleTensor
    #field intptr OutputZeroPointTensor
    #field intptr OutputTensor
    #field int DimensionCount
    #field intptr Strides
    #field intptr Dilations
    #field intptr StartPadding
    #field intptr EndPadding
    #field int GroupCount
#endstruct

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