AI Cho Mọi Người

AI Cho Mọi Người

Giới thiệu Tensorflow và tf.keras

 

 

Tensorflow là thư viện về deep learning được dùng phổ biến nhất hiện nay. Phiên bản mới nhất (Tensorflow 2.0) tích hợp thư viện Keras vào như một module với tên là tensorflow.keras. Trong bài này, chúng ta sẽ tìm hiểu tổng quan về Tensorflow và áp dụng module keras để cài đặt các phương pháp chúng ta đã học từ các bài học trước.

Các bạn vào trang chủ của Tensorflow để tìm hiểu chi tiết và xem các bài học cho nhiều mức độ. Tensorflow 2.0 có thể cài đặt với câu lệnh

pip install tensorflow

Với câu lệnh trên, Tensorflow chạy trên CPU sẽ được cài đặt. Trong trường hợp các bạn muốn cài bản chạy trên GPU, các bạn dụng lệnh

pip install tensorflow-gpu

Các bạn đọc thêm ở trang chủ về Tensorflow để cài nhưng phiên bản tùy chọn.

 

Các bộ dữ liệu có sẵn trong Tensorflow

Tensorflow xây dựng sẵn một số hàm để download và đọc một số bộ dữ liệu phổ biến như MNIST, Fashion-MNIST, house price, CIFAR 10 và 100. Ví dụ, chúng ta cần đọc dữ liệu MNIST, chúng ta dùng 2 dòng code sau

import tensorflow as tf

# Load and prepare the MNIST dataset
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

Hàm mnist.load_data()  trả về bộ dữ liệu cho train và test. Các biến x_train, y_train, x_test, và y_test là các mảng numpy.

 

Ở các bài học trước, chúng ta đã học cách dùng numpy để đọc bộ dữ liệu MNIST. Các bạn có thể xem lại phần bài học đó để hiểu hơn các bước mà hàm mnist.load_data() cần thực hiện. Ở đây, chúng ta xem lại đoạn code dùng numpy để đọc dữ liệu MNIST

# numpy 
import numpy as np
from urllib import request
import gzip
import pickle

filename = [
["training_images","train-images-idx3-ubyte.gz"],
["test_images","t10k-images-idx3-ubyte.gz"],
["training_labels","train-labels-idx1-ubyte.gz"],
["test_labels","t10k-labels-idx1-ubyte.gz"]
]

folder = 'data_mnist/'

def download_mnist():
    base_url = "http://yann.lecun.com/exdb/mnist/"
    for name in filename:
        print("Downloading " + name[1] + "...")
        
        # lưu vào folder data_mnist
        request.urlretrieve(base_url + name[1], folder + name[1])
    print("Download complete.")

def save_mnist():
    mnist = {}
    for name in filename[:2]:
        with gzip.open(folder+name[1], 'rb') as f:
            mnist[name[0]] = np.frombuffer(f.read(), np.uint8, offset=16).reshape(-1,28*28)
    for name in filename[-2:]:
        with gzip.open(folder+name[1], 'rb') as f:
            mnist[name[0]] = np.frombuffer(f.read(), np.uint8, offset=8)
    with open(folder+"mnist.pkl", 'wb') as f:
        pickle.dump(mnist,f)
    print("Save complete.")

def init():
    download_mnist()
    save_mnist()

def load():
    with open(folder+"mnist.pkl",'rb') as f:
        mnist = pickle.load(f)
    return mnist["training_images"], mnist["training_labels"], mnist["test_images"], mnist["test_labels"]

X_train, y_train, X_test, y_test = load()

So sánh 2 đoạn code dùng để đọc bộ dữ liệu MNIST, chúng ta có thể thấy được sự thuận tiện khi dùng các thư viện. (Tuy nhiên, với các bạn mới học về machine learning, dùng numpy sẽ giúp các bạn hiểu chi tiết bên trong các hàm mình đang sử dụng).

 

Tiếp theo, chúng ta thử hiển thị vài mẫu dữ liệu từ biến x_train, trả về từ hàm mnist.load_data()

# dùng vẽ đồ thị, hình ảnh
import matplotlib.pyplot as plt 
import numpy as np

# Kiểm tra ngẫu nhiên 9 mẫu training trong tổng số 60.000 mẫu
# Tạo số ngẫu nhiên nhưng không thay đổi khi ru  nhiều lần
np.random.seed(100) 

# Tạo dang sách 9 phần tử ngẫu nhiên từ m_train có 60.000 phần tử
m_train = x_train.shape[0]
indices = list(np.random.randint(m_train, size=64))

