РЕДАКТИРОВАТЬ в соответствии с комментарием ОП
Вы можете сгладить векторы входных объектов, чтобы придать им форму [-1, n_type * n_features]
, применить правильно выбранную матрицу умножения и изменить форму вывода с [-1, n_type * n_neurons]
до [-1, n_type, n_neurons]
Тензор операции будет иметь диагональ блока [n_type * n_features, n_type * n_neurons]
один, каждый блок является одним из n_type
тензоров в weights
.
Для построения диагональной матрицы блокаЯ использовал другой ответ (из здесь )
Это будет выглядеть так:
inputs = tf.placeholder("float", shape=[None, n_type, n_features])
inputs = tf.reshape(inputs, shape=[-1, n_type * n_features])
weights = tf.Variable(FNN_weight_initializer([n_type, n_features, n_neurons]))
split_weights = tf.split(weights, num_or_size_splits=n_type, axis=1)
# each element of split_weights is a tensor of shape : [1, n_features, n_neurons] -> need to squeeze
split_weights = tf.map_fn(lambda elt : tf.squeeze(elt, axis=0), split_weights)
block_matrix = block_diagonal(split_weights) # from the abovementioned reference
Hidden1 = tf.matmul(inputs, block_matrix)
# shape : [None, n_type * n_neurons]
Hidden1 = tf.reshape(Hidden1, [-1, n_type, n_neurons])
# shape : [None, n_type, n_neurons]
Оригинальный ответ
Согласно документации tf.matmul
( ссылка ), умножаемые вами тензоры должны иметь одинаковый ранг.
Если ранг равен >2
, только два последнихизмерения должны быть совместимы с умножением матриц, первые другие измерения должны точно совпадать.
Итак, на вопрос «Можно ли даже умножить тензоры ранга 3 на tf.matmul?», ответ «Да, возможно, но концептуально, это еще мультипликат ранга 2ion ".
Следовательно, необходимо изменить форму:
inputs = tf.placeholder("float", shape=[None, n_type, n_features])
inputs = tf.reshape(inputs, shape=[-1, n_type, 1, n_features])
weights = tf.Variable(FNN_weight_initializer([n_type, n_features, n_neurons]))
weights = tf.expand_dims(weights, 0)
# shape : [1, n_type, n_features, n_neurons]
weights = tf.tile(weights, [tf.shape(inputs)[0], 1, 1, 1])
# shape : [None, n_type, n_features, n_neurons]
Hidden1 = tf.matmul(inputs, weights)
# shape : [None, n_type, 1, n_neurons]
Hidden1 = tf.reshape(Hidden1, [-1, n_type, n_neurons])
# shape : [None, n_type, n_neurons]