頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


TensorFlowのlrn層ってMPSではどう記述するの?

TensorFlowの学習結果をiOSのMPSで使う
↑この続きで畳み込みのある場合のMNISTをやってみたら(珍しく)一撃でうまく行ったのはいいんだけど、その次に別なNNでやろうとしてはまったんよ。

TensorFlowで tf.nn.lrn (local response normalization)ってのがあるけど、これをiOS側のMetal Performance Shadersではどう表現するのかよくわからん。色々調べたり試してみたんだけど、MPSのMPSCNNCrossChannelNormalizationでいいのかなと。
ただ、双方の定義をよくみるとどこからどこの層を対象にするねんってところで双方のパラーメータをどうやっても完全に一致はしないよね?

norm1 = tf.nn.lrn(h_pool1, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name='norm1')
↑こんなTensorFlowのlrn層(値はCifar-10であったやつかな)をMPSで使おうとした時、
kernelSizeは9(これはプロパティじゃなくイニシャライザで設定)
norm.alpha = 0.001;
norm.beta = 0.75;
norm.delta = 1.0;
でいいのかなという気がするんだが、、、?定義からするとalphaの/9は不要と思うんだが、実はこの/9の有無で出力の値に変化がなかったのでよくわからない。まあいい、俺はそうするよ、lrn層後の値は双方似たような値になるし。

ただ、完全に一致するというわけじゃないのよ(入力データは完全に一致するけど)。

そもそもこのlrn層の前の畳み込み層の出力からしてTensorFlowとMPSでは値が微妙に違う。

0.15247595 0.13704236 0.24492025
0.152466 0.136963 0.244873
上がTensorFlow、下がMPSでの畳み込み層後の値。

TensorFlowでは32ビット浮動小数点数を使うけど、MPSでは16ビットだからそのあたりで異なってくるのかなあと思ってる。


↓参考)双方のリファレンス
tf.nn.local_response_normalization  |  TensorFlow
MPSCNNCrossChannelNormalization - MetalPerformanceShaders | Apple Developer Documentation

<< 機械学習で人体頭部の姿勢を得る  TopPage  TensorFlowの学習結果をiOSのMPSで使う >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1058-b7fd5254




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad