【问题标题】:How do I remove the first element of a tensor in keras as a layer?如何删除 keras 中张量的第一个元素作为图层?
【发布时间】:2017-08-03 20:56:00
【问题描述】:

如何将 keras 中张量的第一个元素作为层移除? 例如:

layer = Input(input_shape=(100,),name='input')
layer = Conv1D(97,kernel_size=10,strides=10)(layer)
layer = >something that removes the first element<(layer)
layer = Flaten()(layer)
model = Model(input,layer)

此模型将具有 97*9 输出。 97 来自 Conv 层,每个 conv 过滤器将输出 10 节点,但这些节点中的第一个将被我正在寻找的层删除。因为conv层有(batch_size,10,97)的形状,所以我正在寻找一种方法来删除axis=1的第一个元素。

我该怎么做呢?我尝试使用 Lambda 层,但我不知道如何进行这项工作。

编辑: 我问这个问题是因为我想做的是如果我有一层形状(batch_size, x, y) 我想将其转换为形状(batch_size, 0.5x, 2y),如果x 是例如10,元素0,2,4,6,81,3,5,7,9 相互堆叠。现在我正在使用Maxpooling1D(pool_size=1, strides=2) 来生成0,2,4,6,8。要生成1,3,5,7,9,我必须在应用 maxpooling 层之前以上述方式从一开始就删除 1 个元素。非常感谢您的宝贵时间!

【问题讨论】:

  • +1。我也需要它,以便在左 LSTM 和右 LSTM 之间实现偏移为 2 的双向 LSTM
  • @NadavB 嘿,我为你添加了一个答案 :)

标签: keras conv-neural-network


【解决方案1】:

因为@NadavB 想知道答案:

layer = Input(input_shape=(100,),name='input')
layer = Conv1D(97,kernel_size=10,strides=10)(layer)
layer = Lambda(lambda x : x[:,1:,:])(layer)
layer = Flaten()(layer)
model = Model(input,layer)

希望对你有所帮助:)

【讨论】:

    【解决方案2】:

    如果您的唯一目标是从卷积中获得 9 个值而不是 10 个,您为什么不试试这个:

    layer = Conv1D(97,kernel_size=11,strides=11)(layer)

    ?因为如果您删除第一个元素,则意味着您不关心序列的前 10 个值,因此您最好提供 90 个值的序列而不是 100 个...... 如果您关心这 10 个第一个值,并且只想输出更少,那么请使用更大的内核 :-)

    这有帮助吗?否则我们可以找出一个可以解决问题的 lambda 层

    【讨论】:

    • 非常感谢您的回答!我更新了我原来的帖子,以更清楚地说明我为什么要使用它。
    【解决方案3】:

    如果是时间顺序,我会这样做:

    def firstElementRemoved(inputTensor):
        return inputTensor[:, 1:]
    
    LSTMMinusFirstElement  = Lambda(firstElementRemoved) (LSTM)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      相关资源
      最近更新 更多