Tensorflow:关于张量流函数

时间:2017-01-22 16:59:05

标签: python tensorflow

我是张力流的新手。我有以下问题:

input:浮点数列表(或动态数组。在python列表中是要使用的数据类型) 输出:是一个大小为len(input)×len(input)

的二维数组

例1:

输入:

[1.0, 2.0, 3.0]

输出:

[[0.09003057, 0.24472847, 0.66524096], 
 [0.26894142, 0.73105858, 0.0       ], 
 [1.0,        0.0,        0.0       ]]

我尝试使用while循环创建函数并独立计算每一行并连接它们,但我的导师让我探索其他方法。

您能否就如何解决此问题向我提出建议?

2 个答案:

答案 0 :(得分:5)

您可以通过以下方法实现此目的:

  1. 重复输入数组以创建平铺输入数据的方形矩阵
  2. 创建一个包含左上角的面具
  3. 的面具
  4. 使用面罩做softmax。请注意,我们不能在此处使用tf.nn.softmax,因为它也会为那些零提供小概率
  5. 这是一个执行此操作的TensorFlow(v0.12.1)代码:

    def create_softmax(x):
        x_len = int(x.get_shape()[0])
    
        # create a tiled array
        # [1, 2, 3] 
        # =>
        # [[1,2,3], [1,2,3], [1,2,3]]
        x_tiled = tf.tile(tf.expand_dims(x, 0), [x_len, 1])
    
        # get the mask to do element-wise multiplication
        mask = tf.ones_like(x_tiled) # returns an array of the same size filled with 1
        mask = tf.matrix_band_part(mask, 0, -1) # zeros everythings except from the upper triangular part 
        mask = tf.reverse(mask, [False, True]) # reverses the y dimension
    
        # compute masked softmax
        exp = tf.exp(x_tiled) * mask
        sum_exp = tf.reshape(tf.reduce_sum(exp, reduction_indices=1), (-1, 1))
    
        x_softmax = exp / sum_exp
    
        return x_softmax
    

答案 1 :(得分:0)

这对你的班级来说可能有点晚了,但希望它能帮助别人。

如果您的目标是简单地输出len(input)xlen(input)数组,则可以在将其维度扩展为1xlen(input)之后,将len(input)x1张量与输入数组相乘:

input_ = tf.placeholder(tf.float32, [len(input)])
input_shape = input_.get_shape().as_list()
tfvar = tf.Variable(tf.random_normal([1,input_shape[0]], mean=0.0,
                                    stddev=.01, dtype=tf.float32))

def function(input_):
    x = tf.expand_dims(input_, axis=1) # dims = len(input)x1
    return tf.matmul(x,tfvar) # mtrx multiplication produces 3x3 mtrx

此函数应推广到任何1D input_张量并产生平方len(input_)xlen(input_)张量。

如果您的目标是训练tensorflow变量以准确生成提供的输出,则可以使用loss函数和优化器训练tfvar

desired_output = tf.constant([[0.09003057, 0.24472847, 0.66524096], 
                              [0.26894142, 0.73105858, 0.0       ], 
                              [1.0,        0.0,        0.0       ]],
                              dtype=tf.float32)

actual_output = function(input_)
loss = tf.reduce_mean(tf.square(actual_output-desired_output))
optimizer = tf.train.AdamOptimizer().minimize(loss)

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    cost, opt = sess.run([loss, optimizer], feed_dict={input_:input})

注意,如果您想要更强大的训练课程,请添加偏差,非线性和更多图层。