使用TensorFlow在我的非线性回归模型中初始化偏差项

时间:2017-07-26 15:22:15

标签: python python-2.7 tensorflow neural-network non-linear-regression

我正在尝试制作一个基本的非线性回归模型,用于预测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个神经元,但我觉得我可能会在权重层中混淆维度吗?

2 个答案:

答案 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