tf.nn.conv2d
ここでテンソルフローのドキュメントを見ていました。しかし、私はそれが何をするのか、それが何を達成しようとしているのか理解できません。それはドキュメントで言う、
#1:フィルターを形状のある2次元行列に平坦化する
[filter_height * filter_width * in_channels, output_channels]
。
今それは何をしますか?その要素ごとの乗算ですか、それとも単なる行列乗算ですか?また、ドキュメントで言及されている他の2つのポイントも理解できませんでした。以下に書きました:
#2:入力テンソルから画像パッチを抽出して、形状の仮想テンソルを形成します
[batch, out_height, out_width, filter_height * filter_width * in_channels]
。#3:パッチごとに、フィルターマトリックスと画像パッチベクトルを右乗算します。
誰かが例を挙げ、コード(非常に役立つ)を多分提供し、そこで何が起こっているのか、なぜ操作がこのようになるのかを説明できれば非常に役立ちます。
小さな部分をコーディングして、操作の形を印刷してみました。それでも理解できません。
私はこのようなものを試しました:
op = tf.shape(tf.nn.conv2d(tf.random_normal([1,10,10,10]),
tf.random_normal([2,10,10,10]),
strides=[1, 2, 2, 1], padding='SAME'))
with tf.Session() as sess:
result = sess.run(op)
print(result)
ビットと畳み込みニューラルネットワークの一部を理解しています。ここで勉強しました。しかし、テンソルフローの実装は私が期待したものではありません。それで問題を提起しました。
編集:それで、私ははるかに単純なコードを実装しました。しかし、私は何が起こっているのか理解できません。結果はこんな感じです。どのプロセスがこの出力を生成するかを誰かに教えてもらえれば、非常に役立ちます。
input = tf.Variable(tf.random_normal([1,2,2,1]))
filter = tf.Variable(tf.random_normal([1,1,1,1]))
op = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print("input")
print(input.eval())
print("filter")
print(filter.eval())
print("result")
result = sess.run(op)
print(result)
出力
input
[[[[ 1.60314465]
[-0.55022103]]
[[ 0.00595062]
[-0.69889867]]]]
filter
[[[[-0.59594476]]]]
result
[[[[-0.95538563]
[ 0.32790133]]
[[-0.00354624]
[ 0.41650501]]]]
tf.nn.conv2d()
ため、use_cudnn_on_gpu=False
明示的に指定されていない限り、GPUサポートでTFを使用する場合、問題のメソッドはまったく使用されません。