Estados de la documentación:
Nota: si el tensor
inputs
tiene un rango mayor que 2, entonces es
aplanado antes de la matriz inicial multiplicar porw
.
Sin embargo, el siguiente tensor devuelve con forma shape=(2, 2, 2, 400)
, como si la entrada no se hubiera aplanado
tf.layers.dense(tf.placeholder(tf.float32, (2,2,2,2)), 400)
Ups, lo siento, no quise quitarme. Investigando internamente, estaba tratando de agregar a la persona que creo que es responsable.
Entonces, después de la investigación, lo que me dijeron fue que se comporta como tensordot, por lo que el comportamiento y la documentación actual son correctos, y el ingeniero con el que hablé dijo que pensaban que podíamos usar un lenguaje más preciso, pero que no lo haría ' Esto necesariamente ayuda, ya que el lenguaje actual es claro e inequívoco cuando está en contexto. (Ver tensordot: https://docs.scipy.org/doc/numpy/reference/generated/numpy.tensordot.html)
Si desea intentar hacer una solicitud de extracción usted mismo para hacer una nueva redacción, sería bienvenido, pero cerraré este error por ahora, ya que no vamos a hacer nada al respecto internamente.
Ah, gracias, la conexión tensordot lo deja más claro.
Parece que tf.dense
comporta contrayendo el último índice del tensor de entrada con el primer tensor del índice de pesos. La palabra "aplanar" era confusa, no estoy seguro de lo que significa aquí
Ejemplo de juguete que hice para mí mismo para traducir tf.dense a 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)
Comentario más útil
Ah, gracias, la conexión tensordot lo deja más claro.
Parece que
tf.dense
comporta contrayendo el último índice del tensor de entrada con el primer tensor del índice de pesos. La palabra "aplanar" era confusa, no estoy seguro de lo que significa aquíEjemplo de juguete que hice para mí mismo para traducir tf.dense a np.tensordot equivalente