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