Uno de los puntos interesantes del capítulo es la introducción del conjunto de técnicas bajo el nombre de data augmentation ✨. Es una idea simple pero ingeniosa ya que no va en la línea directa (y más obvia) de mejorar el desempeño del modelo a través del diseño de la arquitectura, sino el foco se mueve a los datos. Parte esencial pero definitivamente no la más popular (?). El punto es que cualquier sistema bajo la categoria de machine learning (incluyendo deep learning) tiene una relación indisoluble con los datos, y ocupar data augmentation es una forma de incrementar la diversidad de nuestro dataset usando data sintetica creada a partir del dataset original.
Enfocandonos en datos que son imagenes, la generación de nuevos datos se realiza al aplicar transformaciones sobre una imagen. Arriba se observan distintas variaciones de la misma imagen, vemos como la imagen de un elfo sufré alteraciones como rotaciones, saturación del color, etcétera. Esto ayuda aumentar artificialmente la variación en nuestros datos, y si todo sale bien lograr una mejora en la generalización del modelo. Intuitivamente esto se podría explicar porque la saturación de color ayuda a evitar que el modelo dependa mucho del color verde en detectar elfos y permitir identificarlos en otros entornos menos comunes pero probables (e.g. montañosos con paleta más cargada a colores tierra), o incorporar mayor diversidad en las poses de los dibujos de elfos que el algoritmo ve durante el entrenamiento, logrando así disminuir el sesgo de las poses más comunes con que se dibujan y representan a los elfos.
La librería fastai
operativamente implementa las transformaciones de imagen
durante cada época, donde con alguna probabilidad se aplica una o más
perturbaciones sobre la imagen, o se muestra su versión de la original.
db = DataBlock(
blocks = (ImageBlock, CategoryBlock),
get_items = get_image_filees,
splitter = RandomSplitter(valid_pct=0.2, seed=42),
get_y = parent_label,
item_tfms=Resize(128),
batch_tfms=aug_transforms(mult=2)
)
dls = db.dataloaders(images_path)
Recordemos que el objeto DataLoaders
es una instancia de la clase encargada de
proveer mini-batches al algoritmo durante el entrenamiento y enviarlas a la GPU.
Por lo tanto, las transformaciones especificadas en el argumento batch_tfms
en DataBlock
son las que se ejecutaran en la GPU para todo las imagenes
del mini-batch, transformaciones que van aplicandose época-tras-época.
Si bien el segundo capítulo no detalle mucho más, en la documentación de fastai
se puede encontrar
más información de cómo aplicar varias transformaciones y combinarlas. Además,
hay metodologias para encontrar el conjunto de transformaciones más óptimo para un
dataset especifico como la detallada en el paper
AutoAugment: Learning Augmentation Policies from Data (Cubuk 2018).
De hecho, el modulo vision de PyTorch, en torchvision.transforms.AutoAugment
se encuentran los conjuntos de transformaciones óptimos según la metodologia del
paper anterior para los datasets: Imagenet, CIFAR10, y SVHN. Una
alternativa es ocupar alguna de estas transformaciones versus ocupar
transformaciones arbitrariamente definidas.
Finalmente terminar con cómo interpretar teorícamente la técnica de data augmentation. Existe una justificación bayesiana cuya línea argumentativa es tratada en el post A Bayesian view of data augmentation (O’Rourke 2019) , y también hay una breve sección en la nueva edición del libro de Kevin Murphy página 622, citó del libro: “the data augmentation mechanism can be viewed as a way to algorithmically inject prior knowledge” 💉🧠.
Where do text models currently have a major deficiency?
What are possible negative societal implications of text generation models?
In situations where a model might make mistakes, and those mistakes could be harmful, what is a good alternative to automating a process?
What kind of tabular data is deep learning particularly good at?
What’s a key downside of directly using a deep learning model for recommendation systems?
What are the steps of the Drivetrain Approach?
How do the steps of the Drivetrain Approach map to a recommendation system?
Create an image recognition model using data you curate, and deploy it on the web.
What is DataLoaders
?
DataLoader
es una clase auxiliar para implementar la abstracción
de gestionar y proveer datos al modelo. Las 4 líneas de código siguientes son
la funcionalidades básicas de esta clase destacadas en el capítulo:class DataLoaders(GetAttr):
def __init__(self, *loaders): self.loaders = loaders
def __getitem__(self, i): return self.loaders[i]
train, valid = add_props(lambda i, self: self[i])
What four things do we need to tell fastai to create DataLoaders
?
blocks=(ImageBlock, CategoryBlock)
get_items=get_image_files
get_y=parent_label
splitter=RandomSplitter(valid_pct=0.2, seed=42)
What does the splitter
parameter to DataBlock
do?
splitter
dentro de DataBlock
especifica
el porcentaje de observaciones que serán destinadas al conjunto de validación
además de garantizar la reproducibilidad de los resultados.How do we ensure a random split always gives the same validation set?
seed=42
) para garantizar
que el generador de números aleatorios produzca la misma secuencia de
valores y por ende resultados.What letters are often used to signify the independent and dependent variables?
What’s the difference between the crop, pad, and squish resize approaches? When might you choose one over the others?
R: Primero, es importante estandarizar nuestras imagenes para transformarlas en tensores y que luego puedan ser insumidas por la arquitectura del modelo. La mayoría de las veces que recolectamos imagenes en la web, o de diferentes fuentes, notaremos que las imagenes tendrán distintas dimensiones. ¿Cómo estandarizarlas? Hay distintas formas y cada una puede tener un impacto en la calidad de nuestros datos.
Resize(128)
Resize(128, ResizeMethod.Pad, pad_mode='zeros'))
Resize(128, ResizeMethod.Squish))
¿Cuando escoger una sobre otra? Depende mucho de la naturaleza de las imagenes y que representan. Imagenes de números y letras pueden ser afectadas si se recorta alguna parte distintiva de un número particular, un 7 podría ser muy un 1 si la imagen se cropea de cierta forma. Sin embargo, si estamos identificando paisajes que son muy distintos (e.g. pradera y oceanos) el cropping no importar mucho.
What is data augmentation? Why is it needed?
Provide an example of where the bear classification model might work poorly in production, due to structural or style differences in the training data.
What is the difference between item_tfms
and batch_tfms
?
item_tfms
y batch_tfms
es que el
primero se aplica previo al proceso de entrenamiento a modo de
pre-proceso de imagenes (e.g. estandarizar todas las imagenes a
ciertas dimensiones como 128x128) y utiliza la CPU. En cambio, batch_tfms
se aplica cada vez que el DataLoader
entrega un mini-batch, o conjunto de
observaciones, al modelo y generalmente se aplican usando la GPU para aplicar
de manera eficiente las transformaciones sobre el mini-batch completo y
que el modelo realice el ajuste de parámetros con las perturbaciones
aleatorias particulares en esa epoch.What is a confusion matrix?
What does export save?
learn.export()
guarda un archivo con extension
.pkl
con el valor de los parámetros entrenados y la arquitectura del
modelo para cargarlo e instanciarlo posteriormente. Un archivo .pkl
es
un archivo pickle creado por un modulo de python que serializa objetos
en una serie de bites.What is it called when we use a model for making predictions, instead of training?
What are IPython widgets?
When would you use a CPU for deployment? When might a GPU be better?
What are the downsides of deploying your app to a server, instead of to a client (or edge) device such as a phone or PC?
What are three examples of problems that could occur when rolling out a bear warning system in practice?
What is out-of-domain data?
What is domain shift?
What are the three steps in the deployment process?