Сохраненная модель Keras дает разные результаты при каждом запуске - PullRequest
0 голосов
/ 19 марта 2019

Привет, я тренирую модель авто-кодера для обнаружения аномалий. Вот мой тренировочный код

def model_save(i,start,end):

    df_normal = pd.read_csv("/home/ram/Downloads/19_channel_2.csv")
    df_normal = df_normal.drop(['Unnamed: 0'],axis=1)
    len_values = len((df_normal))
    #print(len_values)
    point = ((len_values))%18
    if point==0:
        df_normal = pd.DataFrame(df_normal.iloc[:,start:end])
    else:
        df_normal = pd.DataFrame(df_normal.iloc[:-point,start:end])


    #df_normal = pd.DataFrame(df_normal.iloc[:-point,:])
    df_normal = df_normal.T
    df_normal = (df_normal.values).reshape(-1,18)
    df_normal = pd.DataFrame(df_normal)


    RANDOM_SEED = 101
    X_train = df_normal.values
    print('Training data size   :', X_train.shape)
    scaler = MinMaxScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    input_dim = X_train.shape[1]
    encoding_dim = 6



    input_layer = Input(shape=(input_dim, ))
    encoder = Dense(encoding_dim, activation="tanh",activity_regularizer=regularizers.l1(10e-5))(input_layer)
    encoder = Dense(int(encoding_dim / 2), activation="tanh")(encoder)
    encoder = Dense(int(2), activation="tanh")(encoder)
    decoder = Dense(int(encoding_dim/ 2), activation='tanh')(encoder)
    decoder = Dense(int(encoding_dim), activation='tanh')(decoder)
    decoder = Dense(input_dim, activation='tanh')(decoder)
    autoencoder = Model(inputs=input_layer, outputs=decoder)
    #autoencoder.summary()
    nb_epoch = 100
    batch_size = 50
    autoencoder.compile(optimizer='adam', loss='mse' )

    t_ini = datetime.datetime.now()
    autoencoder.fit(X_train_scaled, X_train_scaled,
                            epochs=nb_epoch,
                            batch_size=batch_size,
                            shuffle=True,
                            validation_split=0.1,
                            verbose=0
                            )

    t_fin = datetime.datetime.now()
    print('Time to run the model: {} Sec.'.format((t_fin - t_ini).total_seconds()))
    autoencoder.save("/home/ram/Downloads/AutoEncoderModels/Keras/auto_encoder_model_19H_C2_zone_pos_" + "S" + str(start) + '_' + 'E' + str(end) + '.h5' )
    print("Saved model " + str(i) + " to disk")
    with open("/home/ram/Downloads/AutoEncoderScalars/auto_encoder_scalar_19H_C2_zone_pos_" + "S" + str(start) + '_' + 'E' + str(end) + ".pkl" , "wb") as outfile:
        pkl.dump(scaler, outfile)
    print("Saved scalar " + str(i) + " to disk")
    K.clear_session()

Это мой код для тестирования модели

from keras.models import load_model
    import pickle as pkl
    import numpy as np
    import json
    import pandas as pd
def reconstruction_error(i,X_test_scaled,autoencoder):
    predictions = autoencoder.predict(X_test_scaled)
    print(predictions)
    mse = np.mean(np.power(X_test_scaled - predictions, 2), axis=1)
    df_error = pd.DataFrame({'reconstruction_error': mse})
    #print(df_error)
    outliers = df_error.index[df_error.reconstruction_error > 0.1].tolist()
    #print(outliers)
    print("The no of anomalies for zone" + str(i) + "is" + str(len(outliers)))
    global sum_outliers
    sum_outliers += len(outliers)
    print(sum_outliers)
def model_run(i,start,end):
    df_test_2 = pd.DataFrame(df_temp.iloc[:,start:end])
    df_test_T = df_test_2.T
    df_test_reshaped = df_test_T.values.reshape(-1,5)
    autoencoder = load_model('/home/ram/Downloads/AutoEncoderModels/Keras/auto_encoder_model_19H_C2_zone_pos_S' + str(start) + '_' + 'E' + str(end) + '.h5')
    with open("/home/ram/Downloads/AutoEncoderScalars/zone" + str(i) + ".pkl", "rb") as infile:
        scaler = pkl.load(infile)
        X_test_scaled =scaler.transform(df_test_reshaped)
        reconstruction_error(i,X_test_scaled,autoencoder)

Когда я запускаю вышеКод тестовых данных на разных компьютерах. Ошибка восстановления, которую я получаю каждый раз, отличается. Я устанавливал постоянную случайного начального числа каждый раз, когда я обучал модель. Но как это дает другой результат на тестовых данных?Все ответы, которые я просмотрел до сих пор, требуют от меня изменения кода в учебном коде. Но здесь я получаю разные результаты, когда запускаю его на тестовых данных. Я использую ноутбук jupyter

Я пыталсяразличные ответы в сети, такие как shuffle = False, manual_variable_initialization (True)

Но, похоже, ни один из них не работает

...