¡El Día de la Comunidad de ML es el 9 de noviembre! Únase a nosotros para recibir actualizaciones de TensorFlow, JAX, y más Más información

Clasificación de artículos en bengalí con TF-Hub

Ver en TensorFlow.org Ejecutar en Google Colab Ver en GitHub Descargar cuaderno

Este Colab es una demostración de la utilización de Tensorflow Hub para la clasificación texto en distintos al inglés / idiomas locales. Aquí elegimos bengalí como el idioma local y el uso pretrained incrustaciones de palabras para resolver una tarea de clasificación multiclase, donde clasificamos Bangla artículos de noticias en 5 categorías. Las inclusiones pretrained para Bangla proviene de FastText que es una biblioteca de Facebook con vectores de palabras pretrained liberados de 157 idiomas.

Vamos a utilizar la incrustación exportador pretrained de TF-Hub para convertir las palabras incrustaciones a un módulo de texto incrustar primero y luego utilizar el módulo para entrenar a un clasificador con tf.keras , fácil de usar API de alto nivel de Tensorflow para construir modelos de aprendizaje profundo. Incluso si usamos incrustaciones fastText aquí, es posible exportar cualquier otra incrustación previamente entrenada de otras tareas y obtener resultados rápidamente con Tensorflow Hub.

Configuración

# https://github.com/pypa/setuptools/issues/1694#issuecomment-466010982
pip install gdown --no-use-pep517
sudo apt-get install -y unzip
Reading package lists...
Building dependency tree...
Reading state information...
unzip is already the newest version (6.0-21ubuntu1.1).
The following packages were automatically installed and are no longer required:
  linux-gcp-5.4-headers-5.4.0-1040 linux-gcp-5.4-headers-5.4.0-1043
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 104 not upgraded.
import os

import tensorflow as tf
import tensorflow_hub as hub

import gdown
import numpy as np
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt
import seaborn as sns
2021-07-29 11:15:33.073690: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0

Conjunto de datos

Vamos a utilizar BARD (Bangla artículo conjunto de datos), que cuenta con alrededor de 376.226 artículos recogidos de diferentes portales de noticias en bengalí y etiquetados con 5 categorías: economía, estado, internacionales, deportes y entretenimiento. Descargamos el archivo desde Google Drive esto ( bit.ly/BARD_DATASET enlace) se está refiriendo a partir de este repositorio GitHub.

gdown.download(
    url='https://drive.google.com/uc?id=1Ag0jd21oRwJhVFIBohmX_ogeojVtapLy',
    output='bard.zip',
    quiet=True
)
'bard.zip'
unzip -qo bard.zip

Exportar vectores de palabras previamente entrenados al módulo TF-Hub

TF-Hub proporciona algunas secuencias de comandos útiles para la conversión de incrustaciones de palabras para los módulos de texto de incrustación TF-hub aquí . Para hacer que el módulo de Bangla o cualquier otro idioma, simplemente tenemos que descargar la palabra incrustar .txt o .vec archivo en el mismo directorio que export_v2.py y ejecutar el script.

El exportador lee los vectores de incrustación y la exporta a un Tensorflow SavedModel . Un modelo guardado contiene un programa TensorFlow completo que incluye pesos y gráficos. TF-Hub puede cargar el SavedModel como un módulo , el cual utilizaremos para construir el modelo de clasificación de texto. Puesto que estamos utilizando tf.keras para construir el modelo, vamos a utilizar hub.KerasLayer , que proporciona un contenedor para un módulo TF-Hub para su uso como capa Keras.

En primer lugar vamos a tener en nuestras inmersiones Palabras FastText y exportador de la incrustación de TF-Hub de recompra .

curl -O https://dl.fbaipublicfiles.com/fasttext/vectors-crawl/cc.bn.300.vec.gz
curl -O https://raw.githubusercontent.com/tensorflow/hub/master/examples/text_embeddings_v2/export_v2.py
gunzip -qf cc.bn.300.vec.gz --k
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  840M  100  840M    0     0  10.0M      0  0:01:24  0:01:24 --:--:-- 10.3M
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7469  100  7469    0     0  17532      0 --:--:-- --:--:-- --:--:-- 17491

Luego, ejecutaremos el script exportador en nuestro archivo de incrustación. Dado que las incrustaciones de fastText tienen una línea de encabezado y son bastante grandes (alrededor de 3.3 GB para bengalí después de convertir a un módulo) ignoramos la primera línea y exportamos solo los primeros 100.000 tokens al módulo de incrustación de texto.

