Estados de documentação:
Nota: se o tensor
inputs
tem uma classificação maior que 2, então ele é
achatado antes da matriz inicial, multiplique porw
.
No entanto, o seguinte retorna o tensor com a forma shape=(2, 2, 2, 400)
, como se a entrada não tivesse sido achatada
tf.layers.dense(tf.placeholder(tf.float32, (2,2,2,2)), 400)
Opa, desculpe, não tive a intenção de me retirar. Investigar internamente foi tentar agregar a pessoa que acho que é o responsável.
Então, após investigação, o que me disseram foi que ele se comporta como tensordot, e então o comportamento e a documentação atual estão corretos - e o engenheiro com quem conversei disse que eles achavam que poderíamos usar uma linguagem mais precisa, mas não seria. t necessariamente ajuda, pois a linguagem atual é clara e inequívoca quando no contexto. (Consulte tensordot: https://docs.scipy.org/doc/numpy/reference/generated/numpy.tensordot.html)
Se você quiser tentar fazer uma solicitação de pull para fazer alguma reformulação, seria bem-vindo, mas estou encerrando esse bug por enquanto, pois não faremos nada a respeito internamente.
Obrigado, conexão tensordot torna isso mais claro.
Parece que tf.dense
se comporta contraindo o último índice do tensor de entrada com o primeiro índice do tensor de pesos. A palavra "achatar" era confusa, não tenho certeza do que significa aqui
Exemplo de brinquedo que fiz para mim mesmo para traduzir tf.dense para np.tensordot equivalente
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)
Comentários muito úteis
Obrigado, conexão tensordot torna isso mais claro.
Parece que
tf.dense
se comporta contraindo o último índice do tensor de entrada com o primeiro índice do tensor de pesos. A palavra "achatar" era confusa, não tenho certeza do que significa aquiExemplo de brinquedo que fiz para mim mesmo para traduzir tf.dense para np.tensordot equivalente