tf.matmul无法正常工作

时间:2015-12-04 14:08:09

标签: python machine-learning tensorflow

我尝试在张量流中写入和(逻辑运算),有两个输入和两个权重乘以得到一个数字并将此数字加到偏差,我的问题在matmul中发送X(输入)和W(重量) )形状方法。 [[1], [1]] 对于X(垂直),和[0.49900547,0.49900547]为W(水平)得到一个数字作为结果,但它给我两个数字,我怎么做是多次正确? 这是我的代码>>

import tensorflow as tf
import numpy
rng = numpy.random

# Parameters
learning_rate = 0.01
training_epochs = 2000
display_step = 50

# Training Data
train_X = numpy.asarray([[[1.0],[1.0]],[[1.0],[0.0]],[[0.0],[1.0]],[[0.0],[0.0]]])
train_Y = numpy.asarray([1.0,0.0,0.0,0.0])
n_samples = train_X.shape[0]

# tf Graph Input
X = tf.placeholder("float",[2,1],name="inputarr")
Y = tf.placeholder("float",name = "outputarr")

# Create Model

# Set model weights
W = tf.Variable(tf.zeros([1,2]), name="weight")
b = tf.Variable(rng.randn(), name="bias")

# Construct a linear model
activation = tf.add(tf.matmul(X,W), b)
mulres = tf.matmul(X,W)

# Minimize the squared errors
cost = tf.reduce_sum(tf.pow(activation-Y, 2))/(2*n_samples) #L2 loss
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #Gradient descent

# Initializing the variables
init = tf.initialize_all_variables()

# Launch the graph
with tf.Session() as sess:
    sess.run(init)

    # Fit all training data
    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={X: x, Y: y})

        #Display logs per epoch step
        if epoch % display_step == 0:
            print "Epoch:", '%04d' % (epoch+1),  \
                "W=", sess.run(W), "b=", sess.run(b) , "x= ",x," y =", y," result :",sess.run(mulres,feed_dict={X: x})

    print "Optimization Finished!"
    print  "W=", sess.run(W), "b=", sess.run(b), '\n'


    # Testing example, as requested (Issue #2)
    test_X = numpy.asarray([[1.0,0.0]])
    test_Y = numpy.asarray([0])

    for x, y in zip(train_X, train_Y):
        print "x: ",x,"y: ",y
        print "Testing... (L2 loss Comparison)","result :",sess.run(mulres, feed_dict={X: x})
        print sess.run(tf.matmul(X, W),feed_dict={X: x})
        print "result :"
        predict = sess.run(activation,feed_dict={X: x})
        print predict

2 个答案:

答案 0 :(得分:3)

与标准矩阵乘法一样,如果A的形状为[m, k],而B的形状为[k, n],则tf.matmul(A, B)的形状为[m, n] (TensorFlow使用的顺序为m行,n列。)

在您的计划中,您正在计算tf.matmul(X, W)X被定义为形状为[2, 1]的占位符; W被定义为初始化为[1, 2]零矩阵的变量。因此,mulres = tf.matmul(X, W)将具有[2, 2]形状,这是我在本地运行代码时打印的内容(result: ...

如果要使用单个输出定义隐藏图层,则更改很简单:

W = tf.Variable(tf.zeros([1,2]), name="weight")

......应替换为:

W = tf.Variable(tf.zeros([2, 1]), name="weight")

(实际上,将权重初始化为tf.zeros会阻止它进行训练,因为所有输入元素都会在反向传播中获得相同的渐变。相反,您应该随机初始化它们,例如使用:

W = tf.Variable(tf.truncated_normal([2, 1], stddev=0.5), name="weight")

这将使网络能够为权重的每个组成部分学习不同的值。)

答案 1 :(得分:2)

matmul直接在张量上运行,在你的情况下有2行1列。

matmul中有一个参数转换任何一个条目,如:

matmul(X, W, transpose_a=True)

您可以在此处查看文档:{​​{3}}