我正在尝试为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'
非常欢迎任何有帮助的评论。