Chayan Bansal
Chayan Bansal

Reputation: 2085

TypeError: Unexpected keyword argument passed to optimizer: learning_rate

I am trying to load a Keras model which was trained on an Azure VM (NC promo). But I am getting the following error.

TypeError: Unexpected keyword argument passed to optimizer:learning_rate

EDIT:

Here is the code snippet that I am using to load my model:

from keras.models import load_model
model = load_model('my_model_name.h5')

Upvotes: 19

Views: 46526

Answers (13)

MichaelF
MichaelF

Reputation: 320

This happened to me too. Most likely because the learning_rate was renamed from version 2.2.* to 2.3.0 in September 2018. (see release notes: https://github.com/keras-team/keras/releases : Rename lr to learning_rate for all optimizers. )

This worked for me:

pip install keras --upgrade 

Upvotes: 20

Import as mentioned below,

import keras
from keras.models import load_model
from keras.models import Sequential

Upvotes: 0

Cyrus Dsouza
Cyrus Dsouza

Reputation: 971

It was a simple fix for me. Check your tensorflow version. I trained my model on 1.14 and was predicting it on 2.0

I used 1.14 again and it worked

Upvotes: 0

Ken Smith
Ken Smith

Reputation: 11

Similar to Chayan Bansal, what fixed it for me was to update my Tensorflow-GPU library.

If you're using Anaconda with tensorflow-gpu installed, open the Anaconda prompt, activate the virtual environment you're using, and enter "conda update tensorflow-gpu"

Upvotes: 1

Chayan Bansal
Chayan Bansal

Reputation: 2085

I resolved it by reinstalling the tensorflow library (with an updated version) and also placed the nvcuda.dll file under system32 folder.

Upvotes: 1

Victor Cid
Victor Cid

Reputation: 172

That issue usual on dependencies difference between the kernel where that model has been trained and the dependencies versions where the model is being loaded.

If you have installed the latest version of Tensorflow now (2.1) try to load the model like this:

import tensorflow as tf
print(tf.__version__)
print("Num GPUs Available: ", 
       len(tf.config.experimental.list_physical_devices('GPU')))
# Checking the version for incompatibilities and GPU list devices 
# for a fast check on GPU drivers installation. 

model_filepath = './your_model_path.h5'

model = tf.keras.models.load_model(
    model_filepath,
    custom_objects=None,
    compile=False
)

Compile=False only if the model has already compiled.

Upvotes: 8

felipk101
felipk101

Reputation: 131

In my case I found the best solution is to use h5py to change name of the variable from "learning_rate" -> "lr" as suggested in the previous posts.

import h5py
data_p = f.attrs['training_config']
data_p = data_p.decode().replace("learning_rate","lr").encode()
f.attrs['training_config'] = data_p
f.close()

Upvotes: 13

MNM
MNM

Reputation: 2743

I was running into the same thing. You will have to upgrade to Tensorlfow 2.0 and Keras, or match the two systems together.

Upvotes: 0

okliam
okliam

Reputation: 9

I've had a similar problem.

You you have this issue, try to use lr instead of learning_rate when defining the learning rate in your optimizer.

Upvotes: 0

Walter Jacquet
Walter Jacquet

Reputation: 81

i got the same error while i was working in two different PC. in some versions of tensorflow is tf.keras.optimizers.SGD(lr = x) while in other verions istf.keras.optimizers.SGD(learning rate = x).

Upvotes: 7

Erwin Schleier
Erwin Schleier

Reputation: 31

I had the same problem. Using Keras version 2.3.1 and TensorFlow-GPU version 1.13, I had to upgrade Tensorflow-GPU to version 1.15

pip uninstall tensorflow-gpu
pip install tensorflow-gpu==1.15

Upvotes: 2

Tyler Gasperlin
Tyler Gasperlin

Reputation: 13

I am also experiencing this when I try to load my model on another machine. Also trained the initial modal on an azure VM. I have tried the suggestions above and can't figure out what is causing it. Any other thoughts? Below is my code to train the model.

Models were trained and are being used in my api projects using the following versions: keras 2.3.0 tensorflow 1.14.0

history = model.fit(X, y,validation_split=0.1, \
                epochs=20, \
                batch_size=1000, \
                class_weight = cw)

Upvotes: 0

Rob Bricheno
Rob Bricheno

Reputation: 4653

Did you use a custom optimizer?

If so, you can load like this:

model = load_model('my_model_name.h5', custom_objects={
    'Adam': lambda **kwargs: hvd.DistributedOptimizer(keras.optimizers.Adam(**kwargs))
})

Alternatively you can load your model with model = load_model('my_model_name.h5', compile=False) and then add an optimizer and recompile, but that will lose your saved weights.

Upvotes: 15

Related Questions