利用CRNN来识别图片中的文字(二)tensorflow中ctc

2018-10-25  本文已影响0人  huim

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)
上一篇 下一篇

猜你喜欢

热点阅读