This is an automated email from the ASF dual-hosted git repository.
okislal pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/madlib.git
The following commit(s) were added to refs/heads/master by this push:
new 40713de DL: Add support for empty optimizer params
40713de is described below
commit 40713debea650398795fe36f36463024ecd2d012
Author: Orhan Kislal <[email protected]>
AuthorDate: Fri Apr 19 13:17:15 2019 -0700
DL: Add support for empty optimizer params
Calling compile with an optimizer that has no params caused an error
during parsing. This commit fixes the issue and adds tests to ensure it
works as expected.
---
.../deep_learning/madlib_keras_wrapper.py_in | 18 ++++++++++--
.../modules/deep_learning/test/madlib_keras.sql_in | 32 +++++++++++++++++++++-
2 files changed, 46 insertions(+), 4 deletions(-)
diff --git
a/src/ports/postgres/modules/deep_learning/madlib_keras_wrapper.py_in
b/src/ports/postgres/modules/deep_learning/madlib_keras_wrapper.py_in
index 211488c..4dd29d5 100644
--- a/src/ports/postgres/modules/deep_learning/madlib_keras_wrapper.py_in
+++ b/src/ports/postgres/modules/deep_learning/madlib_keras_wrapper.py_in
@@ -140,16 +140,28 @@ def parse_optimizer(compile_dict):
optimizers = get_optimizers()
_assert(opt_name in optimizers,
"model_keras error: invalid optimizer name: {0}".format(opt_name))
+
+ # If we use only the optimizer name
if len(opt_split) == 1:
final_args = None
+ # If we use optimizer object with no params
+ elif opt_split[1] == ')':
+ final_args = None
+ # If we give parameters to the optimizer
else:
opt_params = opt_split[1][:-1]
opt_params_array = opt_params.split(',')
opt_params_clean = map(split_and_strip, opt_params_array)
key_value_params = { x[0] : x[1] for x in opt_params_clean}
- final_args = { key: bool(value) if value == 'True' or value == 'False'
- else float(value)
- for key,value in key_value_params.iteritems() }
+
+ final_args = {}
+ for key,value in key_value_params.iteritems():
+ if value == 'None':
+ final_args[key] = None
+ elif value == 'True' or value == 'False':
+ final_args[key] = bool(value)
+ else:
+ final_args[key] = float(value)
return (opt_name,final_args)
# Parse the loss function.
diff --git a/src/ports/postgres/modules/deep_learning/test/madlib_keras.sql_in
b/src/ports/postgres/modules/deep_learning/test/madlib_keras.sql_in
index 08ac9cb..115af9d 100644
--- a/src/ports/postgres/modules/deep_learning/test/madlib_keras.sql_in
+++ b/src/ports/postgres/modules/deep_learning/test/madlib_keras.sql_in
@@ -219,7 +219,37 @@ SELECT madlib_keras_fit(
NULL,
'model name', 'model desc');
--- negative test case for passing non numeric y to fit
+DROP TABLE IF EXISTS keras_out, keras_out_summary;
+SELECT madlib_keras_fit(
+ 'cifar_10_sample_batched',
+ 'keras_out',
+ 'dependent_var',
+ 'independent_var',
+ 'model_arch',
+ 1,
+ $$ optimizer='Adam()', loss=losses.categorical_crossentropy,
metrics=['accuracy']$$::text,
+ $$ batch_size=2, epochs=1, verbose=0 $$::text,
+ 1,
+ FALSE,
+ NULL,
+ 'model name', 'model desc');
+
+DROP TABLE IF EXISTS keras_out, keras_out_summary;
+SELECT madlib_keras_fit(
+ 'cifar_10_sample_batched',
+ 'keras_out',
+ 'dependent_var',
+ 'independent_var',
+ 'model_arch',
+ 1,
+ $$ optimizer=Adam(epsilon=None), loss=losses.categorical_crossentropy,
metrics=['accuracy']$$::text,
+ $$ batch_size=2, epochs=1, verbose=0 $$::text,
+ 1,
+ FALSE,
+ NULL,
+ 'model name', 'model desc');
+
+-- -- negative test case for passing non numeric y to fit
-- induce failure by passing a non numeric column
create table cifar_10_sample_val_failure as select * from cifar_10_sample_val;
alter table cifar_10_sample_val_failure rename dependent_var to
dependent_var_original;