From 9a9c49bcfd946e04ab5a8163ea6afba068ef2de2 Mon Sep 17 00:00:00 2001 From: "Claudio Maggioni (maggicl)" Date: Tue, 4 May 2021 11:45:05 +0200 Subject: [PATCH] hw1: wip --- .../deliverable/linear_regression.pickle | Bin 0 -> 601 bytes .../nonlinear_model/keras_metadata.pb | 12 ++++ .../nonlinear_model/saved_model.pb | Bin 0 -> 189466 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 19722 bytes .../nonlinear_model/variables/variables.index | Bin 0 -> 2850 bytes .../nonlinear_model_normalizers.pickle | Bin 0 -> 278 bytes assignment_1/deliverable/run_model.py | 54 ++++++++++++++++-- assignment_1/src/{t1.py => build_models.py} | 43 +++++++------- 8 files changed, 83 insertions(+), 26 deletions(-) create mode 100644 assignment_1/deliverable/linear_regression.pickle create mode 100644 assignment_1/deliverable/nonlinear_model/keras_metadata.pb create mode 100644 assignment_1/deliverable/nonlinear_model/saved_model.pb create mode 100644 assignment_1/deliverable/nonlinear_model/variables/variables.data-00000-of-00001 create mode 100644 assignment_1/deliverable/nonlinear_model/variables/variables.index create mode 100644 assignment_1/deliverable/nonlinear_model_normalizers.pickle mode change 100644 => 100755 assignment_1/deliverable/run_model.py rename assignment_1/src/{t1.py => build_models.py} (73%) diff --git a/assignment_1/deliverable/linear_regression.pickle b/assignment_1/deliverable/linear_regression.pickle new file mode 100644 index 0000000000000000000000000000000000000000..ec34b3432694a0e39acd6d6ba3cce55f5fd6caaa GIT binary patch literal 601 zcmYLH&1(}u6i-?=CIw5Ymb4xU-dYNat*v^Hy4r)#)QAP~<1)_f&Ss|BomppgQz8m_ zuqHAG!50W3Merj23nCE|JbLsXs7Egz)PuL`WYg+9%)IyJ_ul;8$K8FMbNO5*`iQEB z1WRs*jGG%p!Y84PT&xJ_v9-*(PHK`U#RP}PFnbT~z>Gc+ummxl5b2RPfwnGjAtM~J zTf`UzPsB}h6MD~kfXpZmCvH6U#%ieqBFxNmeJeG{tl zD@ON|rt#B*dz!%x1*f3hdI0M%QyJFz(@?EeSN|Bvj!G^8SC8N@6q_iDa15=~{rdLC z>)Vqh=fZJ0{9)*Gk36}4@zvJ1-W&hdr}obCGcUSxC(GXVUMC%NJf};@l+FB<7{U`7 zVcQdu*ijlLY(QHVl!rsyFOp8L6o1#}p6Zv|4s01_+LD;pv!0a{IuDn+%O4*tI44@OUzRUV mIi00FmLva$i{SjOGpEPU?!KS~k=aJ*!ZCYc(VmCYwf_RnUhV7v literal 0 HcmV?d00001 diff --git a/assignment_1/deliverable/nonlinear_model/keras_metadata.pb b/assignment_1/deliverable/nonlinear_model/keras_metadata.pb new file mode 100644 index 0000000..2e13065 --- /dev/null +++ b/assignment_1/deliverable/nonlinear_model/keras_metadata.pb @@ -0,0 +1,12 @@ + +Froot"_tf_keras_sequential*F{"name": "sequential", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "dense_input"}}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 30, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "dtype": "float32", "units": 10, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_4", "trainable": true, "dtype": "float32", "units": 5, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_5", "trainable": true, "dtype": "float32", "units": 3, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_6", "trainable": true, "dtype": "float32", "units": 2, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_7", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}]}, "shared_object_id": 25, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 2}}, "shared_object_id": 26}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 2]}, "is_graph_network": true, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [15, 2]}, "float32", "dense_input"]}, "keras_version": "2.5.0", "backend": "tensorflow", "model_config": {"class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "dense_input"}, "shared_object_id": 0}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 30, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 1}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 2}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 3}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 7}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 9}, {"class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "dtype": "float32", "units": 10, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 10}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 11}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 12}, {"class_name": "Dense", "config": {"name": "dense_4", "trainable": true, "dtype": "float32", "units": 5, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 13}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 14}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 15}, {"class_name": "Dense", "config": {"name": "dense_5", "trainable": true, "dtype": "float32", "units": 3, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 16}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 17}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 18}, {"class_name": "Dense", "config": {"name": "dense_6", "trainable": true, "dtype": "float32", "units": 2, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 19}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 20}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 21}, {"class_name": "Dense", "config": {"name": "dense_7", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 23}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 24}]}}, "training_config": {"loss": "mse", "metrics": [[{"class_name": "MeanMetricWrapper", "config": {"name": "mse", "dtype": "float32", "fn": "mean_squared_error"}, "shared_object_id": 27}]], "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "RMSprop", "config": {"name": "RMSprop", "learning_rate": 0.0010000000474974513, "decay": 0.0, "rho": 0.8999999761581421, "momentum": 0.0, "epsilon": 1e-07, "centered": false}}}}2 +root.layer_with_weights-0"_tf_keras_layer*{"name": "dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 30, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 1}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 2}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 3, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 2}}, "shared_object_id": 26}, "build_input_shape": {"class_name": "TensorShape", "items": [15, 2]}}2 +root.layer_with_weights-1"_tf_keras_layer*{"name": "dense_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 30}}, "shared_object_id": 28}, "build_input_shape": {"class_name": "TensorShape", "items": [15, 30]}}2 +root.layer_with_weights-2"_tf_keras_layer*{"name": "dense_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 7}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 9, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 20}}, "shared_object_id": 29}, "build_input_shape": {"class_name": "TensorShape", "items": [15, 20]}}2 +root.layer_with_weights-3"_tf_keras_layer*{"name": "dense_3", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "dtype": "float32", "units": 10, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 10}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 11}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 12, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 20}}, "shared_object_id": 30}, "build_input_shape": {"class_name": "TensorShape", "items": [15, 20]}}2 +root.layer_with_weights-4"_tf_keras_layer*{"name": "dense_4", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_4", "trainable": true, "dtype": "float32", "units": 5, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 13}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 14}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 15, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 10}}, "shared_object_id": 31}, "build_input_shape": {"class_name": "TensorShape", "items": [15, 10]}}2 +root.layer_with_weights-5"_tf_keras_layer*{"name": "dense_5", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_5", "trainable": true, "dtype": "float32", "units": 3, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 16}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 17}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 18, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 5}}, "shared_object_id": 32}, "build_input_shape": {"class_name": "TensorShape", "items": [15, 5]}}2 +root.layer_with_weights-6"_tf_keras_layer*{"name": "dense_6", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_6", "trainable": true, "dtype": "float32", "units": 2, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 19}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 20}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 21, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 3}}, "shared_object_id": 33}, "build_input_shape": {"class_name": "TensorShape", "items": [15, 3]}}2 +root.layer_with_weights-7"_tf_keras_layer*{"name": "dense_7", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_7", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 23}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 24, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 2}}, "shared_object_id": 34}, "build_input_shape": {"class_name": "TensorShape", "items": [15, 2]}}2 +qroot.keras_api.metrics.0"_tf_keras_metric*{"class_name": "Mean", "name": "loss", "dtype": "float32", "config": {"name": "loss", "dtype": "float32"}, "shared_object_id": 35}2 +rroot.keras_api.metrics.1"_tf_keras_metric*{"class_name": "MeanMetricWrapper", "name": "mse", "dtype": "float32", "config": {"name": "mse", "dtype": "float32", "fn": "mean_squared_error"}, "shared_object_id": 27}2 \ No newline at end of file diff --git a/assignment_1/deliverable/nonlinear_model/saved_model.pb b/assignment_1/deliverable/nonlinear_model/saved_model.pb new file mode 100644 index 0000000000000000000000000000000000000000..22064e70ca9d8475a7135d5cd93efe5caf7817cb GIT binary patch literal 189466 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 literal 0 HcmV?d00001 diff --git a/assignment_1/deliverable/nonlinear_model/variables/variables.data-00000-of-00001 b/assignment_1/deliverable/nonlinear_model/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000000000000000000000000000000000..5432cfe9c617d2d86d0954fe8e563da604fc1b79 GIT binary patch literal 19722 zcmc(Ec|28J`#zbDlkp%kO)^BrbN1T%oV|{eqLgF^C8-FB43(!Og^YzVR8(kE35g_U zuOq26Pby84=A=QTH2#j`;jOoL`n;d-^Z6Zrtb6Ts@9VnveXYIMx|eIOl;ErIQr;Yv z3OCC9Hnnhc864kM%s#V(#w|Ftg3>#vz}=Z(!Oa`L7KWXWC2h)&qE-1L`K?d3LvS^S z2X2+1d13}I$#ytDNbMwiP7^0%MxW-<)~WD|U8QP*d4x=pg zX>kiC?j>JU1tMh_N?w>jgXf2aacVAPLlK8oIBQ}tb@QTc^pV=5+`v5-=z&2YLpoLsn}V5xkk+gn7MikPCM z8yTn=HIYh=m*JAgLlBO ziX|KTB+y!yLipY0KAcz=PeR9g)Uj83s32E@pKYEe zcD$5KPkBb}?$knct4d+9vMY>FaHfWIWFWaS`{54#?{L(;BS^!`4t7OLqjy^RD0Nr> zERK9h7Cx6lE}bLDwX8U5?^8**@x2z}D`>!sr#9&F%4Ec76(cVt1F}eNJ@0+=WTfW3 znA|nv0{JXn9^z*Vp>nM}eCXN$3x{d(nPqv;s!SzPgFbZ*}F?J>>m+Npo^j{Ta-YPlj?P0KXIr@95|8*D zNo%?4AM?4*sk;2gmK9{)kU`viy6xz!h&0R#sD*dL1K5m?SENDWMYPr|9xcrJNII*t zQ0X>p^03}?Ua5N_GHwn;Z^q4lUp8CuZC&%A$P^LomB)$j?8q>*#iIaywWLEY!=-S~ zoe)lI#ct|j+;ehzl^*|#R{(OqsD=E$jesR+2uh6Aq?$Jtz?_=FXkyU`ST06~;sHyL zZ><9gjuYpW-lbq&+7+1e#Tbr{7+rH=Pb@6lUr*ADCP41HzfkBX4{EzzE3C~J%E|V3 zp`spjQX;t)Xy+<1)Ue|t3iMeCwM*5|huxE)k>fs8%g*FIJ2xEN**Oc|J9H41<%poh zH^-5}AZaRglN4OBPXe8Jcpq}qQpivne}tTTbrh2cy-&PpJnc1;{`<6FzimB?tRU z!qcl­h;Pu#AS%s8A)Rd%_eJp2T?HD)`k+gnJU{JsvIK1-s5o^RoLnh~$#Jwyj~ z$HA7W5Oij}6<@DN4Ys{~M}mZn=u2oU8F{<`j&w|dCzp;!bm^;TYDNOu&pyZ5QY;Ry zWBR-u$|dM!qaNa3DTfPJw2*sVB~TO3F`!C{9I}4Dns58o96|PeSaYHj@|S!i5AJX0 zb#f}%(RR0LV&v)2;PM*s$O>ghd%PC%(p1s(rV{uCn8Jmgt!U7LM9R0M5;p9rY9*Hou8o0kv{n$BIcfu$|8^Y5T1plwk|Y%H<~}SxvIddw-@zLPZBP)`53aJM!`QcvNEhF;)Ugo~C@roK`sm*$ zN1uMonfz@uda>^Tc_mdI(Z_5;e~qx>LnBwJq1ubTIXfL?ZIgj(xa0Wm&eT!7ZS#;$ z;Wf1Pu?spLGn=~UB+AcHa3M3x3!rs?1IqaPiKohqLAn)H@cZ+*utHA{zM)p2hP!zv z7q6vwier((qEu9%$m0!ZTu*L&mxM-Y$3ms6#*h}V3)1K1ph4FP(b;xcZh}Dv3e?U( zyibZS->8Z-U9}BXyp`f!_pyRStYfI!a~t(ec^^_Y&_SOZODRf31+pE>Q2T)vQf5an z%FsMZy*%ke)^A&l-iOG+ZAs6_B{z3Ko#B;e27dxslEOgyj?be;8Orewjf_T9iezA7 z@dC>I^$POC!znP=<|g7fM^P)b z!MKzhv^6>jNgb0yc2@h*ymfm}=!X`( zw1K3@jpiSzRe)f`Cb+-3kdilhPpO3{pMh{-CMtb@k)MklPnCZBby8T`q#_}y- z%ja6k-8-Io=spE{T&O0CjWE7GcRHGU-41RXasa6;T8PZ@*20xl zQ_JP&p)>7KWJlr{K7ebGTvi}zGH@UxFK5G>lUBn+4eMc$ycrzf5e`M-4^a0>8f?8C z&sX8dp!_TXuF=+n3)?Em4{L6ty4Dsr)#fv0o+pWnoy8#V4Mam2d8AwPG+yPqp)g~- z7)gb$M%u<}IXlmZaRc);k(N&yIb&HJy2WvV%Zhc-A;GsPmopCKO}9pa$0LZz@u1V) zDj2Ik=kosYLC2F;la+TQxOW`3LdT6J@Xd-?NHG`u@Hl-qu00HWH0>ZOcOO9F<`bc2c?!RnUj|bHcc4R@ z7&y=B1X`K6AGy0rz!mp*QRy>|z%->CNL{c(I){hw8>4ois0$L@5odYuXofUYJsE)< zthP~f*L0Mw-pH{$xE`H9^$pG$TZ$ZAebJHY-^iS+pODoSJudMm4HfLCaXrkg!REbJ zkxBJ#sI@N*mclDq493(-0*pz~%s=T6t?03RBwo^zY3nMf|%O2%<=)i9q zJ2`FpW%=&kRL~8}gV6Pi7K(nl8eN+#cyA5#VC4QMl&4P~<>7t@rF~w5!uKgs3xkcJ zh~O8qOcrK$c%d?Hny@eWjiT0_-v-weC_ob*lN=3qn(16qBMvjWu~E!8F(|n+F4*o#gC!z83AVnhw(!x4uM)Mp7o#uJUqg{=iZEpGYBEr960(~vk3d==Tqi5VXE!BL{#s2)UR|A= z=5q#}-nVerJ7 zPmTLfhb)f#V%DQsr)R?oGdj%J)(#UA51}_-a^NP925QFJXfjrFDOGYgm;dY$lM`|* zgJbzZ5j{jPXf|2NzA|SHEc5Jw9lM_Lw$I;25fx+6Ht!car!~2#WWG1tb=8=By73vh znJ>`(VLa^m;16?Vw4yI5%h5f_^Jw0LWH|X`40Nw-A?X#@Q2H}Z7*2mi`fmS>>TI;Q zUQ?5)4OLU&=k(POHe9N~qT;C{1!-usFbApxD#Hc0mLflXHI>JPh|f$#XJ+$wiwqH! ze%%2cp3FrG+65HteF@Z#?xMEWsG(Vx=v>b`zA%3CYFP9<4UOI5gVsj1lGhDnA>-qV zn(L^MTr05&m1PCPNt4sjM>7%rkQ@6DgDcKW%!TmN+$wnR%)_##z4XGa>6T6PO+8->CH^I0&$;4_@LSx|2{og$Z=k)dup z-VU9|o`F-H5L9qYB_+J3!0f`$@I(V2wM*8Z`!Pe&rHM!3$Eq-R>6t4O$-cljt>}#w zdo4g(P4Xzeqk=;(+lj_Ejz<;kboesv07{OGMbj*KoZ3(gj-mf}^g=2TrmLKxT2$YW zNsU&hC^nd!yN*SEII|OuU4I+VhgHER8zzufwoQW0^EOk`HpSG$lku?N;t6t+<0;-D zZ96{Nm5Mg*xeG@eO6A0kmO|2DV_?;YG~|VKlCdXZpw;{J)O0a@N>8E)u6*JOiA)jL z>8Z@OtC8d%*ee1lLocdcbp!cv<3KXx!ySD#%oaykoHp z+GI(%v5j~C;PdmHoD_-k*Zr11H~1JDb2DfwDZMb6!9{aTx=!-L029; zYsseW%nL>b^!C&!sGLQeX&b0#*jCgY`-B(zau?hrk_*RXu7P{qDERDd2Q@U@5S>hX zhW?tPg_bs-C*I$DJt?4V%Z#nZ$FRc zH(RT7B}e+9$4)X_&Dtg;HT??mI~hz`1zm0#E zNhrG90;RW{MtdWVlQ9SHz`ai2(91X_R8y&mw&rBP{I7{TX5lO7_W3wsRvUA&svP+p zb;fAto1IXMvWEWQh0xw0pQZ~3|G>ZptP`~NW}9L zrL$O;A3k>?JkG-@abg{`m~s?Ocu2fcQAW9o(K7ueG*h0zE&t?0rth6Xj=oudTs($x!)x~;Coz4rZCnck)jMEHQxmBs zH35lc_;R%xTG1%g4VfY ztBcjSC5Nlw+2@&*!#r~sIYbW;I?XWqT0CX5!xq}rcT&zB>4;)#bGu|R;I&dE{tA3&Gt8+ybWx{jr^4!5YW^*sMzoeqCEaz@Xwn48y2a|g@rIXT4 zv(cW{>eN-*EAnfQCUg&yQoi>{>Cpjjm-Tfdk~D>k zsW(HHq=s_C^sKnkmN-*{T?TUbZp0U(L2j~?2KTskD4elVhfD0a3~kTn^QvjtFmua! zI7+`3MYT>Z&(<$QI?e>$oSs^oEi}Ep!yR#jCLWeVHFisMF(N^atDQWSajU0py`oD&rS<|=& z{l7znb|s3rVlz6<5#>4@mFB-wOoh{~-zArKDxym>)%bz8kMQ)wSqQta4F$|`e^+d9u=M%)6 zTa8F*@k?mF;JZBOs2|^U*kEqP+>@}d%Yna%RRR}bEl}nIkNYkmkiU3d6y$8|j-clk z!iXihEk8d$uH(M3)*>QS<9gddmK|~S#ag!g@KJh5Mxr-|d9mKvS zR);Uu*+rPGeM?kp;l!v$k~r!-g}r#F6=&9DW%lMWoR~hB}hlcPcm`!ixdfi zjq*^V{sh}pmCJtFeuijwI>O#f#IXOmSV!2N_GPPgq_8K4Gsw+K4Qw;68hfQ$6mjOr zFm_SqPGVC110q1r4KE6+BkqkgB&K?JuqPINWS`%$hy798gdJSv#C|$QhGVGJKyn?_v6Yk062~sJ65nAnVRu1+eOtvIIOyBS(n;W}Xjba{MEqav~aJez}Ja_C1VG_T5ZK zBxV!KKR>|h1}PDN({}^z*Fj)qJjPn0;b+nv$C^`Xg?O9~7jeB0Is{3V?TL4I3rlT7 z1kt5>3pBpDg`%EkjvpJ+kj0|hRJ{{=5KH2AhphYqG!Hprf#m6$R*P#o&0X9h0rPvATc7w@rk2t|i5w)ldR2xP3^7x5RV{Gayw8ADz1$b6A=S3cfb8W^;}) zyYJaDr_t)md0nQ&;GwL?Z#Au^TgEfKp4qJ?0O=S9%^<{c~PMkrQ9&jZ#o=-`#cDlDb6g!N(kBlB*q342S0 z&z(=4#DeElVV(-Nh4`19kFZ8;I0BZ`q+)whRl)vkMnKYOE?y~f3!jzc3dC@2{3urm z7xbNU+LeV4Z63ZFN1<{*5{*EsNE?hPTni0MbxnAVAed|@%R8axBLN4Dd> zOk=jv)}8F*Yi1D-mais`>=DC{4p+ufy||X$v3370G%2&YTgh(`M1I>2;^Ct#A^wMr z+E|P~&K@yD9iLFKhv3)M;gzn{#Qi;&2y+)vVtsI{Z38h;yZCxjv=LzG^SYE~JFwdJK zSzn4*Vy0$SL7J%s9+FIA6$w``12buSOUnk3#v2AW-=|qf>?#7Op{C%>IVt>(Tqcma zKnUOAvgZ$l_kR*|zylmz%`djK3H?`Yna(1H9>61+Oi)gjz>G`2frE58yym7d#(4Dv zli6GY46fvZJn<^bw$c?h1}&ta>MKLHJ&4M2ix4S3a&j_C#_Vp0|hK*CUMj2>IXQV#31nou-D_&vpE z7zv**WaVZoG))4G%Fz?z4N|+xlsp%N6)7;V{j1hsb8AN8T(dl)q1uKG8V=)0-(-lh zY&vd~^ch&F&jZh?(Lx<@14=lbRU?&%ptE1_r;3k+aq^$#Vre2aY}wJLLB2nN2lz%#e?9LcCE>S{RS(kyK{c(khF#qb9<4 zTW#YArgBFewmv<9If1!{X_2demq^g>bTP}>RORNr4IC6~$c_e}-w!Z)YC>P`J^=Da5$kq3<+r~T;X2yEB zSPjb!lw#g~rN`2!e;|ynaOMSJd=2lVW2&u>{NP1HmzK$J>q-;MC_m!0K*1*gsPoL`rdm_kCT|vtGu2KZtkC+l=SdCJ5sz zQ(<449RpB*b$&84Bi~QD-mhn1nyKVBxj- z21K0dFrn|GW0Alrnnpz3&c~-NAB3wMC+iIeAyab z;4`t(Dx0(su9e;2E8_?qVSE{bPvCOquW_YQi9()R!@XI{?l1{fpaq!kd;?c;x&r3% z@MmLFIg4C|6K+>k*pHOshyeLqEJe4D@bLA<01Go8e8 zKg;7j8oAhXjy2JK_!Ec;P6KMArwY~~KBn(J2?T@}<1@$9V?~1Xhx0%Z8+`5y9+a{~ z@GsJG+#(_sth*8dhUY%SI}7h)r;a^f*^Q!DVJtevRyYRE4Uz(v9|+!YC`!cMU|=R5 zX;|PF1N=~l6E~V8lo{ z{M(QjSaYHpHgfz7-1m(gw!6}kHGbN1Ouf^Ib@odE#$R*^^D!QS&0U0n&Du$^RT=L?X2WE zT439EX)JeaE&h6}C9tqHW~Z(mgK)naOTB z04}%df=gZ*So2MNu;ZRIc6Eg)2;*2|_F@Mx_g%NK_Bq4w%&dciUDqL2?a3spRA(+; zmYsrGf4aqdAz5TK{Ph;>MU|0IqfDPj=2OpF;djc)K$WR>Jlg8%@dM2G?PGh^P9+*M zq{N>&v`hvx+b^)XGTFz{Fe#6@Pi?tr_niN~{GG$M6Ib$$u|;(i_?o0jyexAAajnS~ zoJ&r`*Ex)1^AFF%?6&w}Z4R5jqX(VX!$w)Q->YljukCH1Oj({?uqzj2_={nqW{kk; zWg5bF`u{S%(X&K}1uy(Dj(h@f!Wn^a=V#;eQ`O+Z4g)YMH49HSUJI7c%`jO-dC;{p z0$ZO;f{U4jVBg6>xWO?FF|kPj+jIB|wka$P_p_P;KGCk@ZE7vdmlbYUOGP$FoUKM& z`O690s_g_WIgTSnZZK!**r%|jOAWyqROYf&FJ^&z_4;79Z7guz_W+dKSH#AJ-DFCk zSJ>&5ieP@4J>gjL43m(SW!uK%_~UnN*fO6X_{w2k;AH3?{ON(0U{^#cHa99B+)%xO z(NeeI!S)|PWmB{u_IBc0dnEQYb3EAnO|Z^~a{kZrx6I=-PBf`u6IeRLX7fwnvA!~M zs`D^xjtmd;`}`I^sJj`P>^Yugu<{9rYPiKRePBeiGH+qK{R}Yg`ay(O=~}F1vN@(} z?+tXsi>y+8rw|T)hq3h5mqh-DSKzM|6Ii<(t^?JNk1?kqBXD`Aw_tBzGNvar6AVvH z#H6=;2IroO;M@P2g!>h62*s8o1F`g}3xDnTMF$M;w-{Y^IYy#7UJF_P|e~4e5RfvC)T+6Q7+YBUi82Ebe z?L?>JMWMcTPV6EyB9pL zcjD0uN0!dneR%ASRzgg1Bym{2XaC*p*KzMOe&LfY;Toz*1fIXZ(o!Ev+&<*Mt`hvC z{&6tu!<(_t6pxbJhT9K`$IH(KVtx-}aO=E$Vui?K+^jvhZ|)H$Ho$`1im?u)gUL7Z zEXRz}2C@^*fX;>?;7PKMa39dkn`to^*EReMcK8S2_YU7-X?@keo%gllrr#{^D_!gR z{HDcR29H#m!20i*;Jcv4e!4>N%~-Yt_f@C?4@Zji@tPi(j|bd;gT0kof~y>B!lYUI zz_ekyxP*QcYlb%L^Rw}QxYJn`;+|?e?w|6R^=QWl{G|L~wur40anhrwzU+=~k?TZU z;WG;_-I9*CT%M1O+dT=_m*WtJSFFOXGJ5t$-G0iRVff%(Lx@4&%5n3Vh&5^G1ANMI zRrZ>8A41ykMIZ0=a4kHT?+hA`JK@0}Mqqw#>Oj-6AOXiJAa(Li-}7Fi-^FGGMYG0l z`GDDv(#D*-^fAYlYz&-2R$nGJ3)g^d-U;4u#QD~B;I-op!hC%q*aY6<>Br)U6W2L7 z>#B2~ZY<6^R-uv))^(?aX@30Tn9sqPEYUm#U=ZnmJvr~*hlg4Z14)|@;AAO^OV2OG zzS^dO!;Ln$oktiL6TYD@K3k3$Zt?jUR((<*pHvux)p@0X@)JYx#|v7pRn6snera>; zF!`00m`VHs;k7vFbZlkp6QFf?D3Cr$@AF%b{T!qe`+=BLdz^FM$IA7oGJY3o5>pdq z;$utI`ts*Aah=uSC^6=fzpnJGb9b|?T)NIOIU1VG52cL0vmfnE=ZIzNqzGLPS@y|L zcQ7wBhmhqiW7n2s5O_G%mzVAw{`f0bDiNM}bYJtB8^RF}UBj6tbF44Ui7NZ>;Uzop z;_{JwF&P?PAv9Zyh>Dae7QI*s2aYg14IeXe?yT(dQ~3u)see+{BDNSTG_b91(QXXoG(1W-f3W)azz0a1;Bjn}xtl ztk=y#;3ocCH%oz=c(0qKz)j+}ZdL*}iC#A=ft%!S-IxM5$zC_6z)kA6ZY+VDRIeLL z;70qc8zyk0^}1nnS(-FMI%IJ~z@mWVzF~BA8l9mM=DT1?kWW~^a-WERkYMkiknnKd zaJnjOFheOK%qJk&XKs+M_fmmFw-GLYkYPyw*p+2SFZ2!b3HSC{96*<&$ua2R0SkhC zB9?>+y#48Pnmj{N;1KK^M5oad7~*pSe8L6Hiv2S)`eRo5nOXTq=58jHADD*pF{$>? zq}Csk`p--n|IMWN1Cv%ClXm}1I{h)}{>(J=znO;pz%;y%X+-}_Bl~00`3U- zz+}+JWY|BGQGZOMe`YfNZzhu;n8x%mnfA|Q)*qAk&rBBo&1CrllT{xRvwtR5e@xiV zOyIwn@E@3nJ|=emOq~9h$e)?uk4&FM1uqeoAs!GRczva5)(naHzVm$kqASwIGGv2% zeZqnRf){v)`9%2AWoR}G+M;}~LL{vjIDg7;A@Y*Dycl)zNzF;@yq zl^!!%U=HaqS832`nmuNWsKD0hu~&E7!+PvB-S+SvJGR@_@3G^$ZG#>=zS}nGvDbFn zV|wg_ZrifQPVBa=dhDcb8}G4`yKSP!P7$Sx(3jFB1o4ZS2^s~4sJWm~VTf7?njs8P zOF^T_5VaCCS`1O9pc%#xWeJ+$3{gzb=rcrtpfO;G;&e$tM1#!D1nn3>Yc6Ol1+9gk zwGyOy>NfJ1kh=A3`yaw;R1!+8E$krx3Sah$J#j9db^EvaJ6N~ z%=Zlr_ciTV1vFSaG(Ruge-E0D8SCOQ-QLF4#n##MXB4^%WBM=1^d98yHATbfx47Ly z1EGr0S18FenM-BR2*mP-=|49RfUp4r%#gI;$(x-tZ!~K^$$qDo1 zZ9b3&y@LZ~%Z=gk3wDpX0_=WO=ouOaw?_rRyWIU|3*KdOp(;Q2g(^%PNCn3qRp@uo z*QHJSCl#E2RpHMz3Uu1^KT*MAAQgHC2g=p}Dp>TdLeJ1ZxIHQezM~`D*V_N zs^C133NAmY(C>ywm*)CUD!Bcs!k=xT=(HJsqJrf>D)bHxl&t|&uR*MPp@DFFR1oYLx>XSD8G2Osu`g7?YakV7|ENO08);pd_dlsH=T{Z}Z1YX0`TU6r z%z;$s9ULfI1E|34Uxl8bfpB|NFzHcYOs@(*_Ju0U9Y}?FKdR7gk)cbQ|4%CT{;I;C z6()3=-=C8Jh2ls+@7ykzT!4q@`g6f%Up*@o=tb4MF2>!b3XVIQ(gSxLt2+l`^<+pfG z`7O~?eoOY0-%>s0H?6z;?!No~^3O_e`Vr2MhzN=B2@;qQ42gLmOM)W=$CFEbK0aCc z%@Ogd@C>$CHu)Bl}@6jouTPOMd&dYBZg>n9l(ft4V5zI~h@ez6^ z;If{Fi0plcpJa&@WyFa7qJ&!Sg#Yo-!BlYKrQ!111A?AY3DYr-(_HMQ*n8Se_jY!0 zbTR$mO<6SH0YWq*>X#UX{2YVu45B-N>A#Jj=ZNBe<&PI-tobzy8b3wQSNQjvhyN7+ z|7#pEqKxQY67jPbf1eQugZN!4dd~^|*AV_F6@3MEe^a8*;eVbIf0By7tMUG3MQ^eG zuco4}%Iz-|eGdO>D*i5s`%6V{#r&_PqOa8KFBN?b|7t4!u1ot%MQ_>quco4}-s>+F zeGdO>D*i4G`%6V{?f9>zqOa)cFBN?b|7t4!uF(2RMQ;K3uco4}^64)XeGdO>D*i5$ O`b$M`74<)+;{O4q!uSpV literal 0 HcmV?d00001 diff --git a/assignment_1/deliverable/nonlinear_model/variables/variables.index b/assignment_1/deliverable/nonlinear_model/variables/variables.index new file mode 100644 index 0000000000000000000000000000000000000000..20b344777d2bd8cca8477249cfaa90042f910cab GIT binary patch literal 2850 zcmb`JT}Tu`9KdJqw6-NSI`7UtuhA9LkB>`74SL*b;$6=*TPl=1BFy)O6CGkTk zR-X~FN>~wVrkc=CCL~p^Ib=v@v(>HfX}W6+{8QbgD%E7ih2Nv^6^qARkv z3R#RM4m8Q2qb+clLi_ohBhl>(9R{y2;NIfi?(z%89&dmP*D7*QJ}5=FNKh54eZdp7??wC>QXC=P5WAV9jStsN`M zRjG)9u?&Rx(a>nMWkR(K_1z=?#RdaU`3P`?HRoa* zc`9ur!#kPC$Wxb!PieN13|q@E%W{5@nT8Dp+en7P87M~a^;Slw*+v}LUrK<_?yjP+ z4PK=UJv?qhv-y+yq1&2m=;3e~X7zbCTrj1X)&42T*oGeVW}-Fx!@h>j#SXK!lQqt} zS%!J1g=2o~!miSV4z}A6%|AKQ^i{J99c(JctdGslY`|`wDVwY4Y9!Ol702m`et{j@Xnpwii3a&sB)M&GCjn+*E07_pAdQB63&7FhP3lsg$G>3F0ezuJ@oLE{{ G`1&_rWeBeT literal 0 HcmV?d00001 diff --git a/assignment_1/deliverable/nonlinear_model_normalizers.pickle b/assignment_1/deliverable/nonlinear_model_normalizers.pickle new file mode 100644 index 0000000000000000000000000000000000000000..4e9916fc9deaf305a2cfe419f0bfc424cc25c1b5 GIT binary patch literal 278 zcmZo*nYx<+0&1sd^swZnCgx4)5zfj_%E?U9%PY+-sEjYjOwP_pozf%d2jV&w6(v@N z7bO-Hq!vw?JVmo{3P>YIacNR=PGWKKlpa>Ft|>k2c`1n?wLnEZti>6L1*ucKnOcGD z{Gt?~)*eP@AUma`5-6U*0b>ExGNoBe>Fj8q5;R4_o4JS4W{RJmpVxmN02AH}B~y}m zxDs=6^2_6Ma}x`ubd)ABiOTjnYqB^Td3C|}_Bm#Usj5&v^)MHgq)f?Rfw(e*J%cNQ m8{~)#-VDAB{tS@}aiH#$k2N`GFMPH)UK}8BBl5F-sU83~BW;EN literal 0 HcmV?d00001 diff --git a/assignment_1/deliverable/run_model.py b/assignment_1/deliverable/run_model.py old mode 100644 new mode 100755 index 9b2d6ef..d4808f3 --- a/assignment_1/deliverable/run_model.py +++ b/assignment_1/deliverable/run_model.py @@ -1,6 +1,10 @@ +#!/usr/bin/env python3 + import joblib import numpy as np - +from keras import models +import sys +from keras.models import Model def load_data(filename): """ @@ -57,13 +61,51 @@ if __name__ == '__main__': # EDITABLE SECTION OF THE SCRIPT: if you need to edit the script, do it here ############################################################################ - # Load the trained model - baseline_model_path = './baseline_model.pickle' - baseline_model = load_model(baseline_model_path) + ms = {"baseline", "linear", "nonlinear"} - # Predict on the given samples - y_pred = baseline_model.predict(x) + if len(sys.argv) != 2: + print("%s {model_name}" % sys.argv[0]) + sys.exit(1) + if sys.argv[1] not in ms: + print("model name must be one of " + str(ms)) + sys.exit(2) + + y_pred = None + if sys.argv[1] == "baseline": + # Load the trained model + baseline_model_path = './baseline_model.pickle' + baseline_model = load_model(baseline_model_path) + + # Predict on the given samples + y_pred = baseline_model.predict(x) + else: + X = np.zeros([x.shape[0], 5]) + X[:, 0] = 1 + X[:, 1:3] = x + X[:, 3] = x[:, 0] * x[:, 1] + X[:, 4] = np.sin(x[:, 0]) + + if sys.argv[1] == "linear": + # Load the linear model + linear_model_path = './linear_regression.pickle' + linear_model = load_model(linear_model_path) + + # Predict on the given samples + y_pred = linear_model.predict(X) + else: + # Load saved Keras model + nonlinear_model = models.load_model('./nonlinear_model') + # Load saved normalizing factors for Xs + normalizers = load_model('./nonlinear_model_normalizers.pickle') + # Normalize Xs with normalizing factors + X = X[:, 1:3] + X -= normalizers["mean"] + X /= normalizers["std"] + + # Run model on normalized data + y_pred = nonlinear_model.predict(X) + y_pred = y_pred[:, 0] ############################################################################ # STOP EDITABLE SECTION: do not modify anything below this point. diff --git a/assignment_1/src/t1.py b/assignment_1/src/build_models.py similarity index 73% rename from assignment_1/src/t1.py rename to assignment_1/src/build_models.py index f980fb3..f2971de 100644 --- a/assignment_1/src/t1.py +++ b/assignment_1/src/build_models.py @@ -2,14 +2,18 @@ import numpy as np from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from tensorflow.keras import Input, Model -from tensorflow.keras.models import Sequential +from tensorflow.keras.models import Sequential, save_model from tensorflow.keras.layers import Dense from tensorflow.keras import losses from tensorflow import keras import tensorflow as tf from sklearn.metrics import mean_squared_error +from utils import save_sklearn_model, save_keras_model +import os -data = np.load("../data/data.npz") +d = os.path.dirname(__file__) + +data = np.load(d + "/../data/data.npz") xs = data["x"] # 2000x2 y = data["y"] # 2000x1 points = 2000 @@ -43,6 +47,8 @@ print("# Linear regression:") # Print the resulting parameters print("f(x) = %g + %g * x_1 + %g * x_2 + %g * x_1 * x_2 + %g * sin(x_1)" % tuple(reg.coef_)) +save_sklearn_model(reg, d + "/../deliverable/linear_regression.pickle") + # Test using MSQ on test set score = reg.score(X_test, y_test) print("MSQ error on test set is: %g" % (score)) @@ -53,48 +59,45 @@ print("\n# Feed-forward NN:") A = X_val -X_train = X_train[:, 1:] -X_val = X_val[:, 1:] +X_train = X_train[:, 1:3] +X_val = X_val[:, 1:3] # X_train = X_train[:, 1:3] # X_val = X_val[:, 1:3] mean = np.mean(X_train, axis=0) std = np.std(X_train, axis=0) -#y_mean = np.mean(y_train, axis=0) -#y_std = np.std(y_train, axis=0) - -y_mean = 0 -y_std = 1 X_train -= mean X_train /= std -y_train -= y_mean -y_train /= y_std X_val -= mean X_val /= std -y_val -= y_mean -y_val /= y_std network = Sequential() -network.add(Dense(35, activation='relu')) +network.add(Dense(30, activation='relu')) +network.add(Dense(20, activation='relu')) +network.add(Dense(20, activation='relu')) network.add(Dense(10, activation='relu')) +network.add(Dense(5, activation='relu')) network.add(Dense(3, activation='relu')) +network.add(Dense(2, activation='relu')) network.add(Dense(1, activation='linear')) network.compile(optimizer='rmsprop', loss='mse', metrics=['mse']) -epochs = 10000 -callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=1000) -network.fit(X_train, y_train, epochs=epochs, verbose=1, batch_size=100, validation_data=(X_val, y_val), callbacks=[callback]) +epochs = 100000 +callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=40) +network.fit(X_train, y_train, epochs=epochs, verbose=1, batch_size=15, + validation_data=(X_val, y_val), callbacks=[callback]) + +network.save(d + "/../deliverable/nonlinear_model") +save_sklearn_model({"mean": mean, "std": std}, d + "/../deliverable/nonlinear_model_normalizers.pickle") msq = mean_squared_error(network.predict(X_val), y_val) print(msq) -X_test = X_test[:, 1:] +X_test = X_test[:, 1:3] X_test -= mean X_test /= std -y_test -= y_mean -y_test /= y_std msq = mean_squared_error(network.predict(X_test), y_test) print(msq)