小编aph*_*ent的帖子

TensorFlow:沿轴的最大张量

我的问题有两个相互关联的部分:

  1. 如何计算张量的某个轴​​上的最大值?例如,如果我有

    x = tf.constant([[1,220,55],[4,3,-1]])
    
    Run Code Online (Sandbox Code Playgroud)

    我想要类似的东西

    x_max = tf.max(x, axis=1)
    print sess.run(x_max)
    
    output: [220,4]
    
    Run Code Online (Sandbox Code Playgroud)

    我知道有一个tf.argmax和一个tf.maximum,但是没有沿着单个张量的轴给出最大值.现在我有一个解决方法:

    x_max = tf.slice(x, begin=[0,0], size=[-1,1])
    for a in range(1,2):
        x_max = tf.maximum(x_max , tf.slice(x, begin=[0,a], size=[-1,1]))
    
    Run Code Online (Sandbox Code Playgroud)

    但它看起来不太理想.有一个更好的方法吗?

  2. 给定argmax张量的指数,我如何使用这些指数索引另一个张量?使用x上面的示例,我如何执行以下操作:

    ind_max = tf.argmax(x, dimension=1)    #output is [1,0]
    y = tf.constant([[1,2,3], [6,5,4])
    y_ = y[:, ind_max]                     #y_ should be [2,6]
    
    Run Code Online (Sandbox Code Playgroud)

    我知道切片,就像最后一行一样,在TensorFlow中还不存在(#206).

    我的问题是:对于我的特定情况,最好的解决方法什么(可能使用其他方法,如收集,选择等)?

    附加信息:我知道x并且y只会是二维张量!

python max deep-learning tensorflow tensor

28
推荐指数
1
解决办法
5万
查看次数

张量流中的损失限幅(在DeepMind的DQN上)

我正在尝试使用Deepmind在张量流中自己实现的DQN文件,并且在剪切损失函数时遇到了困难.

以下是描述损失裁剪的自然纸的摘录:

我们还发现将更新中的错误项剪辑在-1和1之间是有帮助的.因为绝对值损失函数| x | 对于x的所有正值,其导数为-1,对于x的所有正值,导数为1,将平方误差限制在-1和1之间,对应于使用绝对值损失函数(? 1,1)间隔.这种形式的错误限幅进一步提高了算法的稳定性.

(链接到完整论文:http://www.nature.com/nature/journal/v518/n7540/full/nature14236.html)

到目前为止我尝试过的是使用

clipped_loss_vec = tf.clip_by_value(loss, -1, 1)
Run Code Online (Sandbox Code Playgroud)

剪辑我在-1和+1之间计算的损失.在这种情况下,代理商没有学习正确的政策.我打印出网络的渐变,并意识到如果损失低于-1,渐变都会突然变为0!

我发生这种情况的原因是削减损失是(-inf,-1)U(1,inf)中的常数函数,这意味着它在这些区域中具有零梯度.这反过来确保整个网络中的梯度为零(想象一下,无论我提供给网络的任何输入图像,由于它已被剪切,损失在本地邻域中保持为-1).

所以,我的问题是两部分:

  1. Deepmind在摘录中究竟是什么意思?他们是否意味着低于-1的损失被削减为-1,高于+1的损失被削减为+1.如果是这样,他们是如何处理渐变的(即关于绝对值函数的那部分是什么?)

  2. 我应该如何在张量流中实现损耗限幅,使得梯度在限幅范围之外不会变为零(但可能保持在+1和-1)?谢谢!

neural-network deep-learning conv-neural-network tensorflow

9
推荐指数
1
解决办法
3889
查看次数

如何使用张量流中的QueueRunner将动态创建的输入图像添加到RandomShuffleQueue

我正在尝试用程序执行期间创建的图像训练CNN.我有一个游戏环境(不是由我创建的),它生成依赖于游戏中所采取的动作的屏幕图像.这些动作由学习的CNN控制.

然后将这些图像推入RandomShuffleQueue,从中将小批量出列并用于在正确的动作上训练CNN.我想异步地进行游戏(游戏和训练),游戏正在播放,并且它的屏幕被添加到RandomShuffleQueue中,该线程用于训练模型.这是我正在尝试的非常简化的版本.

import tensorflow as tf
from game_env import game


experience = tf.RandomShuffleQueue(10000,
                                1000, tf.float32,
                                shapes = [32,32],  
                                name = 'experience_replay')

def perceive(game):
    rawstate = game.grab_screen()
    enq = experience.enqueue(rawstate)
    return enq

#create threads to play the game and collect experience
available_threads = 4
coord = tf.train.Coordinator()
experience_runner = tf.train.QueueRunner(experience,
                                [perceive(game()) for num in range(available_threads)])

sess = tf.Session()
sess.run(tf.initialize_all_variables())
enqueue_threads = experience_runner.create_threads(sess, coord = coord, start = True)

with sess.as_default():
    while(1):
        print sess.run(experience.dequeue())
        time.sleep(.5)
Run Code Online (Sandbox Code Playgroud)

同时,game_env看起来像这样:

import tensorflow as tf
class game(object): …
Run Code Online (Sandbox Code Playgroud)

python numpy neural-network conv-neural-network tensorflow

2
推荐指数
1
解决办法
930
查看次数