Source code for bigdl.keras.optimization
#
# Copyright 2016 The BigDL Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import keras.optimizers as koptimizers
import bigdl.nn.criterion as bcriterion
import bigdl.optim.optimizer as boptimizer
from bigdl.util.common import to_list
from bigdl.keras.converter import *
from keras.objectives import *
import six
[docs]class OptimConverter:
[docs] @staticmethod
def to_bigdl_metrics(metrics):
metrics = to_list(metrics)
bmetrics = []
for metric in metrics:
if metric == "accuracy":
bmetrics.append(boptimizer.Top1Accuracy())
else:
unsupport_exp(metric)
# TODO: add more metrics
return bmetrics
[docs] @staticmethod
def to_bigdl_criterion(kloss):
if isinstance(kloss, six.string_types):
kloss = kloss.lower()
if kloss == "categorical_crossentropy" or kloss == categorical_crossentropy:
return bcriterion.CategoricalCrossEntropy()
elif kloss == "mse" or kloss == "mean_squared_error" or kloss == mse:
return bcriterion.MSECriterion()
elif kloss == "binary_crossentropy" or kloss == binary_crossentropy:
return bcriterion.BCECriterion()
elif kloss == "mae" or kloss == "mean_absolute_error" or kloss == mae:
return bcriterion.AbsCriterion()
elif kloss == "hinge" or kloss == hinge:
return bcriterion.MarginCriterion()
elif kloss == "mean_absolute_percentage_error" or \
kloss == "mape" or kloss == mean_absolute_percentage_error:
return bcriterion.MeanAbsolutePercentageCriterion()
elif kloss == "mean_squared_logarithmic_error" or \
kloss == "msle" or kloss == mean_squared_logarithmic_error:
return bcriterion.MeanSquaredLogarithmicCriterion()
elif kloss == "squared_hinge" or kloss == squared_hinge:
return bcriterion.MarginCriterion(squared=True)
elif kloss == "sparse_categorical_crossentropy" or \
kloss == sparse_categorical_crossentropy:
return bcriterion.ClassNLLCriterion(logProbAsInput=False)
elif kloss == "kullback_leibler_divergence" or \
kloss == "kld" or kloss == kullback_leibler_divergence:
return bcriterion.KullbackLeiblerDivergenceCriterion()
elif kloss == "poisson" or kloss == poisson:
return bcriterion.PoissonCriterion()
elif kloss == "cosine_proximity" or kloss == "cosine" or kloss == cosine_proximity:
return bcriterion.CosineProximityCriterion()
else:
raise Exception("Not supported loss: %s" % kloss)
[docs] @staticmethod
def to_bigdl_optim_method(koptim_method):
# koptim_method is always an object
lr = float(K.eval(koptim_method.lr))
decay = float(K.eval(koptim_method.decay))
if isinstance(koptim_method, koptimizers.Adagrad):
warnings.warn("For Adagrad, we don't support epsilon for now")
return boptimizer.Adagrad(learningrate=lr,
learningrate_decay=decay)
elif isinstance(koptim_method, koptimizers.SGD):
momentum = float(K.eval(koptim_method.momentum))
return boptimizer.SGD(learningrate=lr,
learningrate_decay=decay,
momentum=momentum,
nesterov=koptim_method.nesterov)
elif isinstance(koptim_method, koptimizers.Adam):
beta1 = float(K.eval(koptim_method.beta_1))
beta2 = float(K.eval(koptim_method.beta_2))
return boptimizer.Adam(learningrate=lr,
learningrate_decay=decay,
beta1=beta1,
beta2=beta2,
epsilon=koptim_method.epsilon)
elif isinstance(koptim_method, koptimizers.RMSprop):
rho = float(K.eval(koptim_method.rho))
return boptimizer.RMSprop(learningrate=lr,
learningrate_decay=decay,
decayrate=rho,
epsilon=koptim_method.epsilon)
elif isinstance(koptim_method, koptimizers.Adadelta):
warnings.warn("For Adadelta, we don't support learning rate and learning rate decay for now")
return boptimizer.Adadelta(decayrate=koptim_method.rho,
epsilon=koptim_method.epsilon)
elif isinstance(koptim_method, koptimizers.Adamax):
beta1 = float(K.eval(koptim_method.beta_1))
beta2 = float(K.eval(koptim_method.beta_2))
warnings.warn("For Adamax, we don't support learning rate decay for now")
return boptimizer.Adamax(learningrate=lr,
beta1=beta1,
beta2=beta2,
epsilon=koptim_method.epsilon)
else:
unsupport_exp(koptim_method)