def test_widedeep_inputs( X_wide, X_deep, X_text, X_img, X_train, X_val, target, val_split, transforms, nepoch, null, ): model = WideDeep(wide=wide, deepdense=deepdense, deeptext=deeptext, deepimage=deepimage) model.compile(method="binary", transforms=transforms, verbose=0) model.fit( X_wide=X_wide, X_deep=X_deep, X_text=X_text, X_img=X_img, X_train=X_train, X_val=X_val, target=target, val_split=val_split, batch_size=16, ) assert (model.history.epoch[0] == nepoch and model.history._history["train_loss"] is not null)
def test_fit_methods( X_wide, X_deep, target, method, X_wide_test, X_deep_test, X_test, pred_dim, probs_dim, ): wide = Wide(np.unique(X_wide).shape[0], pred_dim) deepdense = DeepDense( hidden_layers=[32, 16], dropout=[0.5, 0.5], deep_column_idx=deep_column_idx, embed_input=embed_input, continuous_cols=colnames[-5:], ) model = WideDeep(wide=wide, deepdense=deepdense, pred_dim=pred_dim) model.compile(method=method, verbose=0) model.fit(X_wide=X_wide, X_deep=X_deep, target=target) preds = model.predict(X_wide=X_wide, X_deep=X_deep, X_test=X_test) if method == "binary": pass else: probs = model.predict_proba(X_wide=X_wide, X_deep=X_deep, X_test=X_test) assert preds.shape[0] == 100, probs.shape[1] == probs_dim
def test_model_checkpoint(save_best_only, max_save, n_files): wide = Wide(100, 1) deepdense = DeepDense( hidden_layers=[32, 16], dropout=[0.5, 0.5], deep_column_idx=deep_column_idx, embed_input=embed_input, continuous_cols=colnames[-5:], ) model = WideDeep(wide=wide, deepdense=deepdense) model.compile( method="binary", callbacks=[ ModelCheckpoint("weights/test_weights", save_best_only=save_best_only, max_save=max_save) ], verbose=0, ) model.fit(X_wide=X_wide, X_deep=X_deep, target=target, n_epochs=5, val_split=0.2) n_saved = len(os.listdir("weights/")) for f in os.listdir("weights/"): os.remove("weights/" + f) assert n_saved <= n_files
def test_xtrain_xval_assertion( X_wide, X_deep, X_text, X_img, X_train, X_val, target, ): model = WideDeep(wide=wide, deepdense=deepdense, deeptext=deeptext, deepimage=deepimage) model.compile(method="binary", verbose=0) with pytest.raises(AssertionError): model.fit( X_wide=X_wide, X_deep=X_deep, X_text=X_text, X_img=X_img, X_train=X_train, X_val=X_val, target=target, batch_size=16, )
def test_early_stop(): wide = Wide(100, 1) deepdense = DeepDense( hidden_layers=[32, 16], dropout=[0.5, 0.5], deep_column_idx=deep_column_idx, embed_input=embed_input, continuous_cols=colnames[-5:], ) model = WideDeep(wide=wide, deepdense=deepdense) model.compile( method="binary", callbacks=[ EarlyStopping(min_delta=0.1, patience=3, restore_best_weights=True, verbose=1) ], verbose=1, ) model.fit(X_wide=X_wide, X_deep=X_deep, target=target, val_split=0.2, n_epochs=5) # length of history = patience+1 assert len(model.history._history["train_loss"]) == 3 + 1
def test_focal_loss(X_wide, X_deep, target, method, output_dim, probs_dim): wide = Wide(100, output_dim) deepdense = model3 = DeepDense(hidden_layers=[32, 16], dropout=[0.5, 0.5], deep_column_idx=deep_column_idx, embed_input=embed_input, continuous_cols=colnames[-5:]) model = WideDeep(wide=wide, deepdense=deepdense, output_dim=output_dim) model.compile(method=method, verbose=0, with_focal_loss=True) model.fit(X_wide=X_wide, X_deep=X_deep, target=target) probs = model.predict_proba(X_wide=X_wide, X_deep=X_deep) assert probs.shape[1] == probs_dim
def test_basic_run_with_metrics_binary(): model = WideDeep(wide=wide, deepdense=deepdense) model.compile(method="binary", metrics=[Accuracy], verbose=False) model.fit( X_wide=X_wide, X_deep=X_deep, target=target, n_epochs=1, batch_size=16, val_split=0.2, ) assert ("train_loss" in model.history._history.keys() and "train_acc" in model.history._history.keys())
def test_head_layers_individual_components(deepdense, deeptext, deepimage, X_deep, X_text, X_img, target): model = WideDeep(deepdense=deepdense, deeptext=deeptext, deepimage=deepimage, head_layers=[8, 4]) # noqa: F841 model.compile(method="binary", verbose=0) model.fit( X_wide=X_wide, X_deep=X_deep, X_text=X_text, X_img=X_img, target=target, batch_size=16, ) # check it has run succesfully assert len(model.history._history) == 1
def test_individual_inputs(wide, deepdense, deeptext, deepimage, X_wide, X_deep, X_text, X_img, target): model = WideDeep(wide=wide, deepdense=deepdense, deeptext=deeptext, deepimage=deepimage) model.compile(method="binary", verbose=0) model.fit( X_wide=X_wide, X_deep=X_deep, X_text=X_text, X_img=X_img, target=target, batch_size=16, ) # check it has run succesfully assert len(model.history._history) == 1
def test_fit_with_deephead(): wide = Wide(np.unique(X_wide).shape[0], 1) deepdense = DeepDense( hidden_layers=[32, 16], deep_column_idx=deep_column_idx, embed_input=embed_input, continuous_cols=colnames[-5:], ) deephead = nn.Sequential(nn.Linear(16, 8), nn.Linear(8, 4)) model = WideDeep(wide=wide, deepdense=deepdense, pred_dim=1, deephead=deephead) model.compile(method="binary", verbose=0) model.fit(X_wide=X_wide, X_deep=X_deep, target=target_binary, batch_size=16) preds = model.predict(X_wide=X_wide, X_deep=X_deep, X_test=X_test) probs = model.predict_proba(X_wide=X_wide, X_deep=X_deep, X_test=X_test) assert preds.shape[0] == 32, probs.shape[1] == 2
def test_basic_run_with_metrics_multiclass(): wide = Wide(np.unique(X_wide).shape[0], 3) deepdense = DeepDense( hidden_layers=[32, 16], dropout=[0.5, 0.5], deep_column_idx={k: v for v, k in enumerate(colnames)}, embed_input=embed_input, continuous_cols=colnames[-5:], ) model = WideDeep(wide=wide, deepdense=deepdense, pred_dim=3) model.compile(method="multiclass", metrics=[Accuracy], verbose=False) model.fit( X_wide=X_wide, X_deep=X_deep, target=target_multi, n_epochs=1, batch_size=16, val_split=0.2, ) assert ("train_loss" in model.history._history.keys() and "train_acc" in model.history._history.keys())
def test_predict_with_individual_component(wide, deepdense, deeptext, deepimage, X_wide, X_deep, X_text, X_img, target): model = WideDeep(wide=wide, deepdense=deepdense, deeptext=deeptext, deepimage=deepimage) model.compile(method="binary", verbose=0) model.fit( X_wide=X_wide, X_deep=X_deep, X_text=X_text, X_img=X_img, target=target, batch_size=16, ) # simply checking that runs and produces outputs preds = model.predict(X_wide=X_wide, X_deep=X_deep, X_text=X_text, X_img=X_img) assert preds.shape[0] == 32 and "train_loss" in model.history._history
df.drop("yield", axis=1, inplace=True) target = "yield_cat" target = np.array(df[target].values) prepare_wide = WidePreprocessor(wide_cols=wide_cols, crossed_cols=crossed_cols) X_wide = prepare_wide.fit_transform(df) prepare_deep = DensePreprocessor(embed_cols=cat_embed_cols, continuous_cols=continuous_cols) X_deep = prepare_deep.fit_transform(df) wide = Wide(wide_dim=X_wide.shape[1], pred_dim=3) deepdense = DeepDense( hidden_layers=[64, 32], dropout=[0.2, 0.2], deep_column_idx=prepare_deep.deep_column_idx, embed_input=prepare_deep.embeddings_input, continuous_cols=continuous_cols, ) model = WideDeep(wide=wide, deepdense=deepdense, pred_dim=3) model.compile(method="multiclass", metrics=[Accuracy, F1Score]) model.fit( X_wide=X_wide, X_deep=X_deep, target=target, n_epochs=1, batch_size=32, val_split=0.2, )
continuous_cols=continuous_cols) model = WideDeep(wide=wide, deepdense=deepdense) wide_opt = torch.optim.Adam(model.wide.parameters()) deep_opt = RAdam(model.deepdense.parameters()) wide_sch = torch.optim.lr_scheduler.StepLR(wide_opt, step_size=3) deep_sch = torch.optim.lr_scheduler.StepLR(deep_opt, step_size=5) optimizers = {'wide': wide_opt, 'deepdense': deep_opt} schedulers = {'wide': wide_sch, 'deepdense': deep_sch} initializers = {'wide': KaimingNormal, 'deepdense': XavierNormal} callbacks = [ LRHistory(n_epochs=10), EarlyStopping, ModelCheckpoint(filepath='model_weights/wd_out') ] metrics = [BinaryAccuracy] model.compile(method='binary', optimizers=optimizers, lr_schedulers=schedulers, initializers=initializers, callbacks=callbacks, metrics=metrics) model.fit(X_wide=X_wide, X_deep=X_deep, target=target, n_epochs=10, batch_size=256, val_split=0.2)
] model.compile( method="regression", initializers=initializers, optimizers=optimizers, lr_schedulers=schedulers, callbacks=callbacks, transforms=transforms, ) model.fit( X_wide=X_wide, X_deep=X_deep, X_text=X_text, X_img=X_images, target=target, n_epochs=1, batch_size=32, val_split=0.2, ) # # With warm_up # child = list(model.deepimage.children())[0] # img_layers = list(child.backbone.children())[4:8] + [list(model.deepimage.children())[1]] # img_layers = img_layers[::-1] # model.fit(X_wide=X_wide, X_deep=X_deep, X_text=X_text, X_img=X_images, # target=target, n_epochs=1, batch_size=32, val_split=0.2, warm_up=True, # warm_epochs=1, warm_deepimage_gradual=True, warm_deepimage_layers=img_layers, # warm_deepimage_max_lr=0.01, warm_routine='howard')
model.compile( method="binary", optimizers=optimizers, lr_schedulers=schedulers, initializers=initializers, callbacks=callbacks, metrics=metrics, ) X_wide_train, X_wide_test, X_deep_train, X_deep_test, y_train, y_test = train_test_split( X_wide, X_deep, target, test_size=0.2) model.fit( X_wide=X_wide_train, X_deep=X_deep_train, target=y_train, n_epochs=4, batch_size=64, val_split=0.2, ) # # to save/load the model # torch.save(model, "model_weights/model.t") # model = torch.load("model_weights/model.t") preds = model.predict(X_wide_test, X_deep_test) accuracy = accuracy_score(y_test, preds) print(accuracy) # # to save/load the model # torch.save(model, "model_weights/model.t") # model = torch.load("model_weights/model.t") # # or via state dictionaries