我正在尝试在TensorFlow中使用自定义图层训练模型。 我的最后一层有问题,我正在尝试构建一个可获取一批图像[None,100,100,1]并返回10个不同正方形区域之和的层,因此输出应为[None ,10]。
我尝试了一些不同的方法,但均未成功。 我尝试过:
output = tf.concat([tf.reshape(tf.math.reduce_sum(inputs[34:42, 28:40,0]), [1,]),
tf.reshape(tf.math.reduce_sum(inputs[34:42, 44:56,0]), [1,]),
tf.reshape(tf.math.reduce_sum(inputs[34:42, 60:72,0]), [1,]),
tf.reshape(tf.math.reduce_sum(inputs[46:54, 20:32,0]), [1,]),
tf.reshape(tf.math.reduce_sum(inputs[46:54, 36:48,0]), [1,]),
tf.reshape(tf.math.reduce_sum(inputs[46:54, 52:64,0]), [1,]),
tf.reshape(tf.math.reduce_sum(inputs[46:54, 68:80,0]), [1,]),
tf.reshape(tf.math.reduce_sum(inputs[58:66, 28:40,0]), [1,]),
tf.reshape(tf.math.reduce_sum(inputs[58:66, 44:56,0]), [1,]),
tf.reshape(tf.math.reduce_sum(inputs[58:66, 60:72,0]), [1,])], axis= 0)
和类似的求和函数,但是无法将形状的第一个维度设为“无”。
我试图通过将输入重塑为正确的形状然后乘以0并添加一个大小为[10]的张量来“作弊”。形状正确,但是模型没有训练。
是否有适当的方法来做到这一点?我在这个问题上坚持了好几个星期,没有运气。
如果我放置一个不满足我想要的功能但其输出形状正确的图层,则模型可以很好地进行训练:
class output_layer(tf.keras.Model):
def __init__(self, shape_input):
self.shape_input = shape_input
super(output_layer, self).__init__()
def call(self, inputs):
inputs = tf.math.multiply(inputs,tf.math.conj(inputs))
temp = tf.math.reduce_sum(inputs, axis=2)
temp = tf.reshape(temp, [-1,10,10])
temp = tf.math.reduce_sum(temp, axis=2)
output = tf.cast(temp, tf.float32)
output = tf.keras.activations.softmax(output, axis=-1)
return output
如果有人可以帮助我,我将非常感谢!
谢谢!
答案 0 :(得分:1)
我修改了您的代码,并提出了以下建议:
output = tf.concat(
[tf.math.reduce_sum(inputs[:, 34:42, 28:40,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 34:42, 44:56,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 34:42, 60:72,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 46:54, 20:32,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 46:54, 36:48,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 46:54, 52:64,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 46:54, 68:80,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 58:66, 28:40,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 58:66, 44:56,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 58:66, 60:72,:], axis=[1,2])], axis=-1)
通知我将inputs[34:42, 28:40, 0]
更改为inputs[:, 34:42, 28:40,:]
。您可以将:
用于要保持不变的尺寸。我还指定了应减小的轴,因此,仅保留了未缩小规格的尺寸-在这种情况下,它是第一个和最后一个尺寸。在您的情况下,tf.math.reduce_sum
将产生形状[None,1]。
随之,我将tf.concat
的轴更改为-1,这是最后一层,因此它的形状为[None,10]。
为完整起见,您可以创建自己的图层。为此,您必须继承tf.keras.layers.Layer。
然后,您可以将其用作其他任何层。
class ReduceZones(tf.keras.layers.Layer):
def __init__(self):
super(ReduceZones, self).__init__()
def build(self, input_shapes):
return
def call(self, inputs):
output = tf.concat(
[tf.math.reduce_sum(inputs[:, 34:42, 28:40,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 34:42, 44:56,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 34:42, 60:72,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 46:54, 20:32,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 46:54, 36:48,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 46:54, 52:64,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 46:54, 68:80,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 58:66, 28:40,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 58:66, 44:56,:], axis=[1,2]),
tf.math.reduce_sum(inputs[:, 58:66, 60:72,:], axis=[1,2])], axis=-1)
return output