我正在尝试建立一个基本的非线性回归模型,该模型将预测FTSE350中公司的回报指数。
我不确定我的偏见项在尺寸方面应该是什么样子,以及我是否在计算方法中正确使用了它:
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个神经元,但是我觉得我也可以在权重层中混合尺寸吗?
最佳答案
当为前馈完全连接的神经网络构造层时(如您的示例),偏置的形状应等于相应层中节点的数量。因此,在您的情况下,由于权重矩阵的形状为(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]
的形状设置为零。此后没有非线性(S型),这称为仿射变换,您可以在此处了解更多信息:https://en.wikipedia.org/wiki/Affine_transformation。
另一个很棒的资源是《斯坦福大学深度学习教程》,该教程很好地解释了这些前馈模型如何在这里工作:
http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeuralNetworks/。
希望能有所帮助!