C贸mo utilizar TensorFlow 2.0 con Python

1

Redes neuronales con TensorFlow

2

Introducci贸n a TensorFlow 2.0

Manejo y preprocesamiento de datos para redes neuronales

3

Uso de data pipelines

4

C贸mo cargar bases de datos JSON

5

Cargar bases de datos CSV y BASE 64

6

Preprocesamiento y limpieza de datos

7

Keras datasets

8

Datasets generators

9

Aprende a buscar bases de datos para deep learning

10

C贸mo distribuir los datos

11

Crear la red neural, definir capas, compilar, entrenar, evaluar y predicciones

Optimizaci贸n de precisi贸n de modelos

12

M茅todos de regularizaci贸n: overfitting y underfitting

13

Recomendaciones pr谩cticas para ajustar un modelo

14

M茅tricas para medir la eficiencia de un modelo: callback

15

Monitoreo del entrenamiento en tiempo real: early stopping y patience

16

KerasTuner: construyendo el modelo

17

KerasTuner: buscando la mejor configuraci贸n para tu modelo

Almacenamiento y carga de modelos

18

Almacenamiento y carga de modelos: pesos y arquitectura

19

Criterios para almacenar los modelos

Fundamentos de aprendizaje por transferencia

20

Introducci贸n al aprendizaje por transferencia

21

Cu谩ndo utilizar aprendizaje por transferencia

22

Carga de sistemas pre-entrenados en Keras

23

API funcional de Keras

24

Uso sistemas pre-entrenados de TensorFlow Hub

Resultados de entrenamiento

25

Introducci贸n a variables relevantes del TensorBoard

26

An谩lisis y publicaci贸n de resultados del entrenamiento

27

Introducci贸n al despliegue de modelos en producci贸n

28

Siguientes pasos con deep learning

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Preprocesamiento y limpieza de datos

6/28
Recursos

El preprocesamiento de los datos es de las etapas m谩s importantes en cualquier proyecto de data science, principalmente porque es un proceso altamente dif铆cil de automatizar y requiere de creatividad e intelecto humano para hacerse correctamente.

Esta etapa determinar谩 la calidad final de tu modelo, por lo que no deber铆as temer en invertir el tiempo necesario.

Carga y an谩lisis exploratorio de datos

Para esta ocasi贸n usaremos una versi贸n del dataset mnist en CSV que no est谩 limpio, es decir, tiene datos faltantes e incongruencias que solucionaremos a continuaci贸n.

{code-block} python train = pd.read_csv('/tmp/databasesLoadData/sign_mnist_train/sign_mnist_train_clean.csv')

Empezaremos con un poco de an谩lisis exploratorio, vamos a entender la densidad de los datos, donde gracias a matplotlib y seaborn podemos obtener una gr谩fica de la distribuci贸n de las etiquetas.

{code-block} python plt.figure(figsize=(10,10)) sns.set_style("darkgrid") sns.countplot(train['label'])

En general el dataset se encuentra balanceado, donde cada etiqueta tiene de 900 a 1200 ejemplos en promedio.

Balance de la cantidad de ejemplos por cada etiqueta

Limpieza de los datos

Lo primero a realizar ser谩 separar las etiquetas de las im谩genes, donde bastar谩 con aislar esta columna en concreto en nuevas variables.

```{code-block} python y_train = train['label'] y_test = test['label']

del train['label'] del test['label'] ```

Para obtener informaci贸n general del dataset podemos usar el m茅todo info que nos dar谩 detalles de la estructura, su contenido y los tipos de datos que almacena.

```{code-block} python train.info()

RangeIndex: 27455 entries, 0 to 27454 Columns: 784 entries, pixel1 to pixel784 dtypes: object(784) memory usage: 164.2+ MB ```

De la misma manera, podemos analizar espec铆ficamente cada columna con el atributo dtypes.

```{code-block} python train.dtypes

pixel1 object pixel2 object pixel3 object pixel4 object pixel5 object ...
pixel780 object pixel781 object pixel782 object pixel783 object pixel784 object Length: 784, dtype: object ```

Si queremos conocer qu茅 etiquetas hay, podemos hacer uso de la funci贸n unique de numpy.

{code-block} python unique_val = np.array(labels) np.unique(unique_val) array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])

Podemos verificar si tenemos valores nulos en nuestra base de datos, esto nos dar谩 informaci贸n relacionada a negocio que puede ser valiosa, por lo que esta acci贸n no solo ayuda a limpiar el dataset sino a comprender el posible origen del problema.

{code-block} python train.isnull().values.any() False

Podemos buscar datos duplicados con el m茅todo duplicated del dataframe, esto nos retornar谩 una fila por cada elemento.

{code-block} python train[train.duplicated()]

Para borrar registros haremos uso del m茅todo drop que recibe como argumentos los index de los elementos a borrar.

python train = train.drop([317, 487, 595, 689, 802, 861], axis = 0)

Entre los datos duplicados encontramos uno que tra铆a letras (algo il贸gico para im谩genes entre 0 y 255), por lo que lo buscaremos y eliminaremos.

{code-block} python train[train['pixel1'] == "fwefew"] 727 train = train.drop([727], axis = 0)

Preprocesamiento y optimizaci贸n

El paso final ser谩 normalizar los datos para sintetizarlos desde el rango inicial al rango 0-1, para esto debemos convertir todos los datos en valores num茅ricos y luego aplicar la operaci贸n.

{code-block} python train = train.astype(str).astype(int) train = train / 255 test = test / 255

Si verificamos el dataset limpio obtendremos 784 columnas con valores entre 0 y 1.

{code-block} python train.head() 5 rows 脳 784 columns

Estos datos finales son mucho m谩s procesables que los iniciales, por lo que tu rendimiento final se ver谩 afectando positivamente.

Recuerda siempre dedicar una parte importante del tiempo de desarrollo en revisi贸n y limpieza de datos para obtener resultados exponencialmente mejores.

Contribuci贸n creada por Sebasti谩n Franco G贸mez.

Aportes 18

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Intentas hacer el conteo de labels y te sale algo as铆?

escribe

sns.countplot(x='label', data=train)

En vez de

sns.countplot(train['label'])

[

Para que puedan visualizar el balanceado de clases y adem谩s tengan una referencia num茅rica del porcentaje que representa cada una de las clases sobre el total.

para saber cuales son los valores unicos de los labels

train['label'].unique()

para hacer un conteo de los labels

train.groupby('label')['label'].count()

Oigan, no dejen de ver las lecturas recomendadas, estan buenisimas, MIL GRACIAS PROFE

Leer archivos parquet con pandas:
Parquet es un format columnar comunmente usado en ambientes big data asi que espero les sirva saber que existe una funci贸n en pandas para leerlo

pd.read_parquet('/path/to/file')

Me parece que hubo un peque帽o detalle, primero se separ贸 la variable objetivo

y_train = train['label']
y_test = test['label']
del train['label']
del test['label']

y luego se procedi贸 a borrar los datos nulos.

train = train.drop([317,487, 595, 689, 802, 861], axis = 0)
train = train.drop([727], axis = 0) # este tambien es una cadena.

Falto borrar los valores en el y_train porque como se quedaron la cantidad de filas para cada uno no es la misma, y deber铆a ser la misma.

train.shape, y_train.shape 
# ouput: ((27448, 784), (27455,))

EXCEL

pd.read_excel('test.xlsx')

El preprocesamiento y la limpieza de datos son pasos fundamentales en el an谩lisis de datos. Estos procesos ayudan a mejorar la calidad de los datos, lo que a su vez conduce a mejores resultados en el an谩lisis.

import pandas as pd

# Importa un archivo CSV
data = pd.read_csv("ruta/al/archivo.csv")

# Exploraci贸n de datos
data.hist()
data.describe()

# Limpieza de datos
data.dropna()
data['columna'].fillna(data['columna'].mean(), inplace=True)
data['columna'] = data['columna'].where(data['columna'] < valor_umbral, valor_umbral)
data['fecha'] = pd.to_datetime(data['fecha'])
data['columna'] = pd.Categorical(data['columna'])

# Transformaci贸n de datos
data['columna'] = (data['columna'] - data['columna'].mean()) / data['columna'].std()
data['columna'] = np.log(data['columna'])
data = data.drop('columna_colineal', axis=1)

# Exporta a un archivo CSV
data.to_csv("ruta/al/archivo_nuevo.csv")

Quiero hacer correr este modelo: <https://codigos.ufsc.br/aldo.vw/appsthetics> pero mi colba no quiere utilizar mi GPU local, me pueden ayudar
\<ipython-input-35-ff78bf3a306c>:1: DtypeWarning: Columns (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784) have mixed types. Specify dtype option on import or set low\_memory=False. train = pd.read\_csv('/tmp/databasesLoadData/sign\_mnist\_train/sign\_mnist\_train\_clean.csv')

Como en principio no conocemos qu茅 otros string podr铆an haber en los datos hice una b煤squeda automatizada con regex:

import re
r = re.compile(".*[A-Za-z].*") '''Este regex busca cualquier tipo de string que contenga una letra'''
train = train.astype(str)

for column in processed_train.columns:
  words = list(filter(r.match, processed_train[column].values))
  for word in words:
	 processed_train 
= processed_train.drop(processed_train[processed_train[column]==word].index)

Super hack para la exploraci贸n de datos:

Que haya datos vac铆os, nulos o faltantes, ES INFORMACION
Que no haya informaci贸n, ES INFORMACION

Estupendos art铆culos de referencia para resolver tema del desbalanceo de clases.

Para este caso el drop se puede hacer usando

train.drop_duplicates(keep=False, inplace=True)

Para no hacerlo tan manual, yo elimine los duplicados de esta forma:

duplicated = train[train.duplicated(keep=False)]
train.drop(duplicated.index, axis=0, inplace=True)

Y as铆 no debemos poner uno a uno los 铆ndices a eliminar.

Cuando usamos el m茅todo .duplicated() este no nos regresa todos los duplicados como tal ya que por defecto ignora la primera muestra del dataset que contenga dichos valores, para que nos muestre todos, incluyendo la primera muestra se debe usar la siguiente linea:

train[train.duplicated(keep=False)]

Esto nos ayuda en casos como el de este ejemplo ya que da la casualidad que las muestras adem谩s de estar duplicadas contienen valores que no nos sirven para el modelo

Creo 馃 que el profe normaliza los datos con 鈥255鈥 ya que en datos de im谩genes donde un elemento tiende a tener el valor entre 0 y 255 para su color RGB.

Cantidades por etiqueta de mayor a menor

train[['label']].value_counts().sort_values(ascending=False)