mardi 12 novembre 2019

Keras gives different results on each run

I'm training a CNN over some thousand images in Keras. But, I'm getting different values for each run on model.fit() (and hence for model.predict()). I know this question has an answer here. As said there, I'm doing:

import os
import random
import keras.backend as K
import tensorflow as tf
import numpy as np

seed_value = 0
os.environ['PYTHONHASHSEED']=str(seed_value)
random.seed(seed_value)
np.random.seed(seed_value)
tf.set_random_seed(seed_value)
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)

I'm getting my CNN from this function:

def get_model(layer1Filter = 16, layer2Filter = 32, layer3Filter = 64, layer4Output = 400, optim = 'adam'):
    x = Input((50, 50, 3))
    model = BatchNormalization(axis = 3)(x)
    model = Convolution2D(filters = layer1Filter, kernel_size = (3,3), activation='relu')(model)
    model = MaxPooling2D()(model)
    model = Dropout(0.5, seed = seed_value)(model)

    model = BatchNormalization(axis = 3)(model)
    model = Convolution2D(filters = layer2Filter, kernel_size = (3,3), activation='relu')(model)
    model = MaxPooling2D()(model)
    model = Dropout(0.5, seed = seed_value)(model)

    model = BatchNormalization(axis = 3)(model)
    model = Convolution2D(filters = layer3Filter, kernel_size = (3,3), activation='relu')(model)
    model = MaxPooling2D()(model)
    model = Dropout(0.5, seed = seed_value)(model)

    model = Flatten()(model)
    model = Dense(layer4Output , activation = 'relu')(model)
    model = Dropout(0.5, seed = seed_value)(model)
    model = Dense(3, activation = 'softmax')(model)

    model = Model(input = x, output = model)

    if optim == 'adam':
        opt = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
    else:
        opt = keras.optimizers.RMSprop(learning_rate=0.001, rho=0.9)

    model.compile(opt, loss='binary_crossentropy', metrics=['accuracy'])
    return model

(used seed_value in Dropout too).

Also, even for random, I'm getting different results when I read the images. My function for reading the images goes something like:

labels = []
images = []
temp = []
for i in range(len(folders)):
    imgAddress = path + folders[i]
    l = os.listdir(imgAddress)
    for img in l:
        temp.append((i,cv.imread(imgAddress+'/'+img)))
random.shuffle(temp)

Then, even this temp gives me different results on each run (even though I initialise seed for random to be 0). Can someone please tell me what am I doing wrong?

EDIT: Note that even when I keep the dataset "same" (remove the random.shuffle(temp) line), the CNN still gives me different results.




Aucun commentaire:

Enregistrer un commentaire