Skip to content

Commit 1c2eabb

Browse files
author
SAAS R7 User1
committed
clean variable names
1 parent 65b2c45 commit 1c2eabb

File tree

8 files changed

+233
-107
lines changed

8 files changed

+233
-107
lines changed

examples/tf2_exnn.ipynb

+47
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,53 @@
727727
"nbconvert_exporter": "python",
728728
"pygments_lexer": "ipython3",
729729
"version": "3.6.8"
730+
},
731+
"latex_envs": {
732+
"LaTeX_envs_menu_present": true,
733+
"autoclose": false,
734+
"autocomplete": true,
735+
"bibliofile": "biblio.bib",
736+
"cite_by": "apalike",
737+
"current_citInitial": 1,
738+
"eqLabelWithNumbers": true,
739+
"eqNumInitial": 1,
740+
"hotkeys": {
741+
"equation": "Ctrl-E",
742+
"itemize": "Ctrl-I"
743+
},
744+
"labels_anchors": false,
745+
"latex_user_defs": false,
746+
"report_style_numbering": false,
747+
"user_envs_cfg": false
748+
},
749+
"varInspector": {
750+
"cols": {
751+
"lenName": 16,
752+
"lenType": 16,
753+
"lenVar": 40
754+
},
755+
"kernels_config": {
756+
"python": {
757+
"delete_cmd_postfix": "",
758+
"delete_cmd_prefix": "del ",
759+
"library": "var_list.py",
760+
"varRefreshCmd": "print(var_dic_list())"
761+
},
762+
"r": {
763+
"delete_cmd_postfix": ") ",
764+
"delete_cmd_prefix": "rm(",
765+
"library": "var_list.r",
766+
"varRefreshCmd": "cat(var_dic_list()) "
767+
}
768+
},
769+
"types_to_exclude": [
770+
"module",
771+
"function",
772+
"builtin_function_or_method",
773+
"instance",
774+
"_Feature"
775+
],
776+
"window_display": false
730777
}
731778
},
732779
"nbformat": 4,

examples/tf2_gamnet.ipynb

+47
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,53 @@
179179
"nbconvert_exporter": "python",
180180
"pygments_lexer": "ipython3",
181181
"version": "3.6.8"
182+
},
183+
"latex_envs": {
184+
"LaTeX_envs_menu_present": true,
185+
"autoclose": false,
186+
"autocomplete": true,
187+
"bibliofile": "biblio.bib",
188+
"cite_by": "apalike",
189+
"current_citInitial": 1,
190+
"eqLabelWithNumbers": true,
191+
"eqNumInitial": 1,
192+
"hotkeys": {
193+
"equation": "Ctrl-E",
194+
"itemize": "Ctrl-I"
195+
},
196+
"labels_anchors": false,
197+
"latex_user_defs": false,
198+
"report_style_numbering": false,
199+
"user_envs_cfg": false
200+
},
201+
"varInspector": {
202+
"cols": {
203+
"lenName": 16,
204+
"lenType": 16,
205+
"lenVar": 40
206+
},
207+
"kernels_config": {
208+
"python": {
209+
"delete_cmd_postfix": "",
210+
"delete_cmd_prefix": "del ",
211+
"library": "var_list.py",
212+
"varRefreshCmd": "print(var_dic_list())"
213+
},
214+
"r": {
215+
"delete_cmd_postfix": ") ",
216+
"delete_cmd_prefix": "rm(",
217+
"library": "var_list.r",
218+
"varRefreshCmd": "cat(var_dic_list()) "
219+
}
220+
},
221+
"types_to_exclude": [
222+
"module",
223+
"function",
224+
"builtin_function_or_method",
225+
"instance",
226+
"_Feature"
227+
],
228+
"window_display": false
182229
}
183230
},
184231
"nbformat": 4,

examples/tf2_xnn.ipynb

