Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 为什么';当一个等价的二次模型工作时,张量流三次模型工作吗?_Python 3.x_Intellij Idea_Tensorflow - Fatal编程技术网

Python 3.x 为什么';当一个等价的二次模型工作时,张量流三次模型工作吗?

Python 3.x 为什么';当一个等价的二次模型工作时,张量流三次模型工作吗?,python-3.x,intellij-idea,tensorflow,Python 3.x,Intellij Idea,Tensorflow,在这个示例代码中(大部分类似于线性回归的示例代码),TensorFlow应该为构成立方体的给定点查找a、b、c和d值。在这种情况下,它应该是0x^3+0x^2+1x+0,但会逐渐变大,直到它到达nan 奇怪的是,相同的代码对行进行了修改: model=a*x*x*x+b*x*x+c*x+d 到 model=a*x*x+b*x+c 将给出正确的输出(当然是二次而不是三次)。有什么问题吗 此处代码: import os import tensorflow as tf import numpy as

在这个示例代码中(大部分类似于线性回归的示例代码),TensorFlow应该为构成立方体的给定点查找
a、b、c和d
值。在这种情况下,它应该是
0x^3+0x^2+1x+0
,但会逐渐变大,直到它到达
nan

奇怪的是,相同的代码对行进行了修改:

model=a*x*x*x+b*x*x+c*x+d

model=a*x*x+b*x+c
将给出正确的输出(当然是二次而不是三次)。有什么问题吗

此处代码:

import os
import tensorflow as tf
import numpy as np

# Don't remove this, I need it to mitigate tf build warnings
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# Model parameters
a = tf.Variable([1.], tf.float64)
b = tf.Variable([1.], tf.float64)
c = tf.Variable([1.], tf.float64)
d = tf.Variable([1.], tf.float64)
# Model input and output
x = tf.placeholder(tf.float32)
model = a * x * x * x + b * x * x + c * x + d
y = tf.placeholder(tf.float32)
# Loss
squared_deltas = tf.square(model-y)
loss = tf.reduce_sum(squared_deltas)
# Optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# Training Data
x_train = [-2, -1, 0, 1, 2]
y_train = [-2, -1, 0, 1, 2]
# Training Loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for i in range(1000):
    curr_a, curr_b, curr_c, curr_d = sess.run([a, b, c, d], {x: x_train, y: y_train})
    print("Formula: %s x^3 + %s x^2 + %s x + %s" % (curr_a, curr_b, curr_c, curr_d))
    sess.run([train], {x: x_train, y: y_train})
# Evaluate Training Accuracy
curr_a, curr_b, curr_c, curr_d = sess.run([a, b, c, d], {x: x_train, y: y_train})
print("Formula: %s x^3 + %s x^2 + %s x + %s" % (np.round(curr_a), np.round(curr_b), np.round(curr_c), np.round(curr_d)))
关于梯度 现在有一个更大的可能损失函数,你的梯度0.01太大,这使得修正变得不稳定

此外,为了适应较小的梯度,你需要更多的步骤。这是工作代码

代码 输出 最后评论(更新) 这个问题实际上来自以下几行:

# Loss
squared_deltas = tf.square(model-y)
loss = tf.reduce_sum(squared_deltas)
当我们加上x^3项时,损失的梯度可以变得更大

另一个解决方案是将损失函数改为使用tf.reduce_均值。我第一次看代码时没有看到这个

# Loss
squared_deltas = tf.square(model-y)
loss = tf.reduce_mean(squared_deltas)
# Optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
如果您使用tf.reduce\意味着您的工作流不必在每次更改批大小或参数数量时重新调整。这是我现在首选的解决方案


干杯

谢谢你这么详细的回答。您是否介意澄清为什么向有界变量添加输出有助于减少损失?另外,三角洲的平方有什么意义?嗨@EvanWeissburg-如果这解决了你的问题(确实如此),请接受它作为正确答案。至于三角洲的平方,这是衡量答案有多不正确的一种方法。它将为错误更大的错误提供更大的更正。。。就在广场上。如果您熟悉RMS(均方根)误差,则这是误差的均方部分。例如,如果您有4个训练示例,每个训练示例的abs增量误差为[0,0,0,10],则基本上意味着您缺少一个数据点。相反,如果您的abs增量错误为[3,3,3,3],那么您的函数可能没有过度拟合。[0,0,0,10]的平方和为100,其中[3,3,3,3]的平方和为37。如您所见,使用平方和表示[3,3,3,3]优于[0,0,0,10]。这是有道理的。为什么将输出添加到一个无界变量会像您最后的评论中那样有助于避免丢失?嘿,我将解决方案更新为我的首选解决方案。我刚才注意到您正在使用tf.reduce_sum。在处理了不同项目上的可变批量大小和可变功能大小后,我发现tf.reduce_mean可以很好地处理这些情况,因为它有明显的缺陷。(因为您不希望您的损失是功能数量的函数)
# Loss
squared_deltas = tf.square(model-y)
loss = tf.reduce_sum(squared_deltas)
# Loss
squared_deltas = tf.square(model-y)
loss = tf.reduce_mean(squared_deltas)
# Optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)