【问题标题】:How to concatenate a tensor to a keras layer along batch (without specifying batch size)?如何将张量沿批次连接到 keras 层(不指定批次大小)?
【发布时间】:2021-09-21 11:42:25
【问题描述】:

我想将嵌入层的输出与自定义张量 (myarr / myconst) 连接起来。我可以指定具有固定批量大小的所有内容,如下所示:

import numpy as np
import tensorflow as tf

BATCH_SIZE = 100
myarr = np.ones((10, 5))
myconst = tf.constant(np.tile(myarr, (BATCH_SIZE, 1, 1)))

# Model definition
inputs = tf.keras.layers.Input((10,), batch_size=BATCH_SIZE)
x = tf.keras.layers.Embedding(10, 5)(inputs)
x = tf.keras.layers.Concatenate(axis=1)([x, myconst])
model = tf.keras.models.Model(inputs=inputs, outputs=x)

但是,如果我不指定批量大小并平铺我的数组,即仅以下...

myarr = np.ones((10, 5))
myconst = tf.constant(myarr)

# Model definition
inputs = tf.keras.layers.Input((10,))
x = tf.keras.layers.Embedding(10, 5)(inputs)
x = tf.keras.layers.Concatenate(axis=1)([x, myconst])
model = tf.keras.models.Model(inputs=inputs, outputs=x)

...我收到一个错误,指定形状 [(None, 10, 5), (10, 5)] 无法连接。有没有办法添加这个None/batch_size 轴来避免平铺?

提前致谢

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    您想将形状为 (batch, 10, 5) 的 3D 张量连接到一个形状为 (10, 5) 的常量沿批次维度。为此,您的常量必须是 3D。所以你必须在 (1, 10, 5) 中重塑它并沿着 axis=0 重复它,以匹配 (batch, 10, 5) 的形状并进行连接。

    我们在 Lambda 层内执行此操作:

    X = np.random.randint(0,10, (100,10))
    Y = np.random.uniform(0,1, (100,20,5))
    
    myarr = np.ones((1, 10, 5)).astype('float32')
    myconst = tf.convert_to_tensor(myarr)
    
    def repeat_const(tensor, myconst):
        shapes = tf.shape(tensor)
        return tf.repeat(myconst, shapes[0], axis=0)
    
    inputs = tf.keras.layers.Input((10,))
    x = tf.keras.layers.Embedding(10, 5)(inputs)
    xx = tf.keras.layers.Lambda(lambda x: repeat_const(x, myconst))(x)
    x = tf.keras.layers.Concatenate(axis=1)([x, xx])
    model = tf.keras.models.Model(inputs=inputs, outputs=x)
    model.compile('adam', 'mse')
    
    model.fit(X, Y, epochs=3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 2022-01-02
      • 1970-01-01
      • 2021-11-18
      • 2020-12-19
      相关资源
      最近更新 更多