【问题标题】:Tensorflow: Regarding tensorflow functionsTensorflow:关于 tensorflow 函数
【发布时间】:2017-01-22 16:59:04
【问题描述】:

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

输入:浮点数列表(或动态数组。在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 循环创建函数并独立计算每一行并将它们连接起来,但我的导师要求我探索其他方法。

你能建议我如何解决这个问题吗?

【问题讨论】:

  • 你能给我们看看带有while循环的代码吗?
  • 你想对输入做什么?

标签: python tensorflow


【解决方案1】:

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

  1. 重复输入数组以创建一个平铺输入数据的方阵
  2. 创建一个由左上角组成的蒙版
  3. 使用掩码执行 softmax。请注意,我们不能在这里使用tf.nn.softmax,因为它也会给这些零提供很小的概率

这是执行此操作的 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

【讨论】:

    【解决方案2】:

    这对你的课程来说可能有点晚了,但希望它会对某人有所帮助。

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

    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
    

    这个函数应该泛化到任何一维input_张量并产生一个正方形len(input_)xlen(input_)张量。

    如果您的目标是训练 tensorflow 变量以准确生成所提供的输出,那么您可以使用损失函数和优化器训练 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})
    

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

    【讨论】:

    • 太晚了,我7月份毕业了。 :D
    猜你喜欢
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 2018-06-07
    • 1970-01-01
    • 2018-07-23
    • 2017-05-14
    相关资源
    最近更新 更多