当前,我正在使用tensorflow和keras API构建我的第一个神经网络。我想编写一个用于标准化输入的图层,因为在预处理后在模型中使用时进行预处理可能会导致错误。因此,我想将训练数据集传递给该图层的init函数,并计算均值和标准差。
问题是,我也想在训练后保存和加载模型。但是,如果我调用load_model(modelname),则会出错,因为init函数期望训练数据作为参数。此外,我不确定将mean和std指定为tf.Variable是否正确,或者是否有更好的方法来做到这一点,以便在使用load_model / load_weights时加载这些值。
每个答案我都很高兴。
以下代码代表了这种层的基本思想。
class stdLayer(tf.keras.layers.Layer):
def __init__(self, train_x, trainable=False,**kwargs):
super(stdLayer, self).__init__(trainable=trainable,**kwargs)
means=np.mean(train_x,axis=0)
stds=np.std(train_x,axis=0)
self.means = tf.Variable(means,
dtype=tf.float32,
name="means",
trainable=False)
self.stds = tf.Variable(stds,
dtype=tf.float32,
name="stds",
trainable=False)
def call(self, input):
input_st = (input-self.means)/self.stds
return input_st
也许您可能只是在模型的开头有一个BatchNormalization
层。
不过,在所有情况下,您都需要生产数据与培训数据采用相同的格式。