CompiledLayer[func]
計算がコンパイル可能な関数 func で定義されたネット層を表す.
CompiledLayer[func,gradientfunc]
層のNetTrainでの使用を可能にする勾配伝播関数を指定する.
CompiledLayer
CompiledLayer[func]
計算がコンパイル可能な関数 func で定義されたネット層を表す.
CompiledLayer[func,gradientfunc]
層のNetTrainでの使用を可能にする勾配伝播関数を指定する.
詳細とオプション
- CompiledLayerは,通常,他の層では実装できないカスタム関数を計算するネット層を作成するために使われる.
- CompiledLayer[func,Automatic]のようなCompiledLayer[func]は自動的に func を微分して勾配伝播関数を作成しようとする.CompiledLayer[func,None]は自動微分を無効にする
- 関数 func および gradientfunc は,FunctionCompileによる処理に適した(つまり,引数指定がTypedおよびTypeSpecifierを使って行われた)有効なFunctionオブジェクトでなければならない.
- CompiledLayerは,現行では単一の入出力ポートしかサポートしない.
- 関数 func は層が行った計算を表すが,これはフォワードパスとしても知られるものである.
- 関数 func は単一の配列を(層の入力を表す)入力として取らなければならず,単一の配列を(配列の出力を表す)出力として生成しなければならない.
- 関数 gradientfunc は出力勾配から入力勾配を計算するが,これはバックワードパスとしても知られている.
- 関数 gradientfunc は少なくとも2つの配列を層の入力を表す入力と出力勾配として取らなければならない.また,任意で,以前計算した出力を第3引数として与えることができる,関数 gradientfunc の結果は層の入力勾配を表す単一の配列である.
- 関数 func は単一の例または例のバッチを取ると定義できる.CompiledLayer[func,"Input"…]を使って2つの場合の曖昧さを解消するために(func で定義された階数と比較することで)入力の階数が指定できる.func と gradientfunc はどちらも単一の例を取るか,どちらも例のバッチを取るかしなければならない.
- CompiledLayerは,NetGraph等で使うために次のポートを開放する.
-
"Input" 配列 "Output" 配列 - NumericArrayが入力として与えられると,出力はNumericArrayになる.
- Options[CompiledLayer]は,層を構築するためのデフォルトオプションのリストを与える.Options[CompiledLayer[…]]は,データについて層を評価するためのデフォルトオプションのリストを与える.
- Information[CompiledLayer[…]]は層についての報告を与える.
- Information[CompiledLayer[…],prop]はCompiledLayer[…]の特性 prop の値を与える.使用可能な特性はNetGraphについてと同じである.
- CompiledLayerはGPUアーキテクチャにコンパイルすることはできない.TargetDevice"GPU"と設定すると,訓練と推論の両方がCPU上で行われる.
例題
すべて開く すべて閉じる例 (2)
機械精度で階数3の配列を取る関数からコンパイルされた層を作る:
CompiledLayer[Function[{Typed[input, TypeSpecifier["PackedArray"]["MachineReal", 3]]}, Fold[Times, input]], None
]32ビット精度で階数2の配列を取る関数からCompiledLayerを作る:
f = Function[{Typed[input, TypeSpecifier["NumericArray"]["Real32", 1]]}, Floor[input] - Mean[input]];l = CompiledLayer[f, "Input" -> {3}]l[{0.2, 3, -0.8}]l[{0.2, 3, -0.8}, NetPortGradient["Input"]]スコープ (3)
勾配伝播関数でCompiledLayerを作成する:
func = Function[
{Typed[input, TypeSpecifier["PackedArray"]["MachineReal", 3]]},
FoldList[Plus, input]
];gradientFunc = Function[
{
Typed[input, TypeSpecifier["PackedArray"]["MachineReal", 3]],
Typed[outgrad, TypeSpecifier["PackedArray"]["MachineReal", 3]]
},
Reverse@FoldList[Plus, Reverse[outgrad]]
];l = CompiledLayer[func, gradientFunc, "Input" -> {2, 1, 3}]勾配伝播関数を使うと,NetTrainで層を使って勾配が計算できる:
l[{{{0.4, -1.5, 7.3}}, {{0, 5.1, -7.2}}}, NetPortGradient["Input"]]{{{2., 2., 2.}}, {{1., 1., 1.}}}NetTrain[
NetChain[{LinearLayer[{2, 1, 3}], l, LinearLayer[2], SoftmaxLayer[]}],
{1.5 -> 1, 2.6 -> 1, 0.4 -> 1, -0.1 -> 2, -0.7 -> 2, -5.4 -> 2}
]勾配を計算する際に前に計算した値が再利用できるように勾配伝播関数の第3引数を指定する:
func = Function[
{Typed[input, TypeSpecifier["PackedArray"]["MachineReal", 1]]},
FoldList[Times, input]
];gradientFunc = Function[
{
Typed[input, TypeSpecifier["PackedArray"]["MachineReal", 1]],
Typed[outgrad, TypeSpecifier["PackedArray"]["MachineReal", 1]],
Typed[output, TypeSpecifier["PackedArray"]["MachineReal", 1]]
},
Table[
output[[n ;; -1]].outgrad[[n ;; -1]] / input[[n]],
{n, Length[input]}
]
];l = CompiledLayer[func, gradientFunc, "Input" -> {6}]l[{0.4, -0.7, 1.3, -1.4, 0.9, 0.7}, NetPortGradient["Input"]]要素のバッチに動作するCompiledLayerを作成する.階数2の配列を逆にする関数を定義する:
func = Function[
{Typed[input, TypeSpecifier["NumericArray"]["Real32", 2]]},
Reverse[input]
];CompiledLayerで階数1の入力を指定する.この関数はバッチレベルで動作すると解釈されるようになった:
l = CompiledLayer[func, None, "Input" -> {4}]長さ4の単一のベクトルに動作する場合は,ベクトルは変わらない:
l@{1, 2, 3, 4}l@{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}CompiledLayerは,このように使われると,通常の層では不可能なバッチ内の異なる要素を互いにインタラクトさせることができるようになる.
考えられる問題 (5)
CompiledLayer[Function[{Typed[input, TypeSpecifier["PackedArray"]["MachineReal", 3]]}, Fold[Times, input]]
]第2引数で勾配伝播関数を指定するときは,満足しなければならない厳しい互換制約がいくつもある:
func = Function[
{Typed[input, TypeSpecifier["PackedArray"]["MachineReal", 2]]},
Sin[input]
];gradientFunc = Function[
{
Typed[input, TypeSpecifier["NumericArray"]["Real32", 3]],
Typed[outgrad, TypeSpecifier["NumericArray"]["Real32", 3]]
},
Cos[input] * outgrad
];CompiledLayer[func, gradientFunc]層関数が入力バッチに動作するときは,バッチ次元が保持されなければならない:
func = Function[
{Typed[input, TypeSpecifier["PackedArray"]["MachineReal", 2]]},
First[input]
];CompiledLayer[func, "Input" -> {4}]
層と勾配関数で生成される出力の形状は,入力の値ではなく,入力の形状のみに依存すると期待される.出力の形状が入力値に依存する関数を作成する:
func = Function[
{Typed[input, TypeSpecifier["PackedArray"]["MachineReal", 1]]},
If[Total[input] < 10, input, Flatten@{input, input}]
];func@{1, 2, 3}func@{1, 2, 30}CompiledLayerは,形状を推定する間この関数をテスト入力について実行して,期待される出力の形状を入手する:
l = CompiledLayer[func, "Input" -> 3]出力の形状が期待される形状と一致するなら,続く評価は成功裏に終了する:
l@{1, 2, 3}l@{1, 2, 30}CompiledLayerは,高速化のためにコンパイルされた関数が通常有効にするサニティチェックを無効にする.この結果,悪いコードが思わぬ動作の原因となったりカーネルがクラッシュしたりすることさえ考えられる.入力配列の領域外の要素にアクセスする関数を例に取ってみよう:
func = Function[
{Typed[input, TypeSpecifier["PackedArray"]["MachineReal", 1]]},
input + input[[Length[input] + 1]]
];FunctionCompileが生成したCompiledCodeFunctionはエラーをスローする:
compiledFunc = FunctionCompile[func]compiledFunc@{4., 5., 6.}CompiledLayerは配列の境界をチェックせずに関数を実行するので,結果として未定義の動作になる:
l = CompiledLayer[func]Table[l@{4, 5, 6}, 10]テクニカルノート
関連するガイド
テキスト
Wolfram Research (2020), CompiledLayer, Wolfram言語関数, https://reference.wolfram.com/language/ref/CompiledLayer.html (2021年に更新).
CMS
Wolfram Language. 2020. "CompiledLayer." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2021. https://reference.wolfram.com/language/ref/CompiledLayer.html.
APA
Wolfram Language. (2020). CompiledLayer. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/CompiledLayer.html
BibTeX
@misc{reference.wolfram_2026_compiledlayer, author="Wolfram Research", title="{CompiledLayer}", year="2021", howpublished="\url{https://reference.wolfram.com/language/ref/CompiledLayer.html}", note=[Accessed: 11-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_compiledlayer, organization={Wolfram Research}, title={CompiledLayer}, year={2021}, url={https://reference.wolfram.com/language/ref/CompiledLayer.html}, note=[Accessed: 11-September-2026]}