Как объединить 2 вектора, используя поэлементное обучение умножению в функциональном API Keras? - PullRequest
1 голос
/ 24 мая 2019

Я новичок в Керасе. Я столкнулся с простой проблемой, но долго искал и не могу найти, как с ней справиться.

Вкратце, у меня есть 2 вектора: [a1, a2, a3] & [b1, b2, b3], и я хочу объединить их, указав их веса, используя следующую формулу для получения нового вектора: [y1, y2, y3]. Тогда как реализовать это с Keras?

формула

Моя ситуация такова: я строю 2 модели по отдельности, и у каждой есть свой прогнозный результат (то есть 3 значения, представляющие прогнозируемое значение 3 категорий). Выход первой модели [a1, a2, a3], а для второй модели [b1, b2, b3].

Теперь я хочу объединить эти 2 выхода, чтобы получить новые результаты прогнозирования [y1, y2, y3], поэтому y1 - это комбинация a1 & b1, и модель должна узнать вес самостоятельно. Это означает, что y1 = w1*a1 + w4*b1, w1 и w4 - это веса, которые нужно тренировать. Точно так же, y2 = w2*a2 + w5*b2, y3 = w3*a3 + w6*b3, поэтому у меня есть 6 гирь для тренировки. Это похоже на поэлементное умножение, но умножаемые числа - это веса, которые нужно обучить. Я попробовал следующие коды, но обнаружил, что это не то, что я хочу.

# output_a & output_b are size (3,1)
merge = concatenate([output_a, output_b], axis=2)
# merge is (3,2)
output_y = Dense(1, use_bias=False)(merge)
# output_y is (3,1)

Я считаю, что в слое Плотность число обучающих параметров равно 2. Я думаю, это означает, что у него просто 2 веса (то есть w1=w2=w3 и w4=w5=w6). Я не уверен, как это исправить. Спасибо всем за помощь!

Редактировать: Кто-то сказал мне, что, возможно, я должен определить слой, который я хочу сам. Так нет ли какой-либо функции, которую я могу использовать для достижения этой цели?

Редактировать: я добавляю рисунок ниже и думаю, что он может описать мой вопрос.

цифра, которая описывает мой вопрос

1 Ответ

0 голосов
/ 24 мая 2019
from keras.layers import Input, Dense,multiply,add
from keras.models import Model

output_a = Input(shape=(3,))
output_b = Input(shape=(3,))
weights_a = Dense(3,use_bias=False)(output_a)
weights_b = Dense(3,use_bias=False)(output_b)
a_weighted = multiply([output_a,weights_a])
b_weighted = multiply([output_b,weights_b])
output_y = add([a_weighted,b_weighted])

весовые коэффициенты, полученные при самостоятельном вводе

...