我试图恢复概率分布(不是概率密度,任何范围在[0,1]中的函数,其中f(x)编码成功概率为x)。我使用一个隐藏层,有10个神经元和softmax。这是我的代码:
import tensorflow as tf
import numpy as np
import random
import math
#Make binary observations encoded as one-hot vectors.
def makeObservations(probabilities):
observations = np.zeros((len(probabilities),2), dtype='float32')
for i in range(0, len(probabilities)):
if random.random() <= probabilities[i]:
observations[i,0] = 1
observations[i,1] = 0
else:
observations[i,0] = 0
observations[i,1] = 1
return observations
xTrain = np.linspace(0, 4*math.pi, 2001).reshape(1,-1)
distribution = map(lambda x: math.sin(x)**2, xTrain[0])
yTrain = makeObservations(distribution)
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
x = tf.placeholder("float", [1,None])
hiddenDim = 10
b = bias_variable([hiddenDim,1])
W = weight_variable([hiddenDim, 1])
b2 = bias_variable([2,1])
W2 = weight_variable([2, hiddenDim])
hidden = tf.nn.sigmoid(tf.matmul(W, x) + b)
y = tf.transpose(tf.matmul(W2, hidden) + b2)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y, yTrain))
step = tf.Variable(0, trainable=False)
rate = tf.train.exponential_decay(0.2, step, 1, 0.9999)
optimizer = tf.train.AdamOptimizer(rate)
train = optimizer.minimize(loss, global_step=step)
predict_op = tf.argmax(y, 1)
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
for i in range(50001):
sess.run(train, feed_dict={x: xTrain})
if i%200 == 0:
#proportion of correct predictions
print i, np.mean(np.argmax(yTrain, axis=1) ==
sess.run(predict_op, feed_dict={x: xTrain}))
import matplotlib.pyplot as plt
ys = tf.nn.softmax(y).eval({x:xTrain}, sess)
plt.plot(xTrain[0],ys[:,0])
plt.plot(xTrain[0],distribution)
plt.plot(xTrain[0], yTrain[:,0], 'ro')
plt.show()
问题:
执行tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y, yTrain))
和手动应用softmax与最小化交叉熵有什么区别?
模型通常不会捕捉到分发的最后一段时间。我已经成功了一次。也许它会通过做更多的训练来修复,但它看起来并不像它,因为结果经常稳定在最后的~20k跑。是否最有可能通过更好地选择优化算法,更多隐藏层或隐藏层的更多维度来改进? (由编辑部分回答)
接近x = 0的像差是典型的。是什么导致他们?
编辑:通过执行
,适应性得到了很大改善hiddenDim = 15
(...)
optimizer = tf.train.AdagradOptimizer(0.5)
并将sigmoids的激活更改为tanh。
进一步的问题:
更高的隐藏尺寸是否通常更容易制动出局部最小值?
隐藏层的最佳维度与输入维度dim(hidden) = f(dim(input))
之间的近似典型关系是什么?线性,弱于线性或强于线性?
答案 0 :(得分:1)
左侧过度贴合,右侧过度贴合。
由于小的随机偏差,隐藏单位在x=0
附近都接近零激活,并且由于不对称和大范围的x值,大多数隐藏单位在{{1}附近饱和。 }。
渐变不能通过饱和单位,因此它们都会被用来过度拟合他们能感觉到的值,接近于零。
我认为将数据集中在x = 10
上会有所帮助。
尝试减少权重初始化方差,和/或增加偏差初始化方差(或等效地,将数据范围缩小到较小的区域,如x=0
)。
如果你使用RBF并且将它们初始化为接近零,你会得到同样的问题。使用线性-Sigmoid单位,第二层使用线性sigmoids对来制作RBF。