小编bla*_*dog的帖子

如何仅为Tensorflow子图定义渐变?

第一:我和Tensorflow只有几天了,所以请耐心等待.

我从cifar10教程代码开始,我现在使用卷积和特征值分解的组合来打破符号差异.即图形构建,然后在调用train()脚本时停止"没有为操作定义梯度[...](操作类型:SelfAdjointEig)".这并不奇怪.

有问题的子图的输入仍然只是输入要素图和正在使用的过滤器,我有手头的渐变公式,它们应该是直接实现的,给定子图的输入和梯度到它的输出.

从我在文档中看到的内容,我可以为自定义Ops注册渐变方法,RegisterGradient或者使用实验来覆盖它们gradient_override_map.这两个应该让我访问我需要的东西.例如,在Github上搜索我发现了很多访问op的输入的例子op.input[0].

我的问题是我想基本上"快捷"整个子图,而不是单个操作,所以我没有单一的操作来装饰.由于这发生在cifar示例的一个卷积层中,我尝试使用该层的范围对象.从概念上讲,进入和退出该范围图形的内容正是我想要的,如果我能以某种方式覆盖整个范围的"已经"执行它的渐变.

我看到tf.Graph.create_op了(我认为)我可以用来注册一种新类型的操作,然后我可以用上述方法覆盖该操作类型的梯度计算.但我没有看到一种方法来定义该操作的前向传递而不用C++编写它...

也许我完全接近这个错误的方式?由于我的所有前向或后向操作都可以使用python接口实现,因此我显然希望避免在C++中实现任何内容.

tensorflow

17
推荐指数
1
解决办法
5995
查看次数

在Tensorflow中每行选择一个元素的优雅方法

鉴于...

  • A形状矩阵[m, n]
  • 一个I形状的张量[m]

我想JA哪里 获得一个元素列表J[i] = A[i, I[i]].

也就是说,I保存要从每行中选择的元素的索引A.

背景:我已经拥有了argmax(A, 1),现在我也想要了max.我知道我可以使用reduce_max.在尝试了一下后,我也想出了这个:

J = tf.gather_nd(A,
    tf.transpose(tf.pack([tf.to_int64(tf.range(A.get_shape()[0])), I])))
Run Code Online (Sandbox Code Playgroud)

to_int64是必要的,因为只有范围内生产int32argmax仅产生int64.

这两个人都没有让我觉得特别优雅.一个具有运行时开销(可能是关于因子n),另一个具有未知因素认知开销.我在这里错过了什么吗?

tensorflow

7
推荐指数
2
解决办法
2267
查看次数

C#中任意数量的类型参数

我需要将一个类型列表传递给一个方法,但我想确保(在编译时)所有这些都继承自BaseType.另外,我不知道必须传递多少种类型.

所以我认为这将是一个糟糕的方式:

public void DoSomething(params Type[] types)
Run Code Online (Sandbox Code Playgroud)

所以到目前为止我最终做的是这样的:

private void DoSomething(params Type[] types)

public void DoSomething<T1>() 
    where T1 : BaseType
{ 
    DoSomething(typeof(T1)); 
}

public void DoSomething<T1, T2>() 
    where T1 : BaseType
    where T2 : BaseType
{ 
    DoSomething(typeof(T1), typeof(T2)); 
}


public void DoSomething<T1, T2, T3>() 
    where T1 : BaseType
    where T2 : BaseType
    where T3 : BaseType{...}

// and so on...
Run Code Online (Sandbox Code Playgroud)

你明白了.所以问题是:你能做得更漂亮吗? 因为这不支持任意数量的类型.在我的场景中,八种或更多种类型并不太常见.

我想用这个"神奇" 这个样,但调用者没有在容器上的参考.

c# generics

6
推荐指数
1
解决办法
2897
查看次数

在C++中用范围(100)编写i是否有简短的方法?

如果我做对了,我可以用它来迭代一个固定的范围:

for(int i: {1, 2, 3, 4, 5})
    do_sth(i);
Run Code Online (Sandbox Code Playgroud)

这是同样的事情:

vector<int> v{1, 2, 3, 4, 5};
for(int i: v)
    do_sth(i);
Run Code Online (Sandbox Code Playgroud)

但是如果我想迭代1,...,100的范围并且在编译时已经知道怎么办?最美妙的方法是什么?效率最高的是什么?什么最短的?

编辑:当然我可以写一个常规的for循环,但实际的用例将涉及比ints 更复杂的内容.

我稍微简化了一下这个例子.

c++ initializer-list

6
推荐指数
2
解决办法
325
查看次数

查找 tensorflow op 依赖的所有变量

有没有办法找到给定操作(通常是损失)所依赖的所有变量?我想使用它然后将此集合传递给optimizer.minimize()tf.gradients()使用各种set().intersection()组合。

到目前为止,我已经找到op.op.inputs并尝试了一个简单的 BFS,但我从来没有遇到Variabletf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)或返回的对象slim.get_variables()

相应的“Tensor.op._id andVariables.op._id”字段之间似乎确实存在对应关系,但我不确定这是我应该依赖的东西。

或者,也许我一开始就不应该这样做?我当然可以在构建图形时精心构建不相交的变量集,但是如果我更改模型,很容易遗漏一些东西。

tensorflow

3
推荐指数
1
解决办法
380
查看次数

标签 统计

tensorflow ×3

c# ×1

c++ ×1

generics ×1

initializer-list ×1