【问题标题】:How to use TimeDistributed layer with Concatenate in TensorFlow?如何在 TensorFlow 中使用带有 Concatenate 的 TimeDistributed 层?
【发布时间】:2020-12-04 17:33:27
【问题描述】:

我有以下型号。

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

def get_model():
    input_img = keras.Input(shape=(None, 5, 5, 1), name='image')
    input_vec = keras.Input(shape=(None, 3), name='bvec')
    
    x = layers.TimeDistributed(layers.Conv2D(50, 3, activation='relu'), name='conv_1')(input_img)
    x = layers.TimeDistributed(layers.Flatten(), name='flatten')(x)
    x = layers.TimeDistributed(layers.Concatenate(), name='concat')([x, input_vec])
    
    output = layers.GRU(units=10, name='gru')(tensor)
    
    model = keras.models.Model(inputs=[input_img, input_vec], outputs=output)

m = get_model()

作为输入,我有一系列图像和矢量对。

一般的想法是,我希望将一系列图像分别输入到 CNN,然后与一系列相关输入向量连接,然后传递到 RNN 单元。类似的想法可以在on a medium blog 找到,尽管在那篇文章中只有一个图像输入序列,没有向量序列。

问题发生在连接层。这是回溯的结尾:

TypeError: Dimension value must be integer or None or have an __index__ method, got value 'TensorShape([None, None, 450])' with type '<class 'tensorflow.python.framework.tensor_shape.TensorShape'>'

我想这可能是我的一个语法错误。

如何在 TimeDistributed 基础上连接两个输入?

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    要连接两个张量,请使用层 Concatenate 并正确设置轴,在您的情况下为 2。

    固定代码:

    input_img = keras.Input(shape=(None, 5, 5, 1), name='image')
    input_vec = keras.Input(shape=(None, 3), name='bvec')
    
    x = layers.TimeDistributed(
        layers.Conv2D(50, 3, activation='relu'), name='conv_1')(input_img)
    
    x = layers.TimeDistributed(
        layers.Flatten(), name='flatten')(x)
    
    x = layers.Concatenate(axis=2)([x, input_vec])
    output = layers.GRU(units=10, name='gru')(x)
    
    model = keras.models.Model(
        inputs=[input_img, input_vec], outputs=output)
    
    model.compile(loss='mse')
    
    model.fit(
        [np.random.randn(8,4,5,5,1), np.random.randn(8,4,3)],
         y=np.random.randint(0,10,8))
    

    输出:

    1/1 [==============================] - 0s 1ms/step - loss: 29.4364
    

    【讨论】:

    • 谢谢,所以串联层实际上是“时间分布”,因为它的输入维度可能包括时间序列维度?在这种情况下axis=2 等价于axis=-1,这是默认的吗?
    猜你喜欢
    • 2017-07-23
    • 2017-08-03
    • 1970-01-01
    • 2020-05-15
    • 2019-03-12
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多