微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在喀拉拉邦实施CTC损失

如何解决在喀拉拉邦实施CTC损失

我正在尝试为我的简化神经网络使用keras实现CTC丢失:

  
def ctc_lambda_func(args):
    y_pred,y_train,input_length,label_length = args
 
    return K.ctc_batch_cost(y_train,y_pred,label_length)


x_train = x_train.reshape(x_train.shape[0],20,10).astype('float32')

input_data = layers.Input(shape=(20,10,))
x=layers.Convolution1D(filters=256,kernel_size=3,padding="same",strides=1,use_bias=False,activation= 'relu')(input_data)
x=layers.Batchnormalization()(x)
x=layers.Dropout(0.2)(x)

x=layers.Bidirectional (LSTM(units=200,return_sequences=True)) (x)
x=layers.Batchnormalization()(x)
x=layers.Dropout(0.2)(x)


y_pred=outputs = layers.Dense(5,activation='softmax')(x)
fun = Model(input_data,y_pred)
# fun.summary()

label_length=np.zeros((3800,1))
input_length=np.zeros((3800,1))

for i in range (3799):
    label_length[i,0]=4
    input_length[i,0]=5 
  
y_train = np.array(y_train)
x_train = np.array(x_train)
input_length = np.array(input_length)
label_length = np.array(label_length) 

  
loss_out = Lambda(ctc_lambda_func,output_shape=(1,),name='ctc')([y_pred,label_length])
model =keras.models.Model(inputs=[input_data,label_length],outputs=loss_out)
model.compile(loss={'ctc': lambda y_train,y_pred: y_pred},optimizer = 'adam')
model.fit(x=[x_train,epochs=10,batch_size=100)

我们有(3800,4)尺寸的y_true(或y_train),因为我把label_length = 4和input_length = 5(空白为+1)

我遇到此错误

ValueError: Input tensors to a Model must come from `tf.keras.Input`. Received: [[0. 1. 0. 0.]
 [0. 1. 0. 0.]
 [0. 1. 0. 0.]
 ...
 [1. 0. 0. 0.]
 [1. 0. 0. 0.]
 [1. 0. 0. 0.]] (missing prevIoUs layer Metadata).

y_true像这样:

 [[0. 1. 0. 0.]
 [0. 1. 0. 0.]
 ...
 [1. 0. 0. 0.]
 [1. 0. 0. 0.]
 [1. 0. 0. 0.]]

我怎么了?

解决方法

您误解了长度。它不是标签类的数量,而是序列的实际长度。 CTC仅可在目标符号的数量小于输入状态的数量的情况下使用。从技术上讲,输入和输出的数量是相同的,但是某些输出是空白。 (这通常发生在语音识别中,在语音识别中,您有大量的输入信号窗口,而输出中的音素却很少。)

假设您必须填充输入和输出以使其成批处理:

  • input_length应该包含该批次中每个项目的实际有效输入数,即不填充;

  • label_length应包含模型应为批次中的每个项目产生多少非空白标签。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。