fig = plt.figure(figsize=(9,9))
columns = 8
rows = 8
for i in range(1, columns*rows +1):
    img = x_train[indices[i-1]].reshape(28,28)
    fig.add_subplot(rows, columns, i)
    
    #plt.title("Index {} Class {}".format(indices[i], y_train[indices[i]]))
    plt.axis('off')
    plt.imshow(img, cmap='gray', vmin=0, vmax=255)
plt.show()

Kết quả của đoạn code trên

 

Giống MNIST, các bộ dữ liệu khác được đọc lên một cách tương tự

  • Fashion-MNIST
# Install TensorFlow
import tensorflow as tf

# Load and prepare the MNIST dataset
data = tf.keras.datasets.fashion_mnist

(x_train, y_train), (x_test, y_test) = data.load_data()

m_train = x_train.shape[0]
print(x_train.shape)

 

  • CIFAR10 và CIFAR100
# Install TensorFlow
import tensorflow as tf

# Load and prepare the MNIST dataset; cifar10, cifar100
data = tf.keras.datasets.cifar100

(x_train, y_train), (x_test, y_test) = data.load_data()

m_train = x_train.shape[0]
print(x_train.shape)

 

  • House price

 

Xây dựng mô hình (model) trong Tensorflow

Tensorflow cung cấp một số hàm để xây dựng model một cách linh hoạt và dễ dàng. Trong bài này, chúng ta sẽ xây dựng model cho những bài toán đã học. Trước tiên, chúng ta học qua các hàm cần thiết để thực hiện việc xây dựng các model đơn giản

  • Hàm tf.keras.Sequential(): Đây là hàm khai báo việc tạo một model. Model được tạo có dạng liên tiếp, nghĩa là các lớp (layer) nối tiếp nhau. Hàm này nhận vào một list các layer.
  • Hàm tf.keras.layers.Dense(): Tạo layer Dense (fully connected layer) với tham số bao gồm số node, hàm activation. Layer đầu tiên khi đưa vào tf.keras.Sequential() cần khai báo shape của input đầu vào.

Ví dụ, chúng ta cần tạo model cho bài toán dự đoán doanh thu dùng linear regression. Dữ liệu dự đoán doanh thu gồm 3 đặc trưng là số tiền quảng cáo trên TV, Newspaper, và trên Radio. Do đó, model hình chúng ta cần xây dựng bao gồm

  • Input layer với 3 node cho 3 đặc trưng. Trong Tensorflow, node bias để được thêm vào model một cách tự động.
  • Output layer gồm 1 node

Source code Tensorflow để xây dựng model trên như sau

Ở đây, hàm Dense(1, input_shape=(3,)) khai báo số node trong layer là 1. Vì là layer đầu tiên, nên hàm Dense() khai báo shape của input đầu vào là 3.

Code trên dùng hàm summary() được xây dựng sẵn trong Tensorflow để in kiến trúc của model. Model có 4 tham số, chính là trọng số kết nối giữa 3 node đặc trựng và 1 node bias với node output. ‘None’ có ý nghĩa là giá trị chưa được xác định tại thời điểm hiện tại, và được gán trong quá trình chạy. Đây chính là giá trị batch size khi huấn luyện model.

 

Tương tự, chúng ta muốn xây dựng model cho bài toán house price dùng linear regression. Dữ liệu house price có 13 đặc trưng, nên có node ở input layer là 13. Source code Tensorflow để xây dựng model như sau

 

Xây dựng mô hình softmax regression and MLP trong Tensorflow

Giả sử chúng ta cần xây dựng mô hình softmax regression để cho bài toán phân loại hoa Iris dùng Tensorflow. Dữ liệu Iris có 4 đặc trưng và có 3 loài hoa. Do đó, số node ở input layer là 4 và số node ở output layer là 3. Khác với thiết kế cho mô hình linear regression, mô hình softmax regression cần dùng thêm hàm softmax để tính xác suất cho từng node output. Source code cho mô hình softmax regression như sau

Ở đây, chúng ta cần khai báo activation='softmax' trong hàm Dense() để tính softmax cho các node trong layer này.

 

Tiếp theo, chúng ta xây dựng mô hình MLP cho bài toán Iris. MLP cần xây dựng có 1 hidden layer chứa 50 node. Hàm activation dùng trong hidden layer là ReLU. Source code Tensorflow để xây dựng mô hình MLP như sau