我正在嘗試使用 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, 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 回答

千萬里不及你
TA貢獻1784條經驗 獲得超9個贊
你誤解了長度。它不是標簽類別的數量,而是序列的實際長度。CTC只能用于目標符號數量小于輸入狀態數量的情況。從技術上講,輸入和輸出的數量是相同的,但有些輸出是空白的。(這通常發生在語音識別中,其中有大量的輸入信號窗口,而輸出中的音素相對較少。)
假設您必須填充輸入和輸出才能將它們批量化:
input_length
對于批次中的每個項目,應包含實際有效的輸入數量,即不填充;label_length
應包含模型應為批次中的每個項目生成多少個非空白標簽。
添加回答
舉報
0/150
提交
取消