【发布时间】:2018-09-15 02:02:20
【问题描述】:
短版:
我有一个自定义模型,其层可以通过值sigma 进行参数化。
我正在将此模型与 Tensorflow Estimator 一起使用:
classifier = tf.estimator.Estimator(model_fn=model_fun)
例如,训练声明如下:
# Train the model
train_input_fn=tf.estimator.inputs.numpy_input_fn(x={"x": train_data},
batch_size=batch_size, num_epochs=nEpochs, shuffle=True)
classifier.train(input_fn=train_input_fn,max_steps=nSteps)
在此设置中,我如何将 sigma 传递给我的自定义 Estimator,以便可以使用不同的值对其进行训练/评估?
加长版:
我正在研究这个 DNN 自动编码器,为此我有一个层,它通过考虑已知标准偏差 sigma 分布中的 random_normal() 值来添加高斯噪声。
这是一个通信系统的模型,输出 logits(来自最后一层)是使用 model.predict() 函数检索的,我的指标,即误码率是由 Tensor Flow 1.5 中的自定义函数计算的,Python 3.5,Windows 10。
问题如下:
我想针对 sigma=sigma1 训练系统,并检索输出 logits。(这部分很好,我能够获得所需的输出。)
我还想使用定义的相同估计器(在同一程序中)预测 sigma=sigma2、sigma=sigma3、sigma=sigma4 等的输出。
我的 DNN 看起来像这样,并且在模型函数中定义:
输入第一层热编码值在此处输入。
密集+ReLU
密集+线性
归一化层
-
添加噪声:这里我在前一层的输出中添加了一个 tf.random_normal(stddev=sigma)。这是我希望帮助我了解如何为每次运行(训练/测试)使用不同 sigma 的地方。我想你可以说 sigma 应该是一个参数,每次测试运行可以有不同的值。
gnoise=tf.random_normal(mean=0,stddev=sigma) Then the layer's output=norm(which is the prev layer's output)+gnoise 密集+RELU
Softmax-输出为 Logits
我将我的估算器定义为:
classifier = tf.estimator.Estimator(model_fn=model_fun)
训练声明如下:
# Train the model
train_input_fn=tf.estimator.inputs.numpy_input_fn(x={"x": train_data},
batch_size=batch_size, num_epochs=nEpochs, shuffle=True)
classifier.train(input_fn=train_input_fn,max_steps=nSteps)
predict函数被声明并调用为:
pred_input_fn=tf.estimator.inputs.numpy_input_fn(x={"x": test_data},
batch_size=batch_size, num_epochs=nEpochs, shuffle=False)
pred_results = classifier.predict(input_fn=pred_input_fn)
【问题讨论】:
-
请提供您的高斯噪声层代码,以便大家回复。
-
gnoise=tf.random_normal(mean=0,stddev=sigma) 然后层的输出=norm(即prev层的输出)+gnoise
标签: python numpy tensorflow deep-learning tensorflow-estimator