1. tf.SparseTensor()
定义一个稀疏tensor。
2. tf.sparse_tensor_to_dense()
将一个稀疏tensor转换成稠密tensor。
import tensorflow as tf
# [ [ 0 1 ]
# [0 1 ]
# [1 0 ] ]
shape = [3, 2] # tensor形状为3*2
values = [1, 1, 1] # 含有三个值为1的元素
indices = [[0, 1], [1, 1], [2, 0]] # tensor位置索引
a = tf.SparseTensor(values=values, indices=indices, dense_shape=shape)
b = tf.sparse_tensor_to_dense(a)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
res1, res2 = sess.run([a, b])
print("res1:{}".format(res1))
print("res2:{}".format(res2))
3. tf.nn.ctc_loss()
计算ctc_loss。
loss = tf.nn.ctc_loss(labels=targets, inputs=logits, sequence_length=seq_len)
主要参数1:labels:int32
SparseTensor
是数据的真实标签,一般是先用sparse_placeholder(),然后在session中feed训练数据batch_y。batch_y为SparseTensor
利用sparse_tuple_from(y)函数计算得到。
def sparse_tuple_from(sequences, dtype=np.int32):
indices = []
values = []
for n, seq in enumerate(sequences):
indices.extend(zip([n] * len(seq), range(len(seq))))
values.extend(seq)
indices = np.asarray(indices, dtype=np.int64)
values = np.asarray(values, dtype=dtype)
shape = np.asarray([len(sequences), np.asarray(indices).max(0)[1] + 1], dtype=np.int64)
return indices, values, shape
sparse_tuple_from(y)函数的输入是在train_y中随机选择大小为batch_size
的数据,输出是一个(indices, values, shape)形式的三元组。
主要参数2:inputs:是三维 float
Tensor
.logits是网络向前传播inference计算的结果。形状为[max_time_step, batch_size, num_classes]这里的num_classes是中文字典的大小,及992个汉字加1个空白,所以num_classes=993。输入图像经过卷积之后的大小为[batch_size, 11, 1, 512],max_time_step=512,是通道数,可以看作是512个图片特征序列。
主要参数3:sequence_length:一维int32
向量【注意是向量,不是Tensor
!!!】长度为batch_size(批处理大小),值为max_len(ctc的最大输出长度,这个长度是自己定义的!合理即可!)的可以按照下面的方式定义。
seq_len = np.ones([batch_size])*max_len
4. tf.sparse_placeholder()
占位符。在session中feed训练数据。
targets = tf.sparse_placeholder(tf.int32)
网友评论