检查加速深度学习函数输出
此示例说明如何检查加速函数的输出是否与底层函数的输出匹配。
在某些情况下,加速函数的输出与底层函数的输出不同。例如,在对使用随机数生成的函数(例如生成要添加到网络输入的随机噪声的函数)进行加速时必须小心。在缓存生成随机数(非 dlarray 对象)的函数的跟踪时,加速函数会缓存跟踪中生成的随机数。重用跟踪时,加速函数会使用缓存的随机值。加速函数不会生成新的随机值。
要检查加速函数的输出是否与底层函数的输出匹配,请使用加速函数的 CheckMode 属性。当加速函数的 CheckMode 属性为 'tolerance',且输出差异超过指定的容差时,加速函数会抛出警告。
使用 dlaccelerate 函数加速在示例末尾列出的 myUnsupportedFun 函数。myUnsupportedFun 函数生成随机噪声并将其添加到输入中。此函数不支持加速,因为该函数生成的随机数不是 dlarray 对象。
accfun = dlaccelerate(@myUnsupportedFun)
accfun =
AcceleratedFunction with properties:
Function: @myUnsupportedFun
Enabled: 1
CacheSize: 50
HitRate: 0
Occupancy: 0
CheckMode: 'none'
CheckTolerance: 1.0000e-04
使用 clearCache 函数清除任何先前缓存的跟踪。
clearCache(accfun)
要检查重用缓存跟踪的输出是否与底层函数的输出匹配,请将 CheckMode 属性设置为 'tolerance'。
accfun.CheckMode = 'tolerance'accfun =
AcceleratedFunction with properties:
Function: @myUnsupportedFun
Enabled: 1
CacheSize: 50
HitRate: 0
Occupancy: 0
CheckMode: 'tolerance'
CheckTolerance: 1.0000e-04
使用一个全一数组作为输入(指定为 dlarray 输入)来计算加速函数。
dlX = dlarray(ones(3,3)); dlY = accfun(dlX)
dlY =
3×3 dlarray
1.8147 1.9134 1.2785
1.9058 1.6324 1.5469
1.1270 1.0975 1.9575
使用相同的输入再次计算加速函数。由于加速函数重用缓存的随机噪声值而不是生成新的随机值,因此重用跟踪的输出与底层函数的输出不同。当加速函数的 CheckMode 属性为 'tolerance' 且输出不同时,加速函数会抛出警告。
dlY = accfun(dlX)
Warning: Accelerated outputs differ from underlying function outputs.
dlY =
3×3 dlarray
1.8147 1.9134 1.2785
1.9058 1.6324 1.5469
1.1270 1.0975 1.9575
结合使用 rand 函数的 'like' 选项与 dlarray 对象的随机数生成支持加速。要在加速函数中使用随机数生成,请确保该函数使用 rand 函数并将 'like' 选项设置为跟踪的 dlarray 对象(依赖于输入 dlarray 对象的 dlarray 对象)。
加速在示例末尾列出的 mySupportedFun 函数。mySupportedFun 函数通过结合使用 'like' 选项与跟踪的 dlarray 对象生成噪声,从而为输入添加噪声。
accfun2 = dlaccelerate(@mySupportedFun);
使用 clearCache 函数清除任何先前缓存的跟踪。
clearCache(accfun2)
要检查重用缓存跟踪的输出是否与底层函数的输出匹配,请将 CheckMode 属性设置为 'tolerance'。
accfun2.CheckMode = 'tolerance';使用与之前相同的输入计算两次加速函数。由于重用缓存的输出与底层函数的输出匹配,因此加速函数不会抛出警告。
dlY = accfun2(dlX)
dlY =
3×3 dlarray
1.7922 1.0357 1.6787
1.9595 1.8491 1.7577
1.6557 1.9340 1.7431
dlY = accfun2(dlX)
dlY =
3×3 dlarray
1.3922 1.7060 1.0462
1.6555 1.0318 1.0971
1.1712 1.2769 1.8235
检查输出是否匹配需要额外的处理,并会增加函数计算所需的时间。检查输出后,将 CheckMode 属性设置为 'none'。
accfun1.CheckMode = 'none'; accfun2.CheckMode = 'none';
示例函数
myUnsupportedFun 函数生成随机噪声并将其添加到输入中。此函数不支持加速,因为该函数生成的随机数不是 dlarray 对象。
function out = myUnsupportedFun(dlX) sz = size(dlX); noise = rand(sz); out = dlX + noise; end
mySupportedFun 函数通过结合使用 'like' 选项与跟踪的 dlarray 对象生成噪声,从而为输入添加噪声。
function out = mySupportedFun(dlX) sz = size(dlX); noise = rand(sz,'like',dlX); out = dlX + noise; end
另请参阅
dlaccelerate | AcceleratedFunction | clearCache | dlarray | dlgradient | dlfeval