[软件工程应用与实践]lingvo代码阅读
2021SC@SDUSC
lingvo.core.ops包
assert_kernels.cc
lingvo.core.ops.assert_shape_match(x, y, msg='', name=None)
断言shape向量x和y是否匹配
x[i] == y[i] 或 x[i] == -1 或 y[i] == -1时, xy 第 i 维匹配
参数:
- xy 都是数据类型为
int32
的张量(tensor
), 形状向量 - msg 可选字符串, 默认为空. 为断言失败时的提示信息
- name 操作名称
该操作返回创建好的operations
语法explicit的工程启示 :
explicit关键字的cpp手册中有如下解释
explicit 指定符可以与常量表达式一同使用. 函数若且唯若该常量表达式求值为 true 才为显式. (C++20起)
构造函数被explicit
修饰后, 就不能再被隐式调用了. 即当参数类型需要隐式转换时, explicit
修饰后, 就不能通过编译.
该修饰应能用就用——当我们写代码时, 提前预料到, 某种参数类型转化或许会出问题, 就不要再把这种问题交给编译器了.
lingvo.core.ops.assert_same_dim0(x, msg='', name=None)
断言所有输入张量都是非标量且具有相同的第0次dim大小.
参数
- x: 张量对象的列表。张量的列表。
- msg name与
lingvo.core.ops.assert_shape_match(x, y, msg='', name=None)
中的相同
该操作返回创建好的operations
random_ops_kernels.cc
lingvo.core.ops.random_permutation_sequence(num=1, batch=1, repeat=False, seed=0, name=None)
生成随机向量
参数
- num:
int
默认为1. 表示id的数量 - batch:
int
默认为1. 每个输出都是大小为batch的向量. 只有当前时点的batch值可以小于full batch. - repeat:
bool
默认为false
.如果为true
,则该操作在一个时间周期之后继续生成随机样本. 若为false
, 会以tf.errors.OutOfRangeError
终止. - seed:
int
默认为0. 随机种子. - name: 同上. 操作名
返回值
int32
类型的张量. 每个输出都是一个大小为batch的向量.
tf.errors.OutOfRangeError
成因: 在执行训练的时候, 队列会被后台的线程填充好. 如果设置了最大训练迭代数(epoch), 在某些时候, 样本出队的操作可能会抛出一个tf.OutOfRangeError
的错误. 这是因为tensorflow的队列已经到达了最大实际的最大迭代数, 没有更多可用的样本了. 当写代码出现不确定情况时, 可用try..except ..finally
结构处理该error.
best_step_op_kernels.cc
lingvo.core.ops.best_step(hist_file, tol=0, minimize=True, metric='', name=None)
从数据中确定最佳全局步骤。
参数
- hist_file
string
: 记录每一步分值的文档. 或者匹配/path_to_file/events.out.tfevents*
格式的tf事件文件的文件模式。 - tol
float
: 默认为0. 之前的最佳分数和当前分数之间的差值必须大于此值才能触发更新. 触发阈值. - minimize
bool
: 默认为true. 如果metric被最小化。在hist_file中记录, 如果为True, 分数越小越好, 如果为False, 分数越大越好. - metric
string
: 默认为空. 被跟踪的度量的名称. - name: 同上.
返回值
int64
类型的张量.