我一直在阅读有关tensorflow的指南:https://medium.com/all-of-us-are-belong-to-machines/the-gentlest-introduction-to-tensorflow-248dc871a224
......而且大多数情况下,我看到发生了什么。
然而,example code中的线性模型定义了这样的线性模型:
# Model linear regression y = Wx + b
x = tf.placeholder(tf.float32, [None, 1])
W = tf.Variable(tf.zeros([1,1]))
b = tf.Variable(tf.zeros([1]))
product = tf.matmul(x,W)
y = product + b
y_ = tf.placeholder(tf.float32, [None, 1])
# Cost function sum((y_-y)**2)
cost = tf.reduce_mean(tf.square(y_-y))
# Training using Gradient Descent to minimize cost
train_step = tf.train.GradientDescentOptimizer(0.0000001).minimize(cost)
问题是:Wx + b
为什么用这些值表示:
x = tf.placeholder(tf.float32, [None, 1])
W = tf.Variable(tf.zeros([1,1]))
b = tf.Variable(tf.zeros([1]))
? [None, 1]
,[1, 1]
?为什么[None, 1]
代表x而[1, 1]
代表W?
如果[1, 1]
是大小为1的1个元素,那么为什么b只是[1]
,这意味着什么? 1个大小为0的元素?
对于W = tf.Variable,第一个'1'是特征,房子大小,第二个'1'输出,房价。
这是否意味着如果我试图代表模型,请说:
y = Ax + Bz
这意味着我有两个'特征'(x和z),我的A和B值应该被塑造为[2,1]?这似乎不对......
这似乎完全不同于polynomial regression所做的,其中权重因子是形状[1]
。为什么会有所不同?
答案 0 :(得分:1)
我想也许你应该学习像线性代数这样的东西。
让我们从这一行# Model linear regression y = Wx + b
开始,这是您发布的代码中的第一行。实际上,它意味着两个矩阵运算。
第一个是Wx
,这意味着矩阵X
矩阵乘以x
。在您的情况下,意味着:
[x11, x21, x31, ..., xn1]T * [w] = [x11*w, x21*w, x31*w, ..., xn1*w]T
将Wx
设为R
(结果),我们可以将Wx + B
重写为R + B
。这是第二个矩阵运算。在您的情况下,意味着:
[x11*w, x21*w, x31*w, ..., xn1*w]T + [b] = [x11*w + b, x21*w + b, x31*w + b, ..., xn1*w + b]T
因此,如果您的输入中有多个要素,并且想要输出多个结果,那么模型的定义应为:
x = tf.placeholder(tf.float32, [None, your_input_features])
W = tf.Variable(tf.zeros([your_input_features, your_output_features]))
b = tf.Variable(tf.zeros([your_output_features]))
product = tf.matmul(x,W)
y = product + b
答案 1 :(得分:0)
原作者应该选择[1, 1]
形状,因为她/他想要比普通标量产品具有更广泛的功能。
这样,您可以将形状更改为[1, d]
,以便为每个样本提供d
个功能。
当然,还应该将x
的形状更改为d
。
答案 2 :(得分:0)
你熟悉线性代数吗?
形状的占位符[无,1]表示无限行和1列。 形状[1,1]的占位符表示1行1列。
形状[1,1]和[1]在这个意义上是不同的:
然后tf.matmul计算点积:x.W并添加b。 为了使张量流工作,张量必须具有相似的形状,这就是W为形状[1,1]而不仅仅是[1]的原因。
让我们拥有:
然后:
我希望这能回答你的问题