如何使用tf.keras编写自定义标准层

问题描述 投票:0回答:1

当前,我正在使用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
tensorflow keras neural-network keras-layer tf.keras
1个回答
0
投票

也许您可能只是在模型的开头有一个BatchNormalization层。

不过,在所有情况下,您都需要生产数据与培训数据采用相同的格式。

© www.soinside.com 2019 - 2024. All rights reserved.