+47
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,53 @@
664664
"nbconvert_exporter": "python",
665665
"pygments_lexer": "ipython3",
666666
"version": "3.6.8"
667+
},
668+
"latex_envs": {
669+
"LaTeX_envs_menu_present": true,
670+
"autoclose": false,
671+
"autocomplete": true,
672+
"bibliofile": "biblio.bib",
673+
"cite_by": "apalike",
674+
"current_citInitial": 1,
675+
"eqLabelWithNumbers": true,
676+
"eqNumInitial": 1,
677+
"hotkeys": {
678+
"equation": "Ctrl-E",
679+
"itemize": "Ctrl-I"
680+
},
681+
"labels_anchors": false,
682+
"latex_user_defs": false,
683+
"report_style_numbering": false,
684+
"user_envs_cfg": false
685+
},
686+
"varInspector": {
687+
"cols": {
688+
"lenName": 16,
689+
"lenType": 16,
690+
"lenVar": 40
691+
},
692+
"kernels_config": {
693+
"python": {
694+
"delete_cmd_postfix": "",
695+
"delete_cmd_prefix": "del ",
696+
"library": "var_list.py",
697+
"varRefreshCmd": "print(var_dic_list())"
698+
},
699+
"r": {
700+
"delete_cmd_postfix": ") ",
701+
"delete_cmd_prefix": "rm(",
702+
"library": "var_list.r",
703+
"varRefreshCmd": "cat(var_dic_list()) "
704+
}
705+
},
706+
"types_to_exclude": [
707+
"module",
708+
"function",
709+
"builtin_function_or_method",
710+
"instance",
711+
"_Feature"
712+
],
713+
"window_display": false
667714
}
668715
},
669716
"nbformat": 4,

exnn/base.py

