使用 TensorFlow 在我的非线性回归模型中初始化偏差项
Initializing a bias term in my nonlinear regression model using TensorFlow
我正在尝试建立一个基本的非线性回归模型来预测 FTSE350 中公司的 return 指数。
我不确定我的偏差项在维度方面应该是什么样子以及我是否在计算方法中正确使用它:
w1 = tf.Variable(tf.truncated_normal([4, 10], mean=0.0, stddev=1.0, dtype=tf.float64))
b1 = tf.Variable(tf.constant(0.1, shape=[4,10], dtype = tf.float64))
w2 = tf.Variable(tf.truncated_normal([10, 1], mean=0.0, stddev=1.0, dtype=tf.float64))
b2 = tf.Variable(tf.constant(0.1, shape=[1], dtype = tf.float64))
def calculations(x, y):
w1d = tf.matmul(x, w1)
h1 = (tf.nn.sigmoid(tf.add(w1d, b1)))
h1w2 = tf.matmul(h1, w2)
activation = tf.add(tf.nn.sigmoid(tf.matmul(h1, w2)), b2)
error = tf.reduce_sum(tf.pow(activation - y,2))/(len(x))
return [ activation, error ]
我最初的想法是它应该和我的体重一样大,但我得到了这个错误:
ValueError: Dimensions must be equal, but are 251 and 4 for 'Add' (op: 'Add') with input shapes: [251,10], [4,10]
我尝试过不同的想法,但似乎没有任何进展。
(我的输入数据有 4 个特征)
我尝试过的网络结构是输入层有4个神经元,隐藏层有10个,后面输出有1个,但我觉得我也可能把权重层的维度搞混了?
我认为你的 b1 应该是维度 10,你的代码应该 运行
因为 4 是特征数,10 是第一层中的神经元数(我认为是神经网络...)
那么你必须添加一个维度偏差 = 10
此外,您可能还会将偏差视为添加常量值 = 1 的额外特征。
如果你有时间可以看看这个 pdf 很好地解释:https://cs.stanford.edu/~quocle/tutorial1.pdf
当您为前馈全连接神经网络构建层时(如您的示例),偏差的形状应等于相应层中的节点数。所以在你的例子中,由于你的权重矩阵的形状为 (4, 10)
,你在该层中有 10 个节点,你应该使用:
b1 = tf.Variable(tf.constant(0.1, shape=[10], type = tf.float64))
这样做的原因是当您执行 w1d = tf.matmul(x, w1)
时,您实际上得到了一个形状为 (batch_size, 10)
的矩阵(如果 batch_size
是输入矩阵中的行数)。这是因为您是将 (batch_size, 4)
矩阵乘以 (4, 10)
权重矩阵的矩阵。然后,您在 w1d
的每一列中添加一个偏差,它可以表示为一个 10 维向量,如果您制作 b1
[10]
的形状,您将得到它。
之后没有非线性(sigmoid),这称为仿射变换,您可以在此处阅读更多信息:https://en.wikipedia.org/wiki/Affine_transformation。
另一个很棒的资源是斯坦福深度学习教程,它很好地解释了这些前馈模型的工作原理:
http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeuralNetworks/.
希望对您有所帮助!
我正在尝试建立一个基本的非线性回归模型来预测 FTSE350 中公司的 return 指数。
我不确定我的偏差项在维度方面应该是什么样子以及我是否在计算方法中正确使用它:
w1 = tf.Variable(tf.truncated_normal([4, 10], mean=0.0, stddev=1.0, dtype=tf.float64))
b1 = tf.Variable(tf.constant(0.1, shape=[4,10], dtype = tf.float64))
w2 = tf.Variable(tf.truncated_normal([10, 1], mean=0.0, stddev=1.0, dtype=tf.float64))
b2 = tf.Variable(tf.constant(0.1, shape=[1], dtype = tf.float64))
def calculations(x, y):
w1d = tf.matmul(x, w1)
h1 = (tf.nn.sigmoid(tf.add(w1d, b1)))
h1w2 = tf.matmul(h1, w2)
activation = tf.add(tf.nn.sigmoid(tf.matmul(h1, w2)), b2)
error = tf.reduce_sum(tf.pow(activation - y,2))/(len(x))
return [ activation, error ]
我最初的想法是它应该和我的体重一样大,但我得到了这个错误:
ValueError: Dimensions must be equal, but are 251 and 4 for 'Add' (op: 'Add') with input shapes: [251,10], [4,10]
我尝试过不同的想法,但似乎没有任何进展。
(我的输入数据有 4 个特征)
我尝试过的网络结构是输入层有4个神经元,隐藏层有10个,后面输出有1个,但我觉得我也可能把权重层的维度搞混了?
我认为你的 b1 应该是维度 10,你的代码应该 运行
因为 4 是特征数,10 是第一层中的神经元数(我认为是神经网络...)
那么你必须添加一个维度偏差 = 10
此外,您可能还会将偏差视为添加常量值 = 1 的额外特征。
如果你有时间可以看看这个 pdf 很好地解释:https://cs.stanford.edu/~quocle/tutorial1.pdf
当您为前馈全连接神经网络构建层时(如您的示例),偏差的形状应等于相应层中的节点数。所以在你的例子中,由于你的权重矩阵的形状为 (4, 10)
,你在该层中有 10 个节点,你应该使用:
b1 = tf.Variable(tf.constant(0.1, shape=[10], type = tf.float64))
这样做的原因是当您执行 w1d = tf.matmul(x, w1)
时,您实际上得到了一个形状为 (batch_size, 10)
的矩阵(如果 batch_size
是输入矩阵中的行数)。这是因为您是将 (batch_size, 4)
矩阵乘以 (4, 10)
权重矩阵的矩阵。然后,您在 w1d
的每一列中添加一个偏差,它可以表示为一个 10 维向量,如果您制作 b1
[10]
的形状,您将得到它。
之后没有非线性(sigmoid),这称为仿射变换,您可以在此处阅读更多信息:https://en.wikipedia.org/wiki/Affine_transformation。
另一个很棒的资源是斯坦福深度学习教程,它很好地解释了这些前馈模型的工作原理: http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeuralNetworks/.
希望对您有所帮助!