【问题标题】:Proper way to create a custom layer/function to rearrange layer values (Keras with Tensorflow)创建自定义层/函数以重新排列层值的正确方法(带有 Tensorflow 的 Keras)
【发布时间】:2019-08-12 21:38:02
【问题描述】:

我需要重新排列张量值,然后在 Keras 中对其进行重塑,但是我正在努力寻找在 Keras 中使用 Tensorflow 后端重新排列张量的正确方法。

此自定义层/函数将遍历值,然后通过步幅公式重新排列值 这似乎没有权重,所以我假设无状态并且不会影响反向传播。

但它需要列表切片:

out_array[b,channel_out, row_out, column_out] = in_array[b,i,j,k] 这只是我正在努力解决的组件之一。

这里是函数/层

def reorg(tensor, stride):

    batch,channel, height, width = (tensor.get_shape())
    out_channel = channel * (stride * stride)
    out_len = length//stride
    out_width = width//stride

    #create new empty tensor  
    out_array = K.zeros((batch, out_channel, out_len, out_width))

    for b in batch:    
        for i in range(channel):
            for j in range(height):
                for k in range(width):
                    channel_out = i + (j % stride) * (channel * stride) + (k % stride) * channel
                    row_out = j//stride
                    column_out = k//stride
                    out_array[b,channel_out, row_out, column_out] = K.slice(in_array,[b,i,j,k], size = (1,1,1,1))


    return out_array.astype("int")

我没有太多在 Keras 中创建自定义函数/层的经验, 所以不太确定我是否在正确的轨道上。

这是代码位根据步幅所做的事情(这里是 2):

https://towardsdatascience.com/training-object-detection-yolov2-from-scratch-using-cyclic-learning-rates-b3364f7e4755

【问题讨论】:

  • 您能否编辑您的问题并解释逻辑或这种“重新排列”?也许可以使用向量/矩阵运算来完成。
  • @today 很抱歉我添加了一张图片

标签: python tensorflow keras


【解决方案1】:

当您说重新排列时,您的意思是更改轴的顺序吗?有一个名为tf.transpose 的函数,您可以在自定义层中使用它。还有 tf.keras.layers.Permute 可以在没有任何自定义代码的情况下用于重新排序张量。

如果您询问如何创建自定义层,则需要实施一些方法。文档在这里解释得很好:Custom Layers

from tensorflow.keras import layers
import tensorflow as tf

class Linear(layers.Layer):

  def __init__(self, units=32):
    super(Linear, self).__init__()
    self.units = units

  def build(self, input_shape):
    self.w = self.add_weight(shape=(input_shape[-1], self.units),
                             initializer='random_normal',
                             trainable=True)
    self.b = self.add_weight(shape=(self.units,),
                             initializer='random_normal',
                             trainable=True)

  def call(self, inputs):
    return tf.matmul(inputs, self.w) + self.b

【讨论】:

  • 我添加了一张图片来展示重新排列。有必要创建一个完整的层吗?我的印象是只有当我需要节省权重时才需要图层,所以我希望我可以做一些自定义的重新排列,在 Tensorflow 中进行切片。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 2018-06-03
  • 2019-08-06
相关资源
最近更新 更多