我试图使用 protobuf 枚举作为字典中值的类型,但由于某种原因它不起作用。
我在原型中的枚举定义是:
enum Device {
UNSPECIFIED = 0;
ON = 1;
OFF = 2;
}
Run Code Online (Sandbox Code Playgroud)
编译导入成功后,以下代码会报错。
from devices_pb2 import Device
def foo(device: Device) -> Dict[str, Device]:
pass
Run Code Online (Sandbox Code Playgroud)
错误信息:
def foo(device: Device) -> Dict[str, Device]:
File "/home/ivan/anaconda3/envs/py37/lib/python3.7/typing.py", line 254, in inner
return func(*args, **kwds)
File "/home/ivan/anaconda3/envs/py37/lib/python3.7/typing.py", line 629, in __getitem__
params = tuple(_type_check(p, msg) for p in params)
File "/home/ivan/anaconda3/envs/py37/lib/python3.7/typing.py", line 629, in <genexpr>
params = tuple(_type_check(p, msg) for p in params)
File "/home/ivan/anaconda3/envs/py37/lib/python3.7/typing.py", line 142, in _type_check
raise …Run Code Online (Sandbox Code Playgroud) 在这里提出了一个类似的未解决的问题。我正在测试一种深度增强学习算法,该算法在张量流中使用keras后端。我对tf.keras不太熟悉,不过我想添加批处理规范化层。因此,我尝试使用tf.keras.layers.BatchNormalization(),但是由于update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)为空,它不会更新平均均值和方差。
使用常规tf.layers.batch_normalization似乎很好。但是,由于完整的算法有些复杂,因此我需要找到一种使用方法tf.keras。
由于不为空,因此标准tf层将batch_normed = tf.layers.batch_normalization(hidden, training=True)更新平均值update_ops:
[
<tf.Operation 'batch_normalization/AssignMovingAvg' type=AssignSub>,
<tf.Operation 'batch_normalization/AssignMovingAvg_1' type=AssignSub>,
<tf.Operation 'batch_normalization_1/AssignMovingAvg' type=AssignSub>,
<tf.Operation 'batch_normalization_1/AssignMovingAvg_1' type=AssignSub>
]
Run Code Online (Sandbox Code Playgroud)
无效的最小示例:
import tensorflow as tf
import numpy as np
tf.reset_default_graph()
graph = tf.get_default_graph()
tf.keras.backend.set_learning_phase(True)
input_shapes = [(3, )]
hidden_layer_sizes = [16, 16]
inputs = [
tf.keras.layers.Input(shape=input_shape)
for input_shape in input_shapes
]
concatenated = tf.keras.layers.Lambda(
lambda x: tf.concat(x, axis=-1)
)(inputs) …Run Code Online (Sandbox Code Playgroud)