+54-46
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def __init__(self, meta_info,
2525
lr_bp=0.001,
2626
l1_proj=0.001,
2727
l1_subnet=0.001,
28-
smooth_lambda=0.00001,
28+
l2_smooth=0.00001,
2929
batch_size=1000,
3030
training_epochs=2000,
3131
tuning_epochs=500,
@@ -38,7 +38,6 @@ def __init__(self, meta_info,
3838
super(BaseNet, self).__init__()
3939

4040
# Parameter initiation
41-
self.meta_info = meta_info
4241
self.subnet_num = subnet_num
4342
self.subnet_arch = subnet_arch
4443
self.task_type = task_type
@@ -49,7 +48,7 @@ def __init__(self, meta_info,
4948
self.lr_bp = lr_bp
5049
self.l1_proj = l1_proj
5150
self.l1_subnet = l1_subnet
52-
self.smooth_lambda = smooth_lambda
51+
self.l2_smooth = l2_smooth
5352
self.batch_size = batch_size
5453
self.beta_threshold = beta_threshold
5554
self.tuning_epochs = tuning_epochs
@@ -63,43 +62,52 @@ def __init__(self, meta_info,
6362
np.random.seed(random_state)
6463
tf.random.set_seed(random_state)
6564

66-
self.categ_variable_num = 0
67-
self.numerical_input_num = 0
68-
self.categ_variable_list = []
69-
self.categ_index_list = []
70-
self.noncateg_index_list = []
71-
self.noncateg_variable_list = []
72-
self.variables_names = list(self.meta_info.keys())
73-
for i, (key, item) in enumerate(self.meta_info.items()):
74-
if item['type'] == "target":
65+
self.dummy_values_ = {}
66+
self.nfeature_scaler_ = {}
67+
self.cfeature_num_ = 0
68+
self.nfeature_num_ = 0
69+
self.cfeature_list_ = []
70+
self.nfeature_list_ = []
71+
self.cfeature_index_list_ = []
72+
self.nfeature_index_list_ = []
73+
74+
self.feature_list_ = []
75+
self.feature_type_list_ = []
76+
for idx, (feature_name, feature_info) in enumerate(meta_info.items()):
77+
if feature_info["type"] == "target":
7578
continue
76-
if item['type'] == "categorical":
77-
self.categ_variable_num += 1
78-
self.categ_variable_list.append(key)
79-
self.categ_index_list.append(i)
79+
if feature_info["type"] == "categorical":
80+
self.cfeature_num_ += 1
81+
self.cfeature_list_.append(feature_name)
82+
self.cfeature_index_list_.append(idx)
83+
self.feature_type_list_.append("categorical")
84+
self.dummy_values_.update({feature_name:meta_info[feature_name]["values"]})
8085
else:
81-
self.numerical_input_num +=1
82-
self.noncateg_index_list.append(i)
83-
self.noncateg_variable_list.append(key)
86+
self.nfeature_num_ += 1
87+
self.nfeature_list_.append(feature_name)
88+
self.nfeature_index_list_.append(idx)
89+
self.feature_type_list_.append("continuous")
90+
self.nfeature_scaler_.update({feature_name:meta_info[feature_name]["scaler"]})
91+
self.feature_list_.append(feature_name)
8492

85-
self.subnet_num = min(self.subnet_num, self.numerical_input_num)
8693
# build
87-
self.proj_layer = ProjectLayer(index_list=list(self.noncateg_index_list),
88-
subnet_num=self.subnet_num,
89-
l1_proj=self.l1_proj,
90-
method=self.proj_method)
94+
self.subnet_num = min(self.subnet_num, self.nfeature_num_)
95+
self.proj_layer = ProjectLayer(index_list=self.nfeature_index_list_,
96+
subnet_num=self.subnet_num,
97+
l1_proj=self.l1_proj,
98+
method=self.proj_method)
9199

92-
self.categ_blocks = CategNetBlock(meta_info=self.meta_info,
93-
categ_variable_list=self.categ_variable_list,
94-
categ_index_list=self.categ_index_list,
95-
bn_flag=self.bn_flag)
100+
self.categ_blocks = CategNetBlock(feature_list=self.feature_list_,
101+
cfeature_index_list=self.cfeature_index_list_,
102+
dummy_values=self.dummy_values_,
103+
bn_flag=self.bn_flag)
96104

97105
self.subnet_blocks = SubnetworkBlock(subnet_num=self.subnet_num,
98-
subnet_arch=self.subnet_arch,
99-
activation_func=self.activation_func,
100-
smooth_lambda=self.smooth_lambda,
101-
bn_flag=self.bn_flag)
102-
self.output_layer = OutputLayer(subnet_num=self.subnet_num + self.categ_variable_num, l1_subnet=self.l1_subnet)
106+
subnet_arch=self.subnet_arch,
107+
activation_func=self.activation_func,
108+
l2_smooth=self.l2_smooth,
109+
bn_flag=self.bn_flag)
110+
self.output_layer = OutputLayer(subnet_num=self.subnet_num + self.cfeature_num_, l1_subnet=self.l1_subnet)
103111

104112
self.optimizer = tf.keras.optimizers.Adam(learning_rate=self.lr_bp)
105113
if self.task_type == "Regression":
@@ -116,9 +124,9 @@ def call(self, inputs, training=False):
116124
self.subnet_outputs = self.subnet_blocks(self.proj_outputs, training=training)
117125

118126
concat_list = []
119-
if self.numerical_input_num > 0:
127+
if self.nfeature_num_ > 0:
120128
concat_list.append(self.subnet_outputs)
121-
if self.categ_variable_num > 0:
129+
if self.cfeature_num_ > 0:
122130
concat_list.append(self.categ_outputs)
123131

124132
if self.task_type == "Regression":
@@ -157,7 +165,7 @@ def get_active_subnets(self, beta_threshold=0):
157165
beta = self.output_layer.output_weights.numpy()
158166
else:
159167
subnet_norm = [self.subnet_blocks.subnets[i].moving_norm.numpy()[0] for i in range(self.subnet_num)]
160-
categ_norm = [self.categ_blocks.categnets[i].moving_norm.numpy()[0]for i in range(self.categ_variable_num)]
168+
categ_norm = [self.categ_blocks.categnets[i].moving_norm.numpy()[0]for i in range(self.cfeature_num_)]
161169
beta = self.output_layer.output_weights.numpy() * np.hstack([subnet_norm, categ_norm]).reshape([-1, 1])
162170
beta = beta * self.output_layer.output_switcher.numpy()
163171
subnets_scale = (np.abs(beta) / np.sum(np.abs(beta))).reshape([-1])
@@ -169,7 +177,7 @@ def get_active_subnets(self, beta_threshold=0):
169177
for i in active_index:
170178
if i in range(self.subnet_num):
171179
active_me_index.append(i)
172-
elif i in range(self.subnet_num, self.subnet_num + self.categ_variable_num):
180+
elif i in range(self.subnet_num, self.subnet_num + self.cfeature_num_):
173181
active_categ_index.append(i)
174182
return active_me_index, active_categ_index, beta, subnets_scale
175183

@@ -228,7 +236,7 @@ def fit(self, train_x, train_y):
228236

229237
self.evaluate(tr_x, tr_y, training=True) # update the batch normalization using all the training data
230238
active_me_index, active_categ_index, _, _ = self.get_active_subnets(self.beta_threshold)
231-
scal_factor = np.zeros((self.subnet_num + self.categ_variable_num, 1))
239+
scal_factor = np.zeros((self.subnet_num + self.cfeature_num_, 1))
232240
scal_factor[active_me_index] = 1
233241
scal_factor[active_categ_index] = 1
234242
self.output_layer.output_switcher.assign(tf.constant(scal_factor, dtype=tf.float32))
@@ -270,8 +278,8 @@ def fit(self, train_x, train_y):
270278
self.subnet_input_max = []
271279
self.evaluate(tr_x, tr_y, training=True) # update the batch normalization using all the training data
272280
for i in range(self.subnet_num):
273-
min_ = np.dot(train_x[:,self.noncateg_index_list], self.proj_layer.get_weights()[0])[:, i].min()
274-
max_ = np.dot(train_x[:,self.noncateg_index_list], self.proj_layer.get_weights()[0])[:, i].max()
281+
min_ = np.dot(tr_x[:,self.noncateg_index_list], self.proj_layer.get_weights()[0])[:, i].min()
282+
max_ = np.dot(tr_x[:,self.noncateg_index_list], self.proj_layer.get_weights()[0])[:, i].max()
275283
self.subnet_input_min.append(min_)
276284
self.subnet_input_max.append(max_)
277285

@@ -328,21 +336,21 @@ def visualize(self, folder="./results/", name="demo", save_png=False, save_eps=F
328336
ax1.set_title("Ridge Functions", fontsize=24)
329337
ax2.set_title("Projection Indices", fontsize=24)
330338

331-
if self.categ_variable_num > 0:
339+
if self.cfeature_num_ > 0:
332340
for indice in active_categ_index:
333-
dummy_name = self.categ_variable_list[indice - self.numerical_input_num]
341+
feature_name = self.cfeature_list_[indice - self.numerical_input_num]
334342
dummy_gamma = self.categ_blocks.categnets[indice - self.numerical_input_num].categ_bias.numpy()
335343
norm = self.categ_blocks.categnets[indice - self.numerical_input_num].moving_norm.numpy()
336344
ax3 = f.add_subplot(np.int(max_ids), 1, np.int(max_ids))
337-
ax3.bar(np.arange(len(self.meta_info[dummy_name]['values'])), np.sign(beta[indice]) * dummy_gamma[:, 0] / norm)
338-
ax3.set_xticks(np.arange(len(self.meta_info[dummy_name]['values'])))
339-
ax3.set_xticklabels(self.meta_info[self.categ_variable_list[indice - self.numerical_input_num]]['values'], fontsize=14)
345+
ax3.bar(np.arange(len(self.dummy_values_[feature_name])), np.sign(beta[indice]) * dummy_gamma[:, 0] / norm)
346+
ax3.set_xticks(np.arange(len(self.dummy_values_[feature_name])))
347+
ax3.set_xticklabels(self.dummy_values_[feature_name], fontsize=14)
340348

341349
yint = np.round(np.linspace(np.min(np.sign(beta[indice]) * dummy_gamma[:, 0] / norm),
342350
np.max(np.sign(beta[indice]) * dummy_gamma[:, 0] / norm), 6), 2)
343351
ax3.set_yticks(yint)
344352
ax3.set_yticklabels(["{0: .2f}".format(j) for j in yint], fontsize=14)
345-
ax3.set_title(dummy_name + " (" + str(np.round(100 * subnets_scale[indice], 1)) + "%)", fontsize=20)
353+
ax3.set_title(feature_name + " (" + str(np.round(100 * subnets_scale[indice], 1)) + "%)", fontsize=20)
346354

347355
if max_ids > 0:
348356
if save_png:

exnn/exnn.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ class ExNN(BaseNet):
6363
:type l1_subnet: float
6464
:param l1_subnet: optional, default=0.001, the strength of L1 penalty for scaling layer.
6565
66-
:type smooth_lambda: float
67-
:param smooth_lambda: optional, default=0.000001, the strength of roughness penalty for subnetworks.
66+
:type l2_smooth: float
67+
:param l2_smooth: optional, default=0.000001, the strength of roughness penalty for subnetworks.
6868
6969
:type verbose: bool
7070
:param verbose: optional, default=False. If True, detailed messages will be printed.
@@ -86,7 +86,7 @@ class ExNN(BaseNet):
8686

8787
def __init__(self, meta_info, subnet_num, subnet_arch=[10, 6], task_type="Regression",
8888
activation_func=tf.tanh, batch_size=1000, training_epochs=10000, lr_bp=0.001, lr_cl=0.1,
89-
beta_threshold=0.05, tuning_epochs=500, l1_proj=0.001, l1_subnet=0.001, smooth_lambda=0.000001,
89+
beta_threshold=0.05, tuning_epochs=500, l1_proj=0.001, l1_subnet=0.001, l2_smooth=0.000001,
9090
verbose=False, val_ratio=0.2, early_stop_thres=1000, random_state=0):
9191

9292
super(ExNN, self).__init__(meta_info=meta_info,
@@ -99,7 +99,7 @@ def __init__(self, meta_info, subnet_num, subnet_arch=[10, 6], task_type="Regres
9999
lr_bp=lr_bp,
100100
l1_proj=l1_proj,
101101
l1_subnet=l1_subnet,
102-
smooth_lambda=smooth_lambda,
102+
l2_smooth=l2_smooth,
103103
batch_size=batch_size,
104104
training_epochs=training_epochs,
105105
tuning_epochs=tuning_epochs,
@@ -119,7 +119,7 @@ def train_step_init(self, inputs, labels):
119119
regularization_loss = tf.math.add_n(self.proj_layer.losses + self.output_layer.losses)
120120
cl_loss = pred_loss + regularization_loss
121121
bp_loss = pred_loss + regularization_loss
122-
if self.smooth_lambda > 0:
122+
if self.l2_smooth > 0:
123123
smoothness_loss = self.subnet_blocks.smooth_loss
124124
bp_loss += smoothness_loss
125125

@@ -147,7 +147,7 @@ def train_step_finetune(self, inputs, labels):
147147
pred = self.__call__(inputs, training=True)
148148
pred_loss = self.loss_fn(labels, pred)
149149
total_loss = pred_loss
150-
if self.smooth_lambda > 0:
150+
if self.l2_smooth > 0:
151151
smoothness_loss = self.subnet_blocks.smooth_loss
152152
total_loss += smoothness_loss
153153

0 commit comments

Comments
 (0)