Tensorflow-Keras reproducibility problem on Google Colab

前端 未结 2 633
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-22 16:13

I have a simple code to run on Google Colab (I use CPU mode):

import numpy as np
import pandas as pd

## LOAD DATASET

datatrain = pd.read_csv(\"gdrive/My Drive/         


        
相关标签:
2条回答
  • 2021-01-22 16:40

    You should also fix the seed for kernel_initializer in your Dense layers. So, your model will be like:

    model = tf.keras.Sequential()
    model.add(Dense(10, kernel_initializer=keras.initializers.glorot_uniform(seed=66), input_shape=(4,)))
    model.add(Activation("sigmoid"))
    model.add(Dense(3, kernel_initializer=keras.initializers.glorot_uniform(seed=66)))
    model.add(Activation("softmax"))
    
    0 讨论(0)
  • 2021-01-22 16:40

    I've tried to get Tensorflow 2.0 working reproducibly using Keras and Google Colab (CPU), with a version of the Iris dataset processing similar to that described above by @malioboro. This seems to work - might be useful:

    # Install TensorFlow
    try:
      # %tensorflow_version only exists in Colab.
      %tensorflow_version 2.x
    except Exception:
      pass
    
    # Setup repro section from Keras FAQ with TF1 to TF2 adjustments
    
    import numpy as np
    import tensorflow as tf
    import random as rn
    
    # The below is necessary for starting Numpy generated random numbers
    # in a well-defined initial state.
    
    np.random.seed(42)
    
    # The below is necessary for starting core Python generated random numbers
    # in a well-defined state.
    
    rn.seed(12345)
    
    # Force TensorFlow to use single thread.
    # Multiple threads are a potential source of non-reproducible results.
    # For further details, see: https://stackoverflow.com/questions/42022950/
    
    session_conf = tf.compat.v1.ConfigProto(intra_op_parallelism_threads=1,
                                            inter_op_parallelism_threads=1)
    
    # The below tf.set_random_seed() will make random number generation
    # in the TensorFlow backend have a well-defined initial state.
    # For further details, see:
    # https://www.tensorflow.org/api_docs/python/tf/set_random_seed
    
    tf.compat.v1.set_random_seed(1234)
    
    sess = tf.compat.v1.Session(graph=tf.compat.v1.get_default_graph(), config=session_conf)
    tf.compat.v1.keras.backend.set_session(sess)
    
    # Rest of code follows ...
    # Some adopted from: https://janakiev.com/notebooks/keras-iris/
    # Some adopted from the question.
    #
    # Load Data
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import OneHotEncoder, StandardScaler
    
    iris = load_iris()
    X = iris['data']
    y = iris['target']
    names = iris['target_names']
    feature_names = iris['feature_names']
    
    # One hot encoding
    enc = OneHotEncoder()
    Y = enc.fit_transform(y[:, np.newaxis]).toarray()
    
    # Scale data to have mean 0 and variance 1 
    # which is importance for convergence of the neural network
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
    
    # Split the data set into training and testing
    X_train, X_test, Y_train, Y_test = train_test_split(
        X_scaled, Y, test_size=0.5, random_state=2)
    
    n_features = X.shape[1]
    n_classes = Y.shape[1]
    
    ## MAIN PROGRAM
    from tensorflow.keras.layers import Dense, Activation 
    
    # build model
    model = tf.keras.Sequential()
    model.add(Dense(10, input_shape=(4,)))
    model.add(Activation("sigmoid"))
    model.add(Dense(3))
    model.add(Activation("softmax"))
    
    #choose optimizer and loss function
    model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
    
    # train
    model.fit(X_train, Y_train, epochs=20, batch_size=32)
    
    #get prediction
    classes = model.predict_classes(X_test)
    
    0 讨论(0)
提交回复
热议问题