Подтвердить что ты не робот

Исключение Tensorflow с matmul

Я начинаю начинать с TensorFlow, и я пытаюсь умножить две матрицы вместе, но я продолжаю получать исключение, которое говорит:

ValueError: Shapes TensorShape ([Размер (2)]) и TensorShape ([Dimension (None), Dimension (None)]) должны иметь одинаковый ранг

Здесь минимальный пример кода:

data = np.array([0.1, 0.2])
x = tf.placeholder("float", shape=[2])
T1 = tf.Variable(tf.ones([2,2]))
l1 = tf.matmul(T1, x)
init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    sess.run(feed_dict={x: data}

Смутно, следующий очень похожий код отлично работает:

data = np.array([0.1, 0.2])
x = tf.placeholder("float", shape=[2])
T1 = tf.Variable(tf.ones([2,2]))
init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    sess.run(T1*x, feed_dict={x: data}

Может ли кто-нибудь указать на то, что проблема? Я должен упустить что-то очевидное здесь.

4b9b3361

Ответ 1

tf.matmul() op требует, чтобы оба его входа были матрицами (т.е. двухмерными тензорами) * и не выполняет автоматического преобразования. Ваша переменная T1 является матрицей, но ваш заполнитель x представляет собой вектор длины (т.е. Одномерный тензор), который является источником ошибки.

Напротив, оператор * (псевдоним tf.multiply()) является умножением на эфир. Он преобразует векторный аргумент в матрицу, следуя правила вещания NumPy.

Чтобы сделать работу с матрицей, вы можете потребовать, чтобы x была матрицей:

data = np.array([[0.1], [0.2]])
x = tf.placeholder(tf.float32, shape=[2, 1])
T1 = tf.Variable(tf.ones([2, 2]))
l1 = tf.matmul(T1, x)
init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    sess.run(l1, feed_dict={x: data})

... или вы можете использовать tf.expand_dims() op для преобразования вектора в матрицу:

data = np.array([0.1, 0.2])
x = tf.placeholder(tf.float32, shape=[2])
T1 = tf.Variable(tf.ones([2, 2]))
l1 = tf.matmul(T1, tf.expand_dims(x, 1))
init = tf.initialize_all_variables()

with tf.Session() as sess:
    # ...

* Это было верно, когда я отправил ответ сначала, но теперь tf.matmul() также поддерживает умноженные матричные умножения. Для этого требуется, чтобы оба аргумента имели как минимум 2 измерения. Подробнее см. документацию.