python export_v2.py --embedding_file=cc.bn.300.vec --export_path=text_module --num_lines_to_ignore=1 --num_lines_to_use=100000
2021-07-29 11:18:03.965325: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2021-07-29 11:18:16.900049: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcuda.so.1
2021-07-29 11:18:17.645761: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:17.646808: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-29 11:18:17.646859: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2021-07-29 11:18:17.650208: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublas.so.11
2021-07-29 11:18:17.650314: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublasLt.so.11
2021-07-29 11:18:17.651364: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcufft.so.10
2021-07-29 11:18:17.651725: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcurand.so.10
2021-07-29 11:18:17.652632: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusolver.so.11
2021-07-29 11:18:17.653401: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusparse.so.11
2021-07-29 11:18:17.653608: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudnn.so.8
2021-07-29 11:18:17.653733: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:17.654835: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:17.655828: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-29 11:18:17.656311: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 AVX512F FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-07-29 11:18:17.656849: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:17.657869: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-29 11:18:17.657955: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:17.658969: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:17.659959: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-29 11:18:17.660026: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2021-07-29 11:18:18.203894: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-29 11:18:18.203947: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-29 11:18:18.203957: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-29 11:18:18.204158: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:18.205216: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:18.206202: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:18.207183: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
INFO:tensorflow:Assets written to: text_module/assets
I0729 11:18:19.825529 140674492086080 builder_impl.py:775] Assets written to: text_module/assets
module_path = "text_module"
embedding_layer = hub.KerasLayer(module_path, trainable=False)
2021-07-29 11:18:21.133113: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcuda.so.1
2021-07-29 11:18:21.837155: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:21.838466: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-29 11:18:21.838530: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2021-07-29 11:18:21.842042: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublas.so.11
2021-07-29 11:18:21.842167: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublasLt.so.11
2021-07-29 11:18:21.843416: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcufft.so.10
2021-07-29 11:18:21.843791: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcurand.so.10
2021-07-29 11:18:21.844913: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusolver.so.11
2021-07-29 11:18:21.845901: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusparse.so.11
2021-07-29 11:18:21.846093: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudnn.so.8
2021-07-29 11:18:21.846245: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:21.847326: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:21.848295: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-29 11:18:21.849098: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 AVX512F FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-07-29 11:18:21.849785: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:21.850794: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-29 11:18:21.850912: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:21.851967: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:21.852913: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-29 11:18:21.852968: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2021-07-29 11:18:22.514791: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-29 11:18:22.514842: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-29 11:18:22.514850: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-29 11:18:22.515122: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:22.516240: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:22.517277: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-29 11:18:22.518254: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
2021-07-29 11:18:22.885643: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:176] None of the MLIR Optimization Passes are enabled (registered 2)
2021-07-29 11:18:22.886352: I tensorflow/core/platform/profile_utils/cpu_utils.cc:114] CPU Frequency: 2000179999 Hz

El módulo de incrustación de texto toma un lote de oraciones en un tensor de cadenas 1D como entrada y genera los vectores de incrustación de forma (batch_size, embedding_dim) correspondientes a las oraciones. Preprocesa la entrada dividiéndola en espacios. Incrustaciones de palabras se combinan para incrustaciones oración con la sqrtn combinador (Ver aquí ). Para la demostración, pasamos una lista de palabras en bengalí como entrada y obtenemos los vectores de incrustación correspondientes.

embedding_layer(['বাস', 'বসবাস', 'ট্রেন', 'যাত্রী', 'ট্রাক'])
<tf.Tensor: shape=(5, 300), dtype=float64, numpy=
array([[ 0.0462, -0.0355,  0.0129, ...,  0.0025, -0.0966,  0.0216],
       [-0.0631, -0.0051,  0.085 , ...,  0.0249, -0.0149,  0.0203],
       [ 0.1371, -0.069 , -0.1176, ...,  0.029 ,  0.0508, -0.026 ],
       [ 0.0532, -0.0465, -0.0504, ...,  0.02  , -0.0023,  0.0011],
       [ 0.0908, -0.0404, -0.0536, ..., -0.0275,  0.0528,  0.0253]])>

Convertir a conjunto de datos de Tensorflow

