Я новость для Tensorflow. Я уже ищу те же вопросы, но не могу понять. есть код. Надеюсь, вы можете мне помочь.
Код:
import tensorflow as tf
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,3],stddev=1,seed=1))
x = tf.constant([0.7,0.9])
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
sess = tf.Session()
sess.run(w1.initializer)
sess.run(w2.initializer)
print(sess.run(y))
sess.close()
Форма константы x
- это (2,)
, то есть одномерный массив, и вы пытаетесь умножить его на двумерный массив w1
формы (2, 3)
, что невозможно для матричного умножения, так как количество столбцов первого параметра должно быть равно количеству строк во втором параметре. Кроме того, я думаю, что tf.matmul
работает только в том случае, если оба массива двумерны.
Один из многих способов изменить декларацию x
как
x = tf.constant([[0.7], [0.9]])
Это создаст двумерный постоянный тензор формы (2, 1). И затем умножьте это на,
a = tf.matmul(tf.transpose(x), w1)
tf.transpose()
используется для создания транспонирования массива x с формой (2, 1) в форму (1, 2).
Надеюсь это поможет.
В вашем случае ранг переменной x равен 1. Отсюда проблема.
Ниже приводится причина, по которой у вас возникла эта проблема.
Обратитесь к API тензорного потока https://www.tensorflow.org/api_docs/python/tf/matmul
tf.matmul (а, б, transpose_a = False, transpose_b = False, adjoint_a = False, adjoint_b = False, a_is_sparse = Ложь, b_is_sparse = Ложь, name = Нет)
Аргументы:
a: Тензор типа float16, float32, float64, int32, complex64, complex128 и ранг> 1.
b: Тензор с того же типа и ранга в качестве.
Форма x
(2,)
не соответствует форме (2,3)
w1
.
Вы должны изменить
x = tf.constant([0.7,0.9])
к
x = tf.constant([[0.7,0.9]])
теперь форма x
- это (1,2)
и работает нормально.