AttributeError: 'Sequential' object has no attribute '_get_distribution_strategy'

10,963

Solution 1

Hope you are referring to this LinkedIn Keras Course.

Even I faced the Same Error when I have used Tensorflow Version 2.1. However, after downgrading the Tensorflow Version and with slight modifications in the code, I could invoke Tensorboard.

Working Code is shown below:

import pandas as pd
import keras
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import *

training_data_df = pd.read_csv("sales_data_training_scaled.csv")

X = training_data_df.drop('total_earnings', axis=1).values
Y = training_data_df[['total_earnings']].values

# Define the model
model = Sequential()
model.add(Dense(50, input_dim=9, activation='relu', name='layer_1'))
model.add(Dense(100, activation='relu', name='layer_2'))
model.add(Dense(50, activation='relu', name='layer_3'))
model.add(Dense(1, activation='linear', name='output_layer'))
model.compile(loss='mean_squared_error', optimizer='adam')

# Create a TensorBoard logger
logger = tf.keras.callbacks.TensorBoard(
    log_dir='logs',
    write_graph=True,
    histogram_freq=5
)

# Train the model
model.fit(
    X,
    Y,
    epochs=50,
    shuffle=True,
    verbose=2,
    callbacks=[logger]
)

# Load the separate test data set
test_data_df = pd.read_csv("sales_data_test_scaled.csv")

X_test = test_data_df.drop('total_earnings', axis=1).values
Y_test = test_data_df[['total_earnings']].values

test_error_rate = model.evaluate(X_test, Y_test, verbose=0)
print("The mean squared error (MSE) for the test data set is: {}".format(test_error_rate))

Solution 2

You may find this post useful.

So instead of importing from keras (i.e.)

from keras.models import Sequential

import from tensorflow:

from tensorflow.keras.models import Sequential

And this of course applies to most other imports as well.

This is just a lucky guess because I can't run your code, but hope it helps!

Solution 3

It seems that your python environment is mixing imports from keras and tensorflow.keras. Try to use Sequential module like this:

model = tensorflow.keras.Sequential()

Solution 4

I would recommend not mixing keras and tf.keras. Those are different projects as keras is the original, multi-backend project and tf.keras is the version integrated into tensorflow. Keras will stop supporting other backends but tensorflow so it's adviced to switch to it. Check https://keras.io/#multi-backend-keras-and-tfkeras

An easy way to do that is importing keras from tensorflow:

import tensorflow as tf
import tensorflow.keras as keras
#import keras
import keras.backend as K
from keras.models import Model, Sequential, load_model
from keras.layers import Dense, Embedding, Dropout, Input, Concatenate

print("Python: "+str(sys.version))
print("Tensorflow version: "+tf.__version__)
print("Keras version: "+keras.__version__)
Python: 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0]
Tensorflow version: 2.1.0
Keras version: 2.2.4-tf
Share:
10,963
Himsara Gallege
Author by

Himsara Gallege

"If at first I don’t succeed; I call it version 1.0" ~ Himsara Gallege Completing Bachelor of Computer Science specialising in Data Science @ Monash University, Australia. In love with Artificial Intelligence and Machine Learning🔥.

Updated on June 15, 2022

Comments

  • Himsara Gallege
    Himsara Gallege almost 2 years

    I am following an online course through linkedin regrading the Building of models through Keras.

    This is my code. (This is claimed to work)

    import pandas as pd
    import keras
    from keras.models import Sequential
    from keras.layers import *
    
    training_data_df = pd.read_csv("sales_data_training_scaled.csv")
    
    X = training_data_df.drop('total_earnings', axis=1).values
    Y = training_data_df[['total_earnings']].values
    
    # Define the model
    model = Sequential()
    model.add(Dense(50, input_dim=9, activation='relu', name='layer_1'))
    model.add(Dense(100, activation='relu', name='layer_2'))
    model.add(Dense(50, activation='relu', name='layer_3'))
    model.add(Dense(1, activation='linear', name='output_layer'))
    model.compile(loss='mean_squared_error', optimizer='adam')
    
    
    # Create a TensorBoard logger
    logger = keras.callbacks.TensorBoard(
        log_dir='logs',
        write_graph=True,
        histogram_freq=5
    )
    
    
    # Train the model
    model.fit(
        X,
        Y,
        epochs=50,
        shuffle=True,
        verbose=2,
        callbacks=[logger]
    )
    
    # Load the separate test data set
    test_data_df = pd.read_csv("sales_data_test_scaled.csv")
    
    X_test = test_data_df.drop('total_earnings', axis=1).values
    Y_test = test_data_df[['total_earnings']].values
    
    test_error_rate = model.evaluate(X_test, Y_test, verbose=0)
    print("The mean squared error (MSE) for the test data set is: {}".format(test_error_rate))
    

    I get the following error when the following code was executed.

    Using TensorFlow backend.
    2020-01-16 13:58:14.024374: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
    2020-01-16 13:58:14.037202: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fc47b436390 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
    2020-01-16 13:58:14.037211: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
    Traceback (most recent call last):
      File "/Users/himsaragallage/Documents/Building_Deep_Learning_apps/06/model_logging final.py", line 35, in <module>
        callbacks=[logger]
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/keras/engine/training.py", line 1239, in fit
        validation_freq=validation_freq)
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/keras/engine/training_arrays.py", line 119, in fit_loop
        callbacks.set_model(callback_model)
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/keras/callbacks/callbacks.py", line 68, in set_model
        callback.set_model(model)
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/keras/callbacks/tensorboard_v2.py", line 116, in set_model
        super(TensorBoard, self).set_model(model)
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/keras/callbacks.py", line 1532, in set_model
        self.log_dir, self.model._get_distribution_strategy())  # pylint: disable=protected-access
    AttributeError: 'Sequential' object has no attribute '_get_distribution_strategy'
    
    Process finished with exit code 1
    

    While I was trying to Debug

    I found out that this error was caused because I am trying to use a tensorboard logger. More accurately. When I add callbacks=[logger]. Without that line of code the program runs without any errors. But Tensorboard won't be used.

    Please suggest me a method in which I can eliminate the error successfully run the above mentioned python script.