一、random_normal与truncated_normal模型
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
shape:1-D向量
mean :均值,默认为0,即正态分布中的
μ
stddev :标准差,默认为1,即正态分布中的
σ
seed : 种子,同一个seed下的分布值均相同;
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
函数内参数定义均相同,与randowm_normal不同的是,truncated_normal是截断正态分布,会删除大于2个stddev的x值;
二、原理
正态分布:
其中:
x的均值
x的标准差:
若为截断分布(truncated_normal),则x的取值范围
即:
三、实例
例1:验证截断分布区间
import tensorflow as tf
a = tf.truncated_normal([10],mean=0.0,stddev=0.1)
b = tf.truncated_normal([10],mean=2.0,stddev=0.1)
sess = tf.Session()
tf.initialize_all_variables()
print("the a is")
print(sess.run(a))
print("the b is")
print(sess.run(b))
结果:
the a is
[-0.10900167 0.09532924 -0.00237158 0.07574951 0.00401584 0.01767288
-0.04099744 0.15777075 -0.02535285 -0.03226915]
the b is
[ 2.08254194 1.81895053 2.11536264 2.02514029 2.16055202 1.96626019
1.99408579 2.05209327 2.02856874 2.02580094]
手动计算:
a的均值:
Meana
= 0 =mean;
a的取值范围:
(-0.2,0.2)
b的均值:
Meanb
= 2;
a的取值范围:
(-1.8,2.2)
上述运行结果与分析是一致的;
例2:验证random_normal的概率分布区间
在正态分布中,1个标准差之内的比率合起来为68%,根据正态分布,两个标准差之内的比率合起来为95%;三个标准差之内的比率合起来为99%。
即:对于标准正态分布:
(-1,1)的分布比列为68%;
(-2,2)的分布比例为95%;
(-3 , 3)的分布比例为99%;
import tensorflow as tf
c = tf.random_normal([50],mean=0.0,stddev=1.0)
sess = tf.Session()
tf.initialize_all_variables()
print("the c is")
print(sess.run(c))
输出结果:
the c is
[-1.41222632 -0.75168908 1.49230027 -1.41195393 -0.12301262 0.90974045
1.11831224 2.16217065 1.82944071 -0.56059802 -1.0226723 -0.52069885
-0.7191155 -0.15144281 -0.40595549 -0.58284873 0.32606429 0.22194926
-0.91442436 -0.12363236 -0.68461865 -0.41318798 -1.08459747 -0.59496629
0.32996842 1.50883079 -0.82251173 -0.96032548 -0.48077932 -0.42245671
-0.14041233 -0.66213471 -0.34750465 -0.21767929 0.05018979 -0.31193626
-0.35000741 -0.33972734 0.8502301 0.4139671 0.52582425 0.12983814
-0.46988574 0.46856686 0.78250223 0.03054166 -1.24476206 -0.49044105
-0.04101983 -0.65254647]
统计:
(-1,1)共有33个,占比66%;
(-2,2)共有48个,占比96%;
(-3,3)之间共有50个,占比100%;
上述分布的比例与标准正态分布一致
例3:验证seed的用法
import tensorflow as tf
a = tf.truncated_normal([10],mean=0.0,stddev=0.1,seed=1)
b = tf.truncated_normal([10],mean=0.0,stddev=0.1,seed=1)
c = tf.truncated_normal([10],mean=0.0,stddev=0.1)
sess = tf.Session()
tf.initialize_all_variables()
print("the a is")
print(sess.run(a))
print("the b is")
print(sess.run(b))
print("the c is")
print(sess.run(c))
输出结果:
the a is
[-0.08113182 0.14845988 0.00653294 0.00992484 0.06396971 0.16108713
0.01635356 -0.15157056 0.13587774 0.05417413]
the b is
[-0.08113182 0.14845988 0.00653294 0.00992484 0.06396971 0.16108713
0.01635356 -0.15157056 0.13587774 0.05417413]
the c is
[ 0.11214073 0.09000708 -0.15859528 -0.0467976 0.05177388 0.00449503
-0.0553239 0.01862092 -0.07301219 -0.03918289]
比较可知:
因为a与b结果相同,与c则不同。
这是由于a与b指定了相同的seed,因此它们每次分配的值均相同,而c则没有指定相同的seed,则与a,b均不同。