关于CTCLoSS的问题


#1

在使用gluon.loss.ctcloss做ocr时,loss可以下降,但精度始终为0 最后一层的输出始终指向了最后一个标签(如我的输出层size=35, max之后各时间序列输出的全是34.不知道问题出在哪里。请指教

一、网络结构

class CRNN(gluon.HybridBlock):
def __init__(self, n_class, hidden_size=256, num_layers=1):
    super(CRNN, self).__init__()
    with self.name_scope():
        self.cnn = nn.Conv2D(channels=1,kernel_size=3,layout='NCHW')
        self.rnn =gluon.rnn.LSTM(hidden_size=hidden_size,num_layers=num_layers,layout='NTC')
        self.fc = nn.Dense(units=n_class,flatten=False)

def hybrid_forward(self,F,x, *args, **kwargs):
    x = self.cnn(x)
    x = x.squeeze(axis=1)
    x = x.transpose((0, 2, 1))# (NTC)(batch, width, channel)
    x = self.rnn(x)
    x = self.fc(x)
    return x

二、数据 只读一张图片 内容为 12365 RGB格式 图片为H50*W180

data=mx.image.imread('12365.jpg')
data=data.astype('float32')/255.0
data=data-0.5
data=nd.transpose(data.reshape(-1,50,180,3),(0,3,1,2)) #NCHW (1, 3, 50, 180)
label=nd.array([[1,2,3,6,5]]) #NT (1,5)

三、训练代码

net=sm.CRNN(n_class=35,hidden_size=256,num_layers=2)
net.initialize()

loss=gluon.loss.CTCLoss()
trainer = gluon.Trainer(net.collect_params(), 'sgd',{'learning_rate': 0.001})
#train
for epoch in range(999):
    train_loss=.0
    with autograd.record():
        output = net(data)
        L = loss(output, label)
    L.backward()
    train_loss = nd.mean(L).asscalar()
    trainer.step(1)
    if(epoch%100 == 0):
        print('train_loss %.4f'%(train_loss))
        print('output max',output.argmax(axis=2))

四、输出

train_loss 14.2017
output 
[[34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34.
  34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34.
  34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34.
  34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34.
  34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34.
  34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34.
  34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34.
  34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34.
  34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34.
  34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34. 34.]]
<NDArray 1x178 @cpu(0)>

Process finished with exit code 1

#2

补充一下, 刚才写demo时忘了改代码了,不过n_class改成真实的空间大小6,结果也是一样的,output.asgmax全是5


#3

检查一下你的label是不是有问题,CTCLoss 的 blank是给到最后一个位置


#5

应当不是,图片里数字是12365,我给的label 是[[1,2,3,6,5,]] 写成[[1,2,3,6,5,-1]] 结果也是一样的


#6

感觉应该是blank label的问题 如果你要predict 1-6 的话nclass 要设7 network output dimension也要7


#7

不是这个问题 字符空间大小是5,out输出都指向最后一个也就是blank ,训练时间长了会有一点变化,但基本大多还是blank


#8

更新下版本


#9

搞定了么?亲,求答案


#10

所以你的问题解决了吗?


#11

我也遇到这个问题了,想问下楼主是否解决了?