Воспроизведение одинаковых результатов при каждом запуске - Keras, Google Colab - PullRequest
0 голосов
/ 03 февраля 2020

Я запускаю следующий код в Google Colab (с графическим процессором):

import random
random.seed(1)
import numpy as np
from numpy.random import seed
seed(1)
from tensorflow import set_random_seed
set_random_seed(2)
import pandas as pd
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers import Flatten, Dense, Lambda, SimpleRNN
from keras.optimizers import *
from keras.utils import np_utils
from keras.initializers import *
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, roc_auc_score, auc, precision_recall_curve
from sklearn.metrics import confusion_matrix
from keras.callbacks import EarlyStopping
from keras import backend as K
session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)


##Loading dataset train and validation files, the files are same for every run

es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=5)

print("***********************************************************************************************")

def make_model():
    model = Sequential()        
    model.add(Conv2D(10,(5,5), kernel_initializer=glorot_uniform(seed=1), input_shape = (22,10,1), use_bias = True, activation = "relu", strides = 1, padding = "valid"))
    model.add(MaxPooling2D(pool_size=(2,2)))    
    model.add(Flatten())
    model.add(Dense(20, kernel_initializer=glorot_uniform(seed=1), activation = "relu"))
    model.add(Lambda(lambda x: tf.expand_dims(x, axis=1)))
    model.add(SimpleRNN(20, kernel_initializer=glorot_uniform(seed=1), activation="relu",return_sequences=False))
    model.add(Dense(1, kernel_initializer=glorot_uniform(seed=1), activation="sigmoid"))    
    opti = SGD(lr = 0.01)
    model.compile(loss = "binary_crossentropy", optimizer = opti, metrics = ["accuracy"])

    return model

model = make_model()
model.fit(x_train, y_train, validation_data = (x_validation,y_validation), epochs = 50, batch_size = 20, verbose = 2, callbacks=[es])

Несмотря на установку всех начальных значений, мои результаты прогноза model отличаются при последующих запусках. Обучение и тестирование модели происходит в той же ячейке Colab.

1 Ответ

0 голосов
/ 16 марта 2020

Вы имеете дело с числами с плавающей точкой, которые умножаются и складываются в разных потоках и поэтому могут происходить в другом порядке. Сложения и умножения с плавающей точкой не являются коммутативными. См. Что должен знать каждый компьютерщик об арифметике с плавающей точкой c.

...