Combine tabular data with text and images using Wide and Deep models in Pytorch
Project description
pytorch-widedeep
A flexible package to combine tabular data with text and images using wide and deep models.
Documentation: https://pytorch-widedeep.readthedocs.io
Introduction
pytorch-widedeep
is based on Google's Wide and Deep Algorithm. Details of
the original algorithm can be found
here, and the nice
research paper can be found here.
In general terms, pytorch-widedeep
is a package to use deep learning with
tabular data. In particular, is intended to facilitate the combination of text
and images with corresponding tabular data using wide and deep models. With
that in mind there are two architectures that can be implemented with just a
few lines of code. For details on these architectures please visit the
repo.
Installation
Install using pip:
pip install pytorch-widedeep
Or install directly from github
pip install git+https://github.com/jrzaurin/pytorch-widedeep.git
Developer Install
# Clone the repository
git clone https://github.com/jrzaurin/pytorch-widedeep
cd pytorch-widedeep
# Install in dev mode
pip install -e .
Important note for Mac users: at the time of writing (Dec-2020) the latest
torch
release is 1.7
. This release has some
issues
when running on Mac and the data-loaders will not run in parallel. In
addition, since python 3.8
, the multiprocessing
library start method
changed from 'fork'
to
'spawn'
.
This also affects the data-loaders (for any torch
version) and they will not
run in parallel. Therefore, for Mac users I recommend using python 3.6
or
3.7
and torch <= 1.6
(with the corresponding, consistent version of
torchvision
, e.g. 0.7.0
for torch 1.6
). I do not want to force this
versioning in the setup.py
file since I expect that all these issues are
fixed in the future. Therefore, after installing pytorch-widedeep
via pip or
directly from github, downgrade torch
and torchvision
manually:
pip install pytorch-widedeep
pip install torch==1.6.0 torchvision==0.7.0
None of these issues affect Linux users.
Quick start
Binary classification with the adult
dataset
using Wide
and DeepDense
and defaults settings.
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from pytorch_widedeep.preprocessing import WidePreprocessor, DensePreprocessor
from pytorch_widedeep.models import Wide, DeepDense, WideDeep
from pytorch_widedeep.metrics import Accuracy
# these next 4 lines are not directly related to pytorch-widedeep. I assume
# you have downloaded the dataset and place it in a dir called data/adult/
df = pd.read_csv("data/adult/adult.csv.zip")
df["income_label"] = (df["income"].apply(lambda x: ">50K" in x)).astype(int)
df.drop("income", axis=1, inplace=True)
df_train, df_test = train_test_split(df, test_size=0.2, stratify=df.income_label)
# prepare wide, crossed, embedding and continuous columns
wide_cols = [
"education",
"relationship",
"workclass",
"occupation",
"native-country",
"gender",
]
cross_cols = [("education", "occupation"), ("native-country", "occupation")]
embed_cols = [
("education", 16),
("workclass", 16),
("occupation", 16),
("native-country", 32),
]
cont_cols = ["age", "hours-per-week"]
target_col = "income_label"
# target
target = df_train[target_col].values
# wide
preprocess_wide = WidePreprocessor(wide_cols=wide_cols, crossed_cols=cross_cols)
X_wide = preprocess_wide.fit_transform(df_train)
wide = Wide(wide_dim=np.unique(X_wide).shape[0], pred_dim=1)
# deepdense
preprocess_deep = DensePreprocessor(embed_cols=embed_cols, continuous_cols=cont_cols)
X_deep = preprocess_deep.fit_transform(df_train)
deepdense = DeepDense(
hidden_layers=[64, 32],
deep_column_idx=preprocess_deep.deep_column_idx,
embed_input=preprocess_deep.embeddings_input,
continuous_cols=cont_cols,
)
# # To use DeepDenseResnet as the deepdense component simply:
# from pytorch_widedeep.models import DeepDenseResnet:
# deepdense = DeepDenseResnet(
# blocks=[64, 32],
# deep_column_idx=preprocess_deep.deep_column_idx,
# embed_input=preprocess_deep.embeddings_input,
# continuous_cols=cont_cols,
# )
# build, compile and fit
model = WideDeep(wide=wide, deepdense=deepdense)
model.compile(method="binary", metrics=[Accuracy])
model.fit(
X_wide=X_wide,
X_deep=X_deep,
target=target,
n_epochs=5,
batch_size=256,
val_split=0.1,
)
# predict
X_wide_te = preprocess_wide.transform(df_test)
X_deep_te = preprocess_deep.transform(df_test)
preds = model.predict(X_wide=X_wide_te, X_deep=X_deep_te)
Of course, one can do much more, such as using different initializations,
optimizers or learning rate schedulers for each component of the overall
model. Adding FC-Heads to the Text and Image components. Using the Focal
Loss, warming up individual components
before joined training, etc. See the examples
or the docs
folders for a
better understanding of the content of the package and its functionalities.
Testing
pytest tests
Acknowledgments
This library takes from a series of other libraries, so I think it is just fair to mention them here in the README (specific mentions are also included in the code).
The Callbacks
and Initializers
structure and code is inspired by the
torchsample
library, which in
itself partially inspired by Keras
.
The TextProcessor
class in this library uses the
fastai
's
Tokenizer
and Vocab
. The code at utils.fastai_transforms
is a minor
adaptation of their code so it functions within this library. To my experience
their Tokenizer
is the best in class.
The ImageProcessor
class in this library uses code from the fantastic Deep
Learning for Computer
Vision
(DL4CV) book by Adrian Rosebrock.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for pytorch_widedeep-0.4.7-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6509724d6f127caebb09870c19325705c0027e4cb23df325b40a52b877ef1974 |
|
MD5 | bf2e94067b0602704e58e099961db5a2 |
|
BLAKE2b-256 | 790ac17329d5e74307b062aa46a5629a00ea2fe3536f03017da1a4ff6eebfae7 |