Реализация потери CTC в keras

#python #keras #neural-network #loss #ctc

#python #keras #нейронная сеть #потеря #ctc

Вопрос:

Я пытаюсь реализовать потерю CTC с помощью keras для моей упрощенной нейронной сети:

   
def ctc_lambda_func(args):
    y_pred, y_train, input_length, label_length = args
 
    return K.ctc_batch_cost(y_train, y_pred, input_length, 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, y_train, input_length, label_length])
model =keras.models.Model(inputs=[input_data, y_train, input_length, label_length], outputs=loss_out)
model.compile(loss={'ctc': lambda y_train, y_pred: y_pred}, optimizer = 'adam')
model.fit(x=[x_train, y_train, input_length, label_length],  epochs=10, batch_size=100)
  

У нас есть y_true (или y_train) с размером (3800,4), из-за этого я поставил 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.]]
  

в чем моя проблема?

Ответ №1:

Вы неправильно поняли длины. Это не количество классов меток, это фактическая длина последовательностей. CTC может использоваться только в ситуациях, когда количество целевых символов меньше, чем количество входных состояний. Технически количество входов и выходов одинаковое, но некоторые из выходов являются пробелами. (Обычно это происходит при распознавании речи, когда у вас много окон входного сигнала и относительно мало фонем в выводе.)

Предполагая, что вы должны дополнить входные и выходные данные, чтобы они были в пакете:

  • input_length должно содержать для каждого элемента в пакете, сколько входных данных действительно допустимо, т. Е. Не заполнение;

  • label_length должно содержать, сколько непустых меток должна создавать модель для каждого элемента в пакете.

Комментарии:

1. спасибо за ваш ответ. вы имеете в виду, что, например, если у нас есть это: y_train=[1,2,3,4,5,6,7,8,9,10] x_train=[0,1,2], тогда мы должны сказать, что input_length равен 10, а label_length равен 3??

2. Если x — это выходные данные, а y — входные, тогда да.

3. да, я написал их неправильно. Я хотел сказать, что x_train=[1,2,3,4,5,6,7,8,9,10] и y_train=[0,1,2] . еще один вопрос: lebel_length и input_length — это число или массив, в котором, например, 20 строк, каждая строка для одного входного массива?

4. Это массив с одним числом на каждый элемент в обучающем пакете.