Python Tensorflow多层感知器图;t收敛

Python Tensorflow多层感知器图;t收敛,python,tensorflow,Python,Tensorflow,我不熟悉python和tensorflow。在更好地(也许)理解DNN及其数学之后。我开始通过练习来学习使用tensorflow 我的一个练习是预测x^2。也就是说经过良好的训练。当我给出5.0时,它将预测25.0 参数和设置: 成本函数=E((y-y')^2) 两个隐藏层,它们完全连接 学习率=0.001 n_隐藏_1=3 n_hidden_2=2 n_输入=1 n_输出=1 def multilayer_perceptron(x, weights, biases): # Hidden

我不熟悉python和tensorflow。在更好地(也许)理解DNN及其数学之后。我开始通过练习来学习使用tensorflow

我的一个练习是预测x^2。也就是说经过良好的训练。当我给出5.0时,它将预测25.0

参数和设置: 成本函数=E((y-y')^2)

两个隐藏层,它们完全连接

学习率=0.001

n_隐藏_1=3

n_hidden_2=2

n_输入=1

n_输出=1

def multilayer_perceptron(x, weights, biases):
    # Hidden layer with RELU activation
    layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])
    layer_1 = tf.nn.relu(layer_1)
    # Hidden layer with RELU activation
    layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2'])
    layer_2 = tf.nn.relu(layer_2)
    # Output layer with linear activation
    out_layer = tf.matmul(layer_2, weights['out']) + biases['out']
    return out_layer

def generate_input():
    import random

    val = random.uniform(-10000, 10000)
    return np.array([val]).reshape(1, -1), np.array([val*val]).reshape(1, -1)


# tf Graph input
# given one value and output one value
x = tf.placeholder("float", [None, 1])
y = tf.placeholder("float", [None, 1])
pred = multilayer_perceptron(x, weights, biases)

# Define loss and optimizer
distance = tf.sub(pred, y)
cost = tf.reduce_mean(tf.pow(distance, 2))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

init = tf.initialize_all_variables()

# Launch the graph
with tf.Session() as sess:
    sess.run(init)
    avg_cost = 0.0

    for iter in range(10000):
        inp, ans = generate_input()
        _, c = sess.run([optimizer, cost], feed_dict={x: inp, y: ans})
        print('iter: '+str(iter)+' cost='+str(c))

然而,事实证明c有时变大,有时变低。(但它很大)

由于语句
val=random.uniform(-10000,10000)
,您的训练数据似乎有很大的范围,请尝试在训练前进行一些数据预处理。比如说,

val = random.uniform(-10000, 10000)
val = np.asarray(val).reshape(1, -1)
val -= np.mean(val, axis=0)
val /= np.std(val, axis=0)

至于损失值,有时会变大,有时会变小是可以的,只要确保损失随着训练时间的增加而减少就行了。PS:我们经常使用SGD优化器。

由于语句
val=random.uniform(-10000,10000)
,您的训练数据似乎有很大的范围,请尝试在训练前进行一些数据预处理。比如说,

val = random.uniform(-10000, 10000)
val = np.asarray(val).reshape(1, -1)
val -= np.mean(val, axis=0)
val /= np.std(val, axis=0)

至于损失值,有时会变大,有时会变小是可以的,只要确保损失随着训练时间的增加而减少就行了。PS:我们经常使用SGD优化器。

谢谢,我现在使用平均成本,我看到它下降了。我们应该调整投入的原因是为了使成本函数更好地发挥作用?我说得对吗?如果输入值范围太大。即使可以接受,成本也会增加。例如,100^2=10000,预测为9800。成本为200^2。然而,改变成本函数需要改变优化器。这是我到目前为止的理解。如果我错了,请纠正我是的,大值将需要更多的时间来收敛。关于优化器,不同的成本函数可以使用相同的优化器,但为了简单起见,我们通常选择SGD。谢谢,我现在使用平均成本,我看到它下降了。我们应该调整投入的原因是为了使成本函数更好地发挥作用?我说得对吗?如果输入值范围太大。即使可以接受,成本也会增加。例如,100^2=10000,预测为9800。成本为200^2。然而,改变成本函数需要改变优化器。这是我到目前为止的理解。如果我错了,请纠正我是的,大值将需要更多的时间来收敛。关于优化器,不同的成本函数可以使用相同的优化器,但为了简单起见,我们通常选择SGD。