Dado que el conjunto de datos es muy grande en lugar de cargar todo el conjunto de datos en la memoria vamos a utilizar un generador para producir muestras en tiempo de ejecución en lotes utilizando Tensorflow del conjunto de datos funciones. El conjunto de datos también está muy desequilibrado, por lo que, antes de usar el generador, barajaremos el conjunto de datos.

dir_names = ['economy', 'sports', 'entertainment', 'state', 'international']

file_paths = []
labels = []
for i, dir in enumerate(dir_names):
  file_names = ["/".join([dir, name]) for name in os.listdir(dir)]
  file_paths += file_names
  labels += [i] * len(os.listdir(dir))

np.random.seed(42)
permutation = np.random.permutation(len(file_paths))

file_paths = np.array(file_paths)[permutation]
labels = np.array(labels)[permutation]

Podemos comprobar la distribución de etiquetas en los ejemplos de formación y validación después de barajar.

train_frac = 0.8
train_size = int(len(file_paths) * train_frac)
# plot training vs validation distribution
plt.subplot(1, 2, 1)
plt.hist(labels[0:train_size])
plt.title("Train labels")
plt.subplot(1, 2, 2)
plt.hist(labels[train_size:])
plt.title("Validation labels")
plt.tight_layout()

png

Para crear un conjunto de datos utilizando un generador, primero escribimos una función de generador que lee cada uno de los artículos de file_paths y las etiquetas de la agrupación de etiquetas, y los rendimientos ejemplo una formación en cada etapa. Pasamos esta función generador a la tf.data.Dataset.from_generator método y especificar los tipos de salida. Cada ejemplo de formación es una tupla que contiene un artículo de tf.string tipo de datos y la etiqueta codificada de una sola caliente. Dividimos el conjunto de datos con una fracción de tren-validación de 80-20 usando tf.data.Dataset.skip y tf.data.Dataset.take métodos.

def load_file(path, label):
    return tf.io.read_file(path), label
def make_datasets(train_size):
  batch_size = 256

  train_files = file_paths[:train_size]
  train_labels = labels[:train_size]
  train_ds = tf.data.Dataset.from_tensor_slices((train_files, train_labels))
  train_ds = train_ds.map(load_file).shuffle(5000)
  train_ds = train_ds.batch(batch_size).prefetch(tf.data.AUTOTUNE)

  test_files = file_paths[train_size:]
  test_labels = labels[train_size:]
  test_ds = tf.data.Dataset.from_tensor_slices((test_files, test_labels))
  test_ds = test_ds.map(load_file)
  test_ds = test_ds.batch(batch_size).prefetch(tf.data.AUTOTUNE)


  return train_ds, test_ds
train_data, validation_data = make_datasets(train_size)

Modelo de formación y evaluación

Como ya hemos añadido una envoltura alrededor de nuestro módulo de utilizarlo como cualquier otra capa en Keras, podemos crear una pequeña secuencial modelo que es una pila lineal de capas. Podemos añadir nuestro módulo de la incrustación de texto con model.add al igual que cualquier otra capa. Compilamos el modelo especificando la pérdida y el optimizador y lo entrenamos durante 10 épocas. El tf.keras API puede manejar Tensorflow conjuntos de datos como entrada, por lo que podemos pasar a una instancia de conjunto de datos para el método de ajuste para el entrenamiento del modelo. Ya que estamos usando la función de generador, tf.data se encargará de generar las muestras, preparación de lotes ellos y alimentarlos al modelo.

Modelo

def create_model():
  model = tf.keras.Sequential([
    tf.keras.layers.Input(shape=[], dtype=tf.string),
    embedding_layer,
    tf.keras.layers.Dense(64, activation="relu"),
    tf.keras.layers.Dense(16, activation="relu"),
    tf.keras.layers.Dense(5),
  ])
  model.compile(loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
      optimizer="adam", metrics=['accuracy'])
  return model
model = create_model()
# Create earlystopping callback
early_stopping_callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=3)
WARNING:tensorflow:Please add `keras.layers.InputLayer` instead of `keras.Input` to Sequential model. `keras.Input` is intended to be used by Functional model.

Capacitación

history = model.fit(train_data, 
                    validation_data=validation_data, 
                    epochs=5, 
                    callbacks=[early_stopping_callback])
