2017-11-14 8 views
2

저는 음성 감정 인식 심 신경 네트워크에서 작업 해 왔습니다. CTC 손실이있는 keras Bidirectional LSTM을 사용했습니다. 나는 모델을 훈련 문제는 내가 모델이 입력으로 사 인수를 허용하고 CTC는 loss..just 모델을 구축 계산하기 때문에 눈에 보이지 않는 데이터에 테스트하기 위해이 모델을 사용할 수 있습니다Keras BLSTM CTC 모델 저장 및 복원

model_json = model.to_json() with open("ctc_model.json", "w") as json_file: json_file.write(model_json) model.save_weights("ctc_weights.h5")

를 저장 기차. 그래서 어떻게하면 하나의 입력 만 필요로하는 모델을 저장할 수 있습니까? 레이블 및 길이가 아닙니다. 기본적으로 내가 어떻게 test_func = K.function([net_input], [output])

def ctc_lambda_func(args): 
    y_pred, labels, input_length, label_length = args 

    shift = 2 
    y_pred = y_pred[:, shift:, :] 
    input_length -= shift 
    return K.ctc_batch_cost(labels, y_pred, input_length, label_length) 
def build_model(nb_feat, nb_class, optimizer='Adadelta'): 
    net_input = Input(name="the_input", shape=(200, nb_feat)) 
    forward_lstm1 = LSTM(output_dim=64, 
         return_sequences=True, 
         activation="tanh" 
        )(net_input) 
    backward_lstm1 = LSTM(output_dim=64, 
         return_sequences=True, 
         activation="tanh", 
         go_backwards=True 
        )(net_input) 
    blstm_output1 = Merge(mode='concat')([forward_lstm1, backward_lstm1]) 

    forward_lstm2 = LSTM(output_dim=64, 
         return_sequences=True, 
         activation="tanh" 
        )(blstm_output1) 
    backward_lstm2 = LSTM(output_dim=64, 
         return_sequences=True, 
         activation="tanh", 
         go_backwards=True 
        )(blstm_output1) 
    blstm_output2 = Merge(mode='concat')([forward_lstm2, backward_lstm2]) 

    hidden = TimeDistributed(Dense(512, activation='tanh'))(blstm_output2) 
    output = TimeDistributed(Dense(nb_class + 1, activation='softmax')) (hidden) 

    labels = Input(name='the_labels', shape=[1], dtype='float32') 
    input_length = Input(name='input_length', shape=[1], dtype='int64') 
    label_length = Input(name='label_length', shape=[1], dtype='int64') 
    loss_out = Lambda(ctc_lambda_func, output_shape=(1,), name="ctc")([output, labels, input_length, label_length]) 
    model = Model(input=[net_input, labels, input_length, label_length], output=[loss_out]) 
    model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer=optimizer, metrics=[]) 

    test_func = K.function([net_input], [output]) 

    return model, test_func 
model, test_func = build_model(nb_feat=nb_feat, nb_class=nb_class, optimizer=optimizer) 
for epoch in range(number_epoches): 
    inputs_train = {'the_input': X_train[i:i+batch_size], 
        'the_labels': y_train[i:i+batch_size], 
        'input_length': np.sum(X_train_mask[i:i+batch_size], axis=1, dtype=np.int32), 
        'label_length': np.squeeze(y_train_mask[i:i+batch_size]), 
        } 
    outputs_train = {'ctc': np.zeros([inputs_train["the_labels"].shape[0]])} 

    ctcloss = model.train_on_batch(x=inputs_train, y=outputs_train) 

    total_ctcloss += ctcloss * inputs_train["the_input"].shape[0] * 1. 
loss_train[epoch] = total_ctcloss/X_train.shape[0] 

enter image description here

Here is the my model summary 

답변

1

다음 해결책을 시도해보십시오이 기능으로 모델을 저장할 수 있습니다

import keras.backend as K 

def get_prediction_function(model): 
    input_tensor = model.layers[0].input 
    output_tensor = model.layers[-5].output 
    net_function = K.function([input_tensor, K.learning_phase()], [output_tensor]) 
    def _result_function(x): 
     return net_function([x, 0])[0] 
    return _result_function 

이제 네트워크 기능을 얻을 수 있습니다

test_function = get_prediction_function(model)