我正在尝试制作一个基本的非线性回归模型,用于预测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个神经元,但我觉得我可能会在权重层中混淆维度吗?
答案 0 :(得分: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]
,则可以获得该向量。 / p>
之后没有非线性(sigmoid),这称为仿射变换,你可以在这里阅读更多信息:https://en.wikipedia.org/wiki/Affine_transformation。
另一个很棒的资源是斯坦福深度学习教程,该教程很好地解释了这些前馈模型如何在这里工作: http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeuralNetworks/
希望有所帮助!
答案 1 :(得分:0)
我认为你的b1应该是维度10,你的代码应该运行
因为4是特征的数量,10是你的第一层神经元的数量(我认为在神经网络方面...)
然后你必须添加dimention = 10
的偏差此外,您可能会看到偏差为添加常量值= 1的额外功能。
如果您有足够的时间进行expalin,请参阅此pdf:https://cs.stanford.edu/~quocle/tutorial1.pdf