ドキュメントの状態:
注:
inputs
テンソルのランクが2より大きい場合、次のようになります。
最初の行列の前に平坦化され、w
乗算されます。
ただし、以下は、入力が平坦化されていないかのように、形状shape=(2, 2, 2, 400)
テンソルを返します。
tf.layers.dense(tf.placeholder(tf.float32, (2,2,2,2)), 400)
申し訳ありませんが、自分を削除するつもりはありませんでした。 社内で調査し、責任があると思う人を追加しようとしていました。
調査の結果、テンソルドットのように動作するため、動作と現在のドキュメントはどちらも正しいと言われました。話を聞いたエンジニアは、もっと正確な言語を使用できると思っていたのですが、そうではないと言っていました。現在の言語は文脈上明確で明確であるため、必ずしも役に立ちます。 (tensordotを参照してください:https://docs.scipy.org/doc/numpy/reference/generated/numpy.tensordot.html)
自分でプルリクエストを実行して言い換えを試みたい場合は、それは歓迎されますが、内部では何も行わないため、このバグは今のところ閉じています。
ああ、ありがとう、tensordot接続はそれをより明確にします。
tf.dense
は、入力テンソルの最後のインデックスを重みテンソルの最初のインデックスと縮小することによって動作するようです。 「平らにされた」という言葉は紛らわしく、ここでそれが何を意味するのかわかりません
tf.denseを同等のnp.tensordotに変換するために自分で作成したおもちゃの例
tf.reset_default_graph()
x0 = np.ones((3, 3, 3))
w0 = np.arange(6).reshape((3, 2))
x = tf.constant(x0)
y = tf.layers.dense(x, 2)
var_dict = {v.op.name: v for v in tf.global_variables()}
assert(var_dict["dense/kernel"].get_shape() == (3, 2))
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
sess.run(tf.assign(var_dict["dense/kernel"], w0))
sess.run(tf.assign(var_dict["dense/bias"], np.zeros((2,))))
expected_y0 = np.tensordot(x0,w0,axes=[(2,),(0,)])
y0 = sess.run(y)
np.testing.assert_allclose(y0, expected_y0)
最も参考になるコメント
ああ、ありがとう、tensordot接続はそれをより明確にします。
tf.dense
は、入力テンソルの最後のインデックスを重みテンソルの最初のインデックスと縮小することによって動作するようです。 「平らにされた」という言葉は紛らわしく、ここでそれが何を意味するのかわかりませんtf.denseを同等のnp.tensordotに変換するために自分で作成したおもちゃの例