是否有一种张量流方法来提取/保存用于归一化的平均值和标准?



我正在使用data_norm = tf.nn.l2_normalize(data, 0)规范化我的输入训练数据。

数据形状为[None, 4]。每列都是一个功能。它可能看起来像这样:

data = [[-3., 0.2, 1.6, 0.5], 
[3.6, 1.5, -1.9, 0.71], 
...]

我知道给定训练集中的规范化,测试集也应该规范化,但使用训练集中stdmean。(我假设这也适用于 NN 的实际使用,即输入应该使用训练集mean进行规范化,std在馈送到 NN 之前(。

有没有办法从这个函数中提取/保存用于归一化的meanstd,这样我就可以使用用于归一化训练数据的相同平均值 std 来规范化我的测试集? 我知道如何用saver.save(sess, "checkpoints/" + save_id)节省重量等。有没有办法保存/加载标准,意思是这样?

tf.nn.l2_normalize使用输入数据的real_time平均值,则不能使用此函数将训练数据用于meanstd。 l2_normalize_docs

output_l2_normalize = input / sqrt(max(sum(input**2), epsilon))

注意:由于您正在尝试规范化输入数据,因此您可以预先计算全局(训练数据集(meanstd并编写自己的函数进行规范化。

我不是张量流方面的专家,但我很高兴分享对我有用的东西。在开始训练会话之前,我创建了两个额外的变量:

train_mean = tf.Variable(np.mean(X_train), name='train_mean', dtype=tf.float64)
train_std = tf.Variable(np.std(X_train), name='train_std', dtype=tf.float64)
# initialize other variables here
with tf.session() as sess:
sess.run(init)
# normalize data
train_mean_py = sess.run(train_mean)
train_std_py = sess.run(train_std)
X_train = (X_train - train_mean_py) / train_std_py
X_test = (X_test - train_mean_py) / train_std_py
# do training
# save model

当我稍后在不同的脚本中恢复模型时,我执行以下操作

# define the variables that have to be later recovered
train_mean = tf.Variable(0., name='train_mean', dtype=tf.float64)
train_std = tf.Variable(0., name='train_std', dtype=tf.float64)

with tf.Session() as sess:
sess.run(init)
saver.restore(sess, "./trained_models/{0}.ckpt".format(model_name))
# normalize data
train_mean_py = sess.run(train_mean)
train_std_py = sess.run(train_std)
X_test = (X_test - train_mean_py) / train_std_py

从文档中:

对于 dim = 0 的一维张量,计算

output = x / sqrt(max(sum(x**2), epsilon))

epsilon 默认为 1e-12,或 -12 为 10。

因此,您可以将相同的函数应用于测试数据。

哼!

干杯

-马舒

最新更新