我需要重新排列张量值,然后在Keras中对其进行重塑,但是我正在努力尝试使用Tensorflow后端在Keras中重新排列张量的正确方法。
此自定义图层/函数将迭代这些值,然后通过跨步公式重新排列这些值 这似乎没有权重,所以我假设是无状态的,不会影响反向传播。
尽管需要列表切片:
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),这是代码位的作用:
答案 0 :(得分: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