Epoch 1/5
2021-07-29 11:18:25.542982: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublas.so.11
5/1176 [..............................] - ETA: 47s - loss: 1.4244 - accuracy: 0.4805
2021-07-29 11:18:25.993171: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublasLt.so.11
1176/1176 [==============================] - 58s 48ms/step - loss: 0.2226 - accuracy: 0.9228 - val_loss: 0.1461 - val_accuracy: 0.9485
Epoch 2/5
1176/1176 [==============================] - 54s 46ms/step - loss: 0.1407 - accuracy: 0.9505 - val_loss: 0.1320 - val_accuracy: 0.9525
Epoch 3/5
1176/1176 [==============================] - 54s 46ms/step - loss: 0.1294 - accuracy: 0.9537 - val_loss: 0.1255 - val_accuracy: 0.9545
Epoch 4/5
1176/1176 [==============================] - 55s 47ms/step - loss: 0.1221 - accuracy: 0.9557 - val_loss: 0.1204 - val_accuracy: 0.9562
Epoch 5/5
1176/1176 [==============================] - 53s 45ms/step - loss: 0.1176 - accuracy: 0.9570 - val_loss: 0.1190 - val_accuracy: 0.9562

Evaluación

Podemos visualizar las curvas de pérdida de precisión y para el entrenamiento y validación de datos utilizando el tf.keras.callbacks.History objeto devuelto por el tf.keras.Model.fit método, que contiene el valor de la pérdida y la precisión de cada época.

# Plot training & validation accuracy values
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

# Plot training & validation loss values
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

png

png

Predicción

Podemos obtener las predicciones para los datos de validación y verificar la matriz de confusión para ver el desempeño del modelo para cada una de las 5 clases. Debido tf.keras.Model.predict método devuelve una matriz nd para probabilidades para cada clase, pueden ser convertidos a etiquetas de clase utilizando np.argmax .

y_pred = model.predict(validation_data)
y_pred = np.argmax(y_pred, axis=1)
samples = file_paths[0:3]
for i, sample in enumerate(samples):
  f = open(sample)
  text = f.read()
  print(text[0:100])
  print("True Class: ", sample.split("/")[0])
  print("Predicted Class: ", dir_names[y_pred[i]])
  f.close()
এটিএন বাংলায় ঈদের ছয় দিন রাত ৮টা ১৫ মিনিটে প্রচারিত হবে খণ্ড নাটক চুটকি ভান্ডার। বাংলায় প্রচলিত ছয়ট
True Class:  entertainment
Predicted Class:  state

জাহাঙ্গীরনগর বিশ্ববিদ্যালয়ের সাবেক উপাচার্য অধ্যাপক মোহাম্মদ নোমানের ১৮তম মৃত্যুবার্ষিকী আজ। এ উপ
True Class:  state
Predicted Class:  state

একটা সময় ওয়ানডেতে ৩০০ রান হতো কালেভদ্রে। এখন তো যা একরকম নৈমিত্তিক ব্যাপারই হয়ে গেছে। কাল সেই নিয়মি
True Class:  sports
Predicted Class:  state

Compare el rendimiento

Ahora podemos tomar las etiquetas correctas de los datos de validación de labels y los compare con nuestras predicciones para obtener una classification_report .

y_true = np.array(labels[train_size:])
print(classification_report(y_true, y_pred, target_names=dir_names))
precision    recall  f1-score   support

      economy       0.77      0.84      0.80      3897
       sports       0.99      0.99      0.99     10204
entertainment       0.90      0.95      0.92      6256
        state       0.98      0.96      0.97     48512
international       0.92      0.94      0.93      6377

     accuracy                           0.96     75246
    macro avg       0.91      0.94      0.92     75246
 weighted avg       0.96      0.96      0.96     75246

También podemos comparar el rendimiento de nuestro modelo con los resultados publicados obtenidos en el original de papel , que tenía un 0,96 precisión .Los autores originales describen muchos pasos de preprocesamiento realizan en el conjunto de datos, como la caída de signos de puntuación y dígitos, que quita la tapa 25 la mayoría de las palabras vacías fRequest. Como podemos ver en la classification_report , también gestionamos para obtener una precisión y exactitud de 0,96 después del entrenamiento por sólo 5 épocas sin ningún procesamiento previo!

En este ejemplo, cuando creamos la capa Keras de nuestro módulo de incrustación, fijamos el parámetro trainable=False , lo que significa que los pesos de incrustación no se actualizará durante el entrenamiento. Inténtelo a True para llegar a alrededor del 97% de precisión usando este conjunto de datos después de sólo 2 épocas.