feature_column
In this example we will use the PetFinder dataset to demonstrate the feature_spec functionality with TensorFlow Hub.
Currently, we need TensorFlow 2.0 nightly and disable eager execution in order for this example to work.
Waiting for https://github.com/tensorflow/hub/issues/333
library(keras)
library(tfhub)
library(tfdatasets)
library(readr)
library(dplyr)
tf$compat$v1$disable_eager_execution()
# Read data ---------------------------------------------------------------
dataset <- read_csv("train.csv") %>%
filter(PhotoAmt > 0) %>%
mutate(img_path = path.expand(paste0("train_images/", PetID, "-1.jpg"))) %>%
mutate_at(vars(Breed1:Health, State), as.character) %>%
sample_n(size = nrow(.)) # shuffle
dataset_tf <- dataset %>%
tensor_slices_dataset() %>%
dataset_map(function(x) {
img <- tf$io$read_file(filename = x$img_path) %>%
tf$image$decode_jpeg(channels = 3L) %>%
tf$image$resize(size = c(224L, 224L))
x[["img"]] <- img/255
x
})
dataset_test <- dataset_tf %>%
dataset_take(nrow(dataset)*0.2) %>%
dataset_batch(512)
dataset_train <- dataset_tf %>%
dataset_skip(nrow(dataset)*0.2) %>%
dataset_batch(32)
# Build the feature spec --------------------------------------------------
spec <- dataset_train %>%
feature_spec(AdoptionSpeed ~ .) %>%
step_text_embedding_column(
Description,
module_spec = "https://tfhub.dev/google/universal-sentence-encoder/2"
) %>%
step_image_embedding_column(
img,
module_spec = "https://tfhub.dev/google/imagenet/resnet_v2_50/feature_vector/3"
) %>%
step_numeric_column(Age, Fee, Quantity, normalizer_fn = scaler_standard()) %>%
step_categorical_column_with_vocabulary_list(
has_type("string"), -Description, -RescuerID, -img_path, -PetID, -Name
) %>%
step_embedding_column(Breed1:Health, State)
spec <- fit(spec)
# Build the model ---------------------------------------------------------
inputs <- layer_input_from_dataset(dataset_train) %>% reticulate::py_to_r()
inputs <- inputs[-which(names(inputs) == "AdoptionSpeed")]
output <- inputs %>%
layer_dense_features(spec$dense_features()) %>%
layer_dropout(0.25) %>%
layer_dense(units = 32, activation = "relu") %>%
layer_dense(units = 5, activation = "softmax")
model <- keras_model(inputs, output)
model %>%
compile(
loss = "sparse_categorical_crossentropy",
optimizer = "adam",
metrics = "accuracy"
)
# Fit the model -----------------------------------------------------------
sess <- k_get_session()
sess$run(tf$compat$v1$initialize_all_variables())
sess$run(tf$compat$v1$initialize_all_tables())
model %>%
fit(
x = dataset_use_spec(dataset_train, spec),
validation_data = dataset_use_spec(dataset_test, spec),
epochs = 5
)