我有一个相当复杂的网络,通过它我试图跟踪仅在数十万次迭代后才出现的NaN。基于this post,我使用tf.add_check_numerics_ops
添加了一个check_op并捕获了tf.errors.InvalidArgumentError
,但看起来崩溃的操作是变量读取(特别是batch_norm图层的beta读取)。
如果从这里开始,我有点不知所措。我正在考虑其他操作事先导致变量设置为NaN,但那么为什么它在那时没有被check_numerics捕获呢?读取是NaN引起的第一个地方似乎不太可能,但这就是系统似乎告诉我的内容!
如果有人对我如何进一步追踪这个错误有任何建议,我将不胜感激!
可能相关的更多信息:
1)如果我打破我的except块并只运行read op(做sess.run([err.op.inputs[0]])
之类的东西)它会一直给我NaN。
2)如果我重新运行整个网络,我的check_op会一直跳到同一个读取,但步骤不同。
3)Here是其中一次运行的网络丢失。它在一次迭代中飙升。
4)这是read op的NodeDef
的转储name: "base_networks/bn/beta/read"
op: "Identity"
input: "base_networks/bn/beta"
device: "/device:GPU:0"
attr {
key: "T"
value {
type: DT_FLOAT
}
}
attr {
key: "_class"
value {
list {
s: "loc:@base_networks/bn/beta"
}
}
}
以及它的输入NodeDef:
name: "base_networks/bn/beta"
op: "Variable"
device: "/device:GPU:0"
attr {
key: "container"
value {
s: ""
}
}
attr {
key: "dtype"
value {
type: DT_FLOAT
}
}
attr {
key: "shape"
value {
shape {
dim {
size: 4
}
}
}
}
attr {
key: "shared_name"
value {
s: ""
}
}