在Keras或Tensorflow中,如何在模型中输入不同的样本大小和成对串联嵌入?

时间:2019-05-02 00:57:06

标签: python tensorflow keras deep-learning

在[此问题]的后续活动中,我们将要完成的一些注意事项:

  • 我们有两个输入XY,它们的样本大小分别为nm,并且布尔向量z的大小为nmz的每个元素表示XY中的两项是否某种匹配
  • 我们希望在XY上使用嵌入层(也许相同,也许不同),然后将这些嵌入层的输出成对级联以将输入派生到输出层。

以下是一个简单网络的示例:

enter image description here

链接的答案和其他一些资源可以帮助您理解本示例,该示例构建了一个模型,但在合适的时间抛出了此错误:ValueError: All input arrays (x) should have the same number of samples. Got array shapes: [(10, 2), (12, 2)]

Keras allow for skipping the dimension check的最新版本,可以在Tensorflow中跳过此检查吗?我也很乐意使用Keras,但不确定在模型中间如何在Keras中执行重塑和连接。

或者,这根本不可能吗?是扩展和成对连接先行输入的唯一选择吗?

import tensorflow as tf
from tensorflow import keras 
from tensorflow.keras import layers
import numpy as np

k = 2
N = 10
M = 12

x = np.random.randint(2, size = 2 * N).reshape((-1,2))
y = np.random.randint(2, size = 2 * M).reshape((-1,2))

x_rep = np.tile(x, (1, M)).reshape((-1,2))
y_rep = np.tile(y, (N, 1))

xy = np.concatenate((x_rep, y_rep), axis=1)
xy = xy.astype(bool)
z = (xy[:,0] == xy[:,2]) * (xy[:,1] ^ xy[:,3])

print(z[:20])
xy = xy.astype(int)
z = z.astype(int)


first = keras.Input(shape=(k,))
second = keras.Input(shape=(k,))

shared_dense = layers.Dense(k)

first_dense = shared_dense(first)
second_dense = shared_dense(second)

first_tiled = layers.Lambda(tf.tile, arguments={'multiples':[1, M]}, name='first_expanded' )(first_dense) #keras.backend.tile(first_dense, [1, M])
second_tiled = layers.Lambda(tf.tile, arguments={'multiples':[N,1]}, name='second_expanded')(second_dense) #keras.backend.tile(first_dense, [1, M])

first_reshaped = layers.Reshape((k,))(first_tiled)
concatenated = layers.Concatenate()([first_reshaped, second_tiled])
out = layers.Dense(1)(concatenated)
model = keras.Model([first, second], out)

keras.utils.plot_model(model, 'tf_nw.png', show_shapes=True)
model.compile('Adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit([x, y], z)

0 个答案:

没有答案