简体   繁体   English

tf.matmul无法正常工作

[英]tf.matmul doesn't works as expected

i try to write and (logic operation) in tensor flow , there are two inputs and two weights multiply them to get one number and add this number to bias, my problem in matmul a send X (input) and W (weight) to method in shape . 我尝试在张量流中写入和(逻辑运算),有两个输入和两个权重乘以得到一个数字并将此数字加到偏差,我的问题在matmul中发送X(输入)和W(权重)到方法在形状。 [[1], [1]] for X (vertical), and [0.49900547 , 0.49900547] for W (horizontal) to get one number as result but it's give me two numbers , how i can make is multiply right ?? [[1],[1]]用于X(垂直),[0.49900547,0.49900547]用于W(水平)得到一个数字作为结果,但是它给了我两个数字,我怎么做才能乘以? this is my code >> 这是我的代码>>

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

As with standard matrix multiplication, if A has shape [m, k] , and B has shape [k, n] , then tf.matmul(A, B) has shape [m, n] ( m rows, n columns in the order TensorFlow uses). 与标准矩阵乘法一样,如果A具有形状[m, k] ,并且B具有形状[k, n] ,则tf.matmul(A, B)具有形状[m, n]m行, n列,订单TensorFlow使用)。

In your program, you are computing tf.matmul(X, W) . 在你的程序中,你正在计算tf.matmul(X, W) X is defined to be a placeholder with shape [2, 1] ; X被定义为具有形状[2, 1]的占位符; W is defined to be variable initialized to a [1, 2] matrix of zeros. W被定义为初始化为零的[1, 2]矩阵的变量。 As a result, mulres = tf.matmul(X, W) will have shape [2, 2] , which is what is printed ( result: ... ) when I run your code locally. 因此,当我在本地运行代码时, mulres = tf.matmul(X, W)将具有形状[2, 2] ,这是打印的result: ...result: ... )。

If you want to define a hidden layer with a single output, the change is simple: 如果要使用单个输出定义隐藏层,则更改很简单:

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

...should be replaced with: ......应该替换为:

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

(Indeed, initializing your weights to tf.zeros will prevent it from training, because all of the input elements will get the same gradient in backpropagation. Instead, you should initialize them randomly, for example using: (实际上,将权重初始化为tf.zeros会阻止它进行训练,因为所有输入元素在反向传播中都会得到相同的渐变。相反,您应该随机初始化它们,例如使用:

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

This will enable the network to learn different values for each component of the weight.) 这将使网络能够为权重的每个组成部分学习不同的值。)

matmul operates directly on the tensors which in your case have 2 rows and 1 column. matmul直接在张量上运行,在你的情况下有2行1列。

There is an argument in matmul to transpose either entry like: matmul有一个参数可以转换任何一个条目:

matmul(X, W, transpose_a=True)

You can check out the docs here: docs 你可以在这里查看文档: docs

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM