Tensorflow: Documentação pouco clara para o comportamento de nivelamento de tf.layers.dense

Criado em 7 mar. 2017  ·  3Comentários  ·  Fonte: tensorflow/tensorflow

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 por w .

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)

docs-bug

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 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)

Todos 3 comentários

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)
Esta página foi útil?
0 / 5 - 0 avaliações