[
https://issues.apache.org/jira/browse/MADLIB-1348?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16852301#comment-16852301
]
Frank McQuillan commented on MADLIB-1348:
-----------------------------------------
https://github.com/apache/madlib/pull/399
LGTM
Tested from a previous madlib run:
(1)
load arch table with arch but no weights
{code}
DROP TABLE IF EXISTS model_arch_library;
SELECT madlib.load_keras_model('model_arch_library', -- Output table,
$$
{"class_name": "Sequential", "keras_version": "2.1.6", "config":
[{"class_name": "Dense", "config": {"kernel_initializer": {"class_name":
"VarianceScaling", "config": {"distribution": "uniform", "scale": 1.0, "seed":
null, "mode": "fan_avg"}}, "name": "dense_1", "kernel_constraint": null,
"bias_regularizer": null, "bias_constraint": null, "dtype": "float32",
"activation": "relu", "trainable": true, "kernel_regularizer": null,
"bias_initializer": {"class_name": "Zeros", "config": {}}, "units": 10,
"batch_input_shape": [null, 4], "use_bias": true, "activity_regularizer":
null}}, {"class_name": "Dense", "config": {"kernel_initializer": {"class_name":
"VarianceScaling", "config": {"distribution": "uniform", "scale": 1.0, "seed":
null, "mode": "fan_avg"}}, "name": "dense_2", "kernel_constraint": null,
"bias_regularizer": null, "bias_constraint": null, "activation": "relu",
"trainable": true, "kernel_regularizer": null, "bias_initializer":
{"class_name": "Zeros", "config": {}}, "units": 10, "use_bias": true,
"activity_regularizer": null}}, {"class_name": "Dense", "config":
{"kernel_initializer": {"class_name": "VarianceScaling", "config":
{"distribution": "uniform", "scale": 1.0, "seed": null, "mode": "fan_avg"}},
"name": "dense_3", "kernel_constraint": null, "bias_regularizer": null,
"bias_constraint": null, "activation": "softmax", "trainable": true,
"kernel_regularizer": null, "bias_initializer": {"class_name": "Zeros",
"config": {}}, "units": 3, "use_bias": true, "activity_regularizer": null}}],
"backend": "tensorflow"}
$$
::json, -- JSON blob
NULL, -- weights
'Sophie', -- name
'A pretty good model'
);
SELECT * FROM model_arch_library;
model_id | model_arch
| model_weights | name | description |
__internal_madlib_id_
_
----------+-----------------------------------------------------------------------------+---------------+--------+---------------------+---------------------------------
-------------
1 |
| | Sophie | A pretty good model |
__madlib_temp_72007016_155917654
2_57795859__
: {"class_name": "Sequential", "keras_version": "2.1.6",
: "config": [{"class_name": "Dense", "config": {"kernel_initializer":
: {"class_name": "VarianceScaling", "config": {"distribution":
"uniform",
: "scale": 1.0, "seed": null, "mode": "fan_avg"}}, "name": "dense_1",
: "kernel_constraint": null, "bias_regularizer": null,
"bias_constraint":
: null, "dtype": "float32", "activation": "linear", "trainable": true,
: "kernel_regularizer": null, "bias_initializer": {"class_name":
"Zeros",
: "config": {}}, "units": 2, "batch_input_shape": [null, 3],
: "use_bias": true, "activity_regularizer": null}}, {"class_name":
"Dense",
: "config": {"kernel_initializer": {"class_name": "VarianceScaling",
: "config": {"distribution": "uniform", "scale": 1.0, "seed": null,
: "mode": "fan_avg"}}, "name": "new_dense", "kernel_constraint": null,
: "bias_regularizer": null, "bias_constraint": null, "activation":
"linear",
: "trainable": true, "kernel_regularizer": null,
: "bias_initializer": {"class_name": "Zeros", "config": {}},
: "units": 10, "use_bias": true, "activity_regularizer": null}}],
: "backend": "tensorflow"}
:
(1 row)
{code}
OK
(2)
add another arch to arch table but no weights
{code}
SELECT madlib.load_keras_model('model_arch_library', -- Output table,
$$
{"class_name": "Sequential", "keras_version": "2.1.6", "config":
[{"class_name": "Dense", "config": {"kernel_initializer": {"class_name":
"VarianceScaling", "config": {"distribution": "uniform", "scale": 1.0, "seed":
null, "mode": "fan_avg"}}, "name": "dense_1", "kernel_constraint": null,
"bias_regularizer": null, "bias_constraint": null, "dtype": "float32",
"activation": "relu", "trainable": true, "kernel_regularizer": null,
"bias_initializer": {"class_name": "Zeros", "config": {}}, "units": 10,
"batch_input_shape": [null, 4], "use_bias": true, "activity_regularizer":
null}}, {"class_name": "Dense", "config": {"kernel_initializer": {"class_name":
"VarianceScaling", "config": {"distribution": "uniform", "scale": 1.0, "seed":
null, "mode": "fan_avg"}}, "name": "dense_2", "kernel_constraint": null,
"bias_regularizer": null, "bias_constraint": null, "activation": "relu",
"trainable": true, "kernel_regularizer": null, "bias_initializer":
{"class_name": "Zeros", "config": {}}, "units": 10, "use_bias": true,
"activity_regularizer": null}}, {"class_name": "Dense", "config":
{"kernel_initializer": {"class_name": "VarianceScaling", "config":
{"distribution": "uniform", "scale": 1.0, "seed": null, "mode": "fan_avg"}},
"name": "dense_3", "kernel_constraint": null, "bias_regularizer": null,
"bias_constraint": null, "activation": "softmax", "trainable": true,
"kernel_regularizer": null, "bias_initializer": {"class_name": "Zeros",
"config": {}}, "units": 3, "use_bias": true, "activity_regularizer": null}}],
"backend": "tensorflow"}
$$
::json, -- JSON blob
NULL, -- weights
'Maria', -- name
'Another pretty good model'
);
SELECT * FROM model_arch_library;
model_id | model_arch
| model_weights | name | description |
__internal_madl
ib_id__
----------+-----------------------------------------------------------------------------+---------------+--------+---------------------------+---------------------------
-------------------
1 |
| | Sophie | A pretty good model |
__madlib_temp_72007016_155
9176542_57795859__
: {"class_name": "Sequential", "keras_version": "2.1.6",
: "config": [{"class_name": "Dense", "config": {"kernel_initializer":
: {"class_name": "VarianceScaling", "config": {"distribution":
"uniform",
: "scale": 1.0, "seed": null, "mode": "fan_avg"}}, "name": "dense_1",
: "kernel_constraint": null, "bias_regularizer": null,
"bias_constraint":
: null, "dtype": "float32", "activation": "linear", "trainable": true,
: "kernel_regularizer": null, "bias_initializer": {"class_name":
"Zeros",
: "config": {}}, "units": 2, "batch_input_shape": [null, 3],
: "use_bias": true, "activity_regularizer": null}}, {"class_name":
"Dense",
: "config": {"kernel_initializer": {"class_name": "VarianceScaling",
: "config": {"distribution": "uniform", "scale": 1.0, "seed": null,
: "mode": "fan_avg"}}, "name": "new_dense", "kernel_constraint": null,
: "bias_regularizer": null, "bias_constraint": null, "activation":
"linear",
: "trainable": true, "kernel_regularizer": null,
: "bias_initializer": {"class_name": "Zeros", "config": {}},
: "units": 10, "use_bias": true, "activity_regularizer": null}}],
: "backend": "tensorflow"}
:
2 |
| | Maria | Another pretty good model |
__madlib_temp_83687777_155
9177024_9294215__
: {"class_name": "Sequential", "keras_version": "2.1.6",
: "config": [{"class_name": "Dense", "config": {"kernel_initializer":
: {"class_name": "VarianceScaling", "config": {"distribution":
"uniform",
: "scale": 1.0, "seed": null, "mode": "fan_avg"}}, "name": "dense_1",
: "kernel_constraint": null, "bias_regularizer": null,
"bias_constraint":
: null, "dtype": "float32", "activation": "linear", "trainable": true,
: "kernel_regularizer": null, "bias_initializer": {"class_name":
"Zeros",
: "config": {}}, "units": 2, "batch_input_shape": [null, 3],
: "use_bias": true, "activity_regularizer": null}}, {"class_name":
"Dense",
: "config": {"kernel_initializer": {"class_name": "VarianceScaling",
: "config": {"distribution": "uniform", "scale": 1.0, "seed": null,
: "mode": "fan_avg"}}, "name": "new_dense", "kernel_constraint": null,
: "bias_regularizer": null, "bias_constraint": null, "activation":
"linear",
: "trainable": true, "kernel_regularizer": null,
: "bias_initializer": {"class_name": "Zeros", "config": {}},
: "units": 10, "use_bias": true, "activity_regularizer": null}}],
: "backend": "tensorflow"}
(2 rows)
{code}
OK
(3)
train a model and copy over weights from madlib output table to model arch table
(a)
run 1
Initial training
{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed', -- source table
'iris_model', -- model output table
'model_arch_library', -- model arch table
1, -- model arch id
$$ loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy'] $$, -- compile_params
$$ batch_size=5, epochs=3 $$, -- fit_params
5, -- num_iterations
0, -- GPUs per host
NULL, -- validation dataset
1, -- metrics compute
frequency
'Sophie', -- name
'Simple MLP for iris dataset' -- description
);
INFO: Training set loss after iteration 1: 0.826811790466.
INFO: Training set loss after iteration 2: 0.721804022789.
INFO: Training set loss after iteration 3: 0.644849896431.
INFO: Training set loss after iteration 4: 0.585302889347.
INFO: Training set loss after iteration 5: 0.540865719318.
INFO: Training set metric after iteration 1: 0.666666686535.
INFO: Training set metric after iteration 2: 0.683333337307.
INFO: Training set metric after iteration 3: 0.683333337307.
INFO: Training set metric after iteration 4: 0.741666674614.
INFO: Training set metric after iteration 5: 0.741666674614.
SELECT * FROM iris_model_summary;
-[ RECORD 1
]-------------+--------------------------------------------------------------------------------------------
source_table | iris_train_packed
model | iris_model
dependent_varname | class_text
independent_varname | attributes
model_arch_table | model_arch_library
model_arch_id | 1
compile_params | loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy']
fit_params | batch_size=5, epochs=3
num_iterations | 5
validation_table |
metrics_compute_frequency | 1
name | Sophie
description | Simple MLP for iris dataset
model_type | madlib_keras
model_size | 0.7900390625
start_training_time | 2019-05-30 18:14:02.974886
end_training_time | 2019-05-30 18:14:13.137785
metrics_elapsed_time |
{3.07278394699097,4.35965490341187,5.76982879638672,7.13418292999268,10.162889957428}
madlib_version | 1.16-dev
num_classes | 3
class_values | {Iris-setosa,Iris-versicolor,Iris-virginica}
dependent_vartype | character varying
normalizing_const | 1
metrics_type | {accuracy}
training_metrics_final | 0.741666674614
training_loss_final | 0.540865719318
training_metrics |
{0.666666686534882,0.683333337306976,0.683333337306976,0.741666674613953,0.741666674613953}
training_loss |
{0.826811790466309,0.721804022789001,0.644849896430969,0.585302889347076,0.54086571931839}
validation_metrics_final |
validation_loss_final |
validation_metrics |
validation_loss |
metrics_iters | {1,2,3,4,5}
{code}
Now copy weights from madlib output table to model arch table:
{code}
UPDATE model_arch_library SET model_weights = model_data FROM iris_model WHERE
model_id = 1;
{code}
(b)
run 2
Re-train to use weights from previous run (kind of like warm start):
{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed', -- source table
'iris_model', -- model output table
'model_arch_library', -- model arch table
1, -- model arch id
$$ loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy'] $$, -- compile_params
$$ batch_size=5, epochs=3 $$, -- fit_params
5, -- num_iterations
0, -- GPUs per host
NULL, -- validation dataset
1, -- metrics compute
frequency
'Sophie', -- name
'Simple MLP for iris dataset' -- description
);
INFO: Training set loss after iteration 1: 0.503705084324.
INFO: Training set loss after iteration 2: 0.470966666937.
INFO: Training set loss after iteration 3: 0.445806771517.
INFO: Training set loss after iteration 4: 0.419732987881.
INFO: Training set loss after iteration 5: 0.396750748158.
INFO: Training set metric after iteration 1: 0.791666686535.
INFO: Training set metric after iteration 2: 0.833333313465.
INFO: Training set metric after iteration 3: 0.875.
INFO: Training set metric after iteration 4: 0.899999976158.
INFO: Training set metric after iteration 5: 0.916666686535.
SELECT * FROM iris_model_summary;
-[ RECORD 1
]-------------+------------------------------------------------------------------------------------------
source_table | iris_train_packed
model | iris_model
dependent_varname | class_text
independent_varname | attributes
model_arch_table | model_arch_library
model_arch_id | 1
compile_params | loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy']
fit_params | batch_size=5, epochs=3
num_iterations | 5
validation_table |
metrics_compute_frequency | 1
name | Sophie
description | Simple MLP for iris dataset
model_type | madlib_keras
model_size | 0.7900390625
start_training_time | 2019-05-30 18:23:08.888368
end_training_time | 2019-05-30 18:23:18.453456
metrics_elapsed_time |
{3.46771907806396,4.58241200447083,5.6557719707489,6.93159699440002,9.56508588790894}
madlib_version | 1.16-dev
num_classes | 3
class_values | {Iris-setosa,Iris-versicolor,Iris-virginica}
dependent_vartype | character varying
normalizing_const | 1
metrics_type | {accuracy}
training_metrics_final | 0.916666686535
training_loss_final | 0.396750748158
training_metrics |
{0.791666686534882,0.833333313465118,0.875,0.899999976158142,0.916666686534882}
training_loss |
{0.503705084323883,0.470966666936874,0.4458067715168,0.419732987880707,0.396750748157501}
validation_metrics_final |
validation_loss_final |
validation_metrics |
validation_loss |
metrics_iters | {1,2,3,4,5}
{code}
Now copy weights from madlib output table to model arch table:
{code}
UPDATE model_arch_library SET model_weights = model_data FROM iris_model WHERE
model_id = 1;
{code}
(c)
Run 3
Train again
{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed', -- source table
'iris_model', -- model output table
'model_arch_library', -- model arch table
1, -- model arch id
$$ loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy'] $$, -- compile_params
$$ batch_size=5, epochs=3 $$, -- fit_params
5, -- num_iterations
0, -- GPUs per host
NULL, -- validation dataset
1, -- metrics compute
frequency
'Sophie', -- name
'Simple MLP for iris dataset' -- description
);
INFO: Training set loss after iteration 1: 0.376342386007.
INFO: Training set loss after iteration 2: 0.356429725885.
INFO: Training set loss after iteration 3: 0.33902746439.
INFO: Training set loss after iteration 4: 0.323304623365.
INFO: Training set loss after iteration 5: 0.308936685324.
INFO: Training set metric after iteration 1: 0.949999988079.
INFO: Training set metric after iteration 2: 0.958333313465.
INFO: Training set metric after iteration 3: 0.949999988079.
INFO: Training set metric after iteration 4: 0.949999988079.
INFO: Training set metric after iteration 5: 0.958333313465.
SELECT * FROM iris_model_summary;
-[ RECORD 1
]-------------+--------------------------------------------------------------------------------------------
source_table | iris_train_packed
model | iris_model
dependent_varname | class_text
independent_varname | attributes
model_arch_table | model_arch_library
model_arch_id | 1
compile_params | loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy']
fit_params | batch_size=5, epochs=3
num_iterations | 5
validation_table |
metrics_compute_frequency | 1
name | Sophie
description | Simple MLP for iris dataset
model_type | madlib_keras
model_size | 0.7900390625
start_training_time | 2019-05-30 18:26:38.982926
end_training_time | 2019-05-30 18:26:48.017231
metrics_elapsed_time |
{3.31328082084656,5.12690782546997,6.50730085372925,7.78843688964844,9.03430604934692}
madlib_version | 1.16-dev
num_classes | 3
class_values | {Iris-setosa,Iris-versicolor,Iris-virginica}
dependent_vartype | character varying
normalizing_const | 1
metrics_type | {accuracy}
training_metrics_final | 0.958333313465
training_loss_final | 0.308936685324
training_metrics |
{0.949999988079071,0.958333313465118,0.949999988079071,0.949999988079071,0.958333313465118}
training_loss |
{0.376342386007309,0.356429725885391,0.339027464389801,0.323304623365402,0.308936685323715}
validation_metrics_final |
validation_loss_final |
validation_metrics |
validation_loss |
metrics_iters | {1,2,3,4,5}
{code}
Put them closer together to see if they pick up from where they left off:
(a)
INFO: Training set loss after iteration 1: 0.826811790466.
INFO: Training set loss after iteration 2: 0.721804022789.
INFO: Training set loss after iteration 3: 0.644849896431.
INFO: Training set loss after iteration 4: 0.585302889347.
INFO: Training set loss after iteration 5: 0.540865719318.
INFO: Training set metric after iteration 1: 0.666666686535.
INFO: Training set metric after iteration 2: 0.683333337307.
INFO: Training set metric after iteration 3: 0.683333337307.
INFO: Training set metric after iteration 4: 0.741666674614.
INFO: Training set metric after iteration 5: 0.741666674614.
(b)
INFO: Training set loss after iteration 1: 0.503705084324.
INFO: Training set loss after iteration 2: 0.470966666937.
INFO: Training set loss after iteration 3: 0.445806771517.
INFO: Training set loss after iteration 4: 0.419732987881.
INFO: Training set loss after iteration 5: 0.396750748158.
INFO: Training set metric after iteration 1: 0.791666686535.
INFO: Training set metric after iteration 2: 0.833333313465.
INFO: Training set metric after iteration 3: 0.875.
INFO: Training set metric after iteration 4: 0.899999976158.
INFO: Training set metric after iteration 5: 0.916666686535.
(c)
INFO: Training set loss after iteration 1: 0.376342386007.
INFO: Training set loss after iteration 2: 0.356429725885.
INFO: Training set loss after iteration 3: 0.33902746439.
INFO: Training set loss after iteration 4: 0.323304623365.
INFO: Training set loss after iteration 5: 0.308936685324.
INFO: Training set metric after iteration 1: 0.949999988079.
INFO: Training set metric after iteration 2: 0.958333313465.
INFO: Training set metric after iteration 3: 0.949999988079.
INFO: Training set metric after iteration 4: 0.949999988079.
INFO: Training set metric after iteration 5: 0.958333313465.
OK
(4)
model id does not exist
{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed', -- source table
'iris_model', -- model output table
'model_arch_library', -- model arch table
3, -- model arch id
$$ loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy'] $$, -- compile_params
$$ batch_size=5, epochs=3 $$, -- fit_params
5, -- num_iterations
0, -- GPUs per host
NULL, -- validation dataset
1, -- metrics compute
frequency
'Sophie', -- name
'Simple MLP for iris dataset' -- description
);
ERROR: plpy.Error: no model arch found in table model_arch_library with id 3
(plpython.c:5038)
CONTEXT: Traceback (most recent call last):
PL/Python function "madlib_keras_fit", line 21, in <module>
madlib_keras.fit(**globals())
PL/Python function "madlib_keras_fit", line 42, in wrapper
PL/Python function "madlib_keras_fit", line 105, in fit
PL/Python function "madlib_keras_fit"
{code}
OK
> Weight initialization/transfer learning madlib_keras_fit()
> ----------------------------------------------------------
>
> Key: MADLIB-1348
> URL: https://issues.apache.org/jira/browse/MADLIB-1348
> Project: Apache MADlib
> Issue Type: Improvement
> Components: Deep Learning
> Reporter: Nikhil
> Priority: Major
> Fix For: v1.16
>
>
> Context
> Many deep neural nets are not trained from scratch, but rather initialized
> from weights generated by training related data sets using the same model
> architecture (particularly true for CNN).
> Story
> As a data scientist,
> I want to start training a model based on weights that I have,
> so that I don't have to start from scratch.
> * e.g, use weights from one dataset (e.g., VGG-16 on Imagenet) as starting
> point to training VGG-16 model on my data.
> Details
> 1. add support for optional param to load weights
> 2. add “name” , “description” to model arch table
> Interface
> {code}
> load_keras_model(
> keras_model_arch_table,
> model_arch,
> model_weights, -- OPTIONAL
> name, -- OPTIONAL
> description -- OPTIONAL
> )
> {code}
> Acceptance
> 1. Take a trained model with a known accuracy and load into the model arch
> table (can be simple).
> 2. Use it as input to training with fit() on the same data set it was trained
> on. Since it has already converged, it should show the same accuracy on the
> 1st or 2nd iteration as before.
> 3. Test load from keras library [2]. Pick any model, get the weights and
> test load into model arch table. Test for 1 or 2 iterations on any dataset
> to check that it runs.
> Reference
> [1] VGG16 and other pre-trained weights for Imagenet are built into Keras
> https://keras.io/getting-started/faq/#how-can-i-use-pre-trained-models-in-keras
> [2] http://cs231n.github.io/transfer-learning/
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)