第一:我和Tensorflow只有几天了,所以请耐心等待.
我从cifar10教程代码开始,我现在使用卷积和特征值分解的组合来打破符号差异.即图形构建,然后在调用train()脚本时停止"没有为操作定义梯度[...](操作类型:SelfAdjointEig)".这并不奇怪.
有问题的子图的输入仍然只是输入要素图和正在使用的过滤器,我有手头的渐变公式,它们应该是直接实现的,给定子图的输入和梯度到它的输出.
从我在文档中看到的内容,我可以为自定义Ops注册渐变方法,RegisterGradient或者使用实验来覆盖它们gradient_override_map.这两个应该让我访问我需要的东西.例如,在Github上搜索我发现了很多访问op的输入的例子op.input[0].
我的问题是我想基本上"快捷"整个子图,而不是单个操作,所以我没有单一的操作来装饰.由于这发生在cifar示例的一个卷积层中,我尝试使用该层的范围对象.从概念上讲,进入和退出该范围图形的内容正是我想要的,如果我能以某种方式覆盖整个范围的"已经"执行它的渐变.
我看到tf.Graph.create_op了(我认为)我可以用来注册一种新类型的操作,然后我可以用上述方法覆盖该操作类型的梯度计算.但我没有看到一种方法来定义该操作的前向传递而不用C++编写它...
也许我完全接近这个错误的方式?由于我的所有前向或后向操作都可以使用python接口实现,因此我显然希望避免在C++中实现任何内容.
鉴于...
A形状矩阵[m, n]I形状的张量[m]我想J从A哪里
获得一个元素列表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是必要的,因为只有范围内生产int32和argmax仅产生int64.
这两个人都没有让我觉得特别优雅.一个具有运行时开销(可能是关于因子n),另一个具有未知因素认知开销.我在这里错过了什么吗?
我需要将一个类型列表传递给一个方法,但我想确保(在编译时)所有这些都继承自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)
你明白了.所以问题是:你能做得更漂亮吗? 因为这不支持任意数量的类型.在我的场景中,八种或更多种类型并不太常见.
我想用这个"神奇" 这个样,但调用者没有在容器上的参考.
如果我做对了,我可以用它来迭代一个固定的范围:
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 更复杂的内容.
我稍微简化了一下这个例子.
有没有办法找到给定操作(通常是损失)所依赖的所有变量?我想使用它然后将此集合传递给optimizer.minimize()或tf.gradients()使用各种set().intersection()组合。
到目前为止,我已经找到op.op.inputs并尝试了一个简单的 BFS,但我从来没有遇到Variable过tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)或返回的对象slim.get_variables()
相应的“Tensor.op._id andVariables.op._id”字段之间似乎确实存在对应关系,但我不确定这是我应该依赖的东西。
或者,也许我一开始就不应该这样做?我当然可以在构建图形时精心构建不相交的变量集,但是如果我更改模型,很容易遗漏一些东西。