В Keras, как попарно объединить два входа с разным размером ввода? - PullRequest
1 голос
/ 24 апреля 2019

В качестве мотивирующего примера, скажем, у нас есть проблема прогнозирования веса ребра в сети разнородных узлов, например изображения и текст, и хотите объединение всех возможных пар входов. Простой пример того, как могут выглядеть данные:

# two inputs of different shape
x = np.array([[1, 1],
              [2, 2],
              [3, 3]])
y = np.array([[4, 4, 4],
              [5, 5, 5]])

# a predicted feature we'd like to model
z= np.array([0, 1, 1, 0, 0, 0])

joined = np.array([[1, 1, 4, 4, 4], 
                   [1, 1, 5, 5, 5], 
                   [2, 2, 4, 4, 4], 
                   [2, 2, 5, 5, 5], 
                   [3, 3, 4, 4, 4], 
                   [3, 3, 5, 5, 5]])
some_model.fit(inputs=[x,y], outputs=z)

И пример модели (показан с плотными слоями, но по духу это может быть любой слой или последовательность слоев):

enter image description here

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

Есть ли прямой способ достичь этого в Керасе?

1 Ответ

1 голос
/ 24 апреля 2019

Использование tf.tile(), tf.reshape() и tf.concat():

import tensorflow as tf
import numpy as np

x_data = np.array([[1, 1],
                   [2, 2],
                   [3, 3]], dtype=np.float32)
y_data = np.array([[4, 4, 4],
                   [5, 5, 5]], dtype=np.float32)

x = tf.placeholder(tf.float32, shape=(None, 2))
y = tf.placeholder(tf.float32, shape=(None, 3))
xshape = tf.shape(x)
yshape = tf.shape(y)
newshape = (xshape[0] * yshape[0], xshape[1] + yshape[1])

xres = tf.tile(x, multiples=[1, yshape[0]])
xres = tf.reshape(xres, [newshape[0], xshape[1]])
# `x` is now: [[1. 1.]
#              [1. 1.]
#              [2. 2.]
#              [2. 2.]
#              [3. 3.]
#              [3. 3.]]
yres = tf.tile(y, multiples=[xshape[0], 1])
# `y` is now: [[4. 4. 4.]
#              [5. 5. 5.]
#              [4. 4. 4.]
#              [5. 5. 5.]
#              [4. 4. 4.]
#              [5. 5. 5.]]
res = tf.concat([xres, yres], axis=1) # <-- this is your result
with tf.Session() as sess:
    evaled = res.eval({x:x_data, y:y_data})
    print(evaled)
# [[1. 1. 4. 4. 4.]
#  [1. 1. 5. 5. 5.]
#  [2. 2. 4. 4. 4.]
#  [2. 2. 5. 5. 5.]
#  [3. 3. 4. 4. 4.]
#  [3. 3. 5. 5. 5.]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...