Tensorflow中的自定义规范化层

时间:2020-04-27 18:12:50

标签: python tensorflow keras

我正在尝试为Tensorflow(2.0)实现自定义标准化层。 该层应计算逐行最大值,然后返回归一化的输入:x_norm = x / max(x)

因此,我遵循了有关如何在TF中创建自定义图层的文档并提出了以下解决方案:

import numpy as np
import tensorflow as tf
from sklearn.datasets import make_regression
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Input


class NormalizationLayer(tf.keras.layers.Layer):

    def __init__(self):
        super(NormalizationLayer, self).__init__()

    def build(self, input_shape):
        batch_size = input_shape[0]
        self.max = self.add_weight(name='Max',
                                   shape=(batch_size, ),
                                   trainable=False)

    def call(self, inputs, *args, **kwargs):
        self.max.assign_add(tf.math.reduce_max(inputs, axis=1))
        return tf.transpose(tf.math.divide_no_nan(tf.transpose(inputs), self.max))

使用以下简单示例,该图层似乎完全在执行应做的事情:

x, y = make_regression(n_samples=10000, n_features=10, bias=0, noise=1)
x += 10

# Benchmark
x_max = np.max(x, axis=1)
x_norm = (x.T / x_max).T

# Layer
x_tf = tf.constant(x)
norm_layer = NormalizationLayer()
x_tf_norm = norm_layer(x_tf)
x_tf_norm = x_tf_norm.numpy()

print(x_norm[0, 0:5])
print(x_tf_norm[0, 0:5])

但是在顺序模式下使用同一层时,它将失败并显示TypeError:

model = Sequential()
model.add(Input(shape=(10, )))
model.add(NormalizationLayer())
model.add(Dense(16))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mae', metrics=['mae'])

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

非常欢迎任何有帮助的评论。

0 个答案:

没有答案
相关问题