Keras - Tổng hợp mô hình

Trước đây, chúng ta đã nghiên cứu những kiến ​​thức cơ bản về cách tạo mô hình bằng cách sử dụng API tuần tự và hàm. Chương này giải thích về cách biên dịch mô hình. Biên dịch là bước cuối cùng trong việc tạo một mô hình. Sau khi biên dịch xong, chúng ta có thể chuyển sang giai đoạn đào tạo.

Chúng ta hãy tìm hiểu một số khái niệm cần thiết để hiểu rõ hơn về quá trình biên dịch.

Thua

Trong học máy, Losshàm được sử dụng để tìm lỗi hoặc sai lệch trong quá trình học. Keras yêu cầu hàm mất trong quá trình biên dịch mô hình.

Keras cung cấp khá nhiều hàm mất mát trong losses mô-đun và chúng như sau:

  • mean_squared_error
  • mean_absolute_error
  • mean_absolute_percentage_error
  • mean_squared_logarithmic_error
  • squared_hinge
  • hinge
  • categorical_hinge
  • logcosh
  • huber_loss
  • categorical_crossentropy
  • sparse_categorical_crossentropy
  • binary_crossentropy
  • kullback_leibler_divergence
  • poisson
  • cosine_proximity
  • is_categorical_crossentropy

Tất cả hàm mất mát ở trên chấp nhận hai đối số:

  • y_true - nhãn thực như tenxơ

  • y_pred - dự đoán với hình dạng giống như y_true

Nhập mô-đun tổn thất trước khi sử dụng chức năng tổn thất như được chỉ định bên dưới -

from keras import losses

Trình tối ưu hóa

Trong học máy, Optimizationlà một quá trình quan trọng để tối ưu hóa trọng số đầu vào bằng cách so sánh dự đoán và hàm mất mát. Keras cung cấp khá nhiều trình tối ưu hóa dưới dạng mô-đun, các trình tối ưu hóa và chúng như sau:

SGD - Trình tối ưu hóa dốc xuống dốc ngẫu nhiên.

keras.optimizers.SGD(learning_rate = 0.01, momentum = 0.0, nesterov = False)

RMSprop - Trình tối ưu hóa RMSProp.

keras.optimizers.RMSprop(learning_rate = 0.001, rho = 0.9)

Adagrad - Trình tối ưu hóa Adagrad.

keras.optimizers.Adagrad(learning_rate = 0.01)

Adadelta - Trình tối ưu hóa Adadelta.

keras.optimizers.Adadelta(learning_rate = 1.0, rho = 0.95)

Adam - Trình tối ưu hóa Adam.

keras.optimizers.Adam(
   learning_rate = 0.001, beta_1 = 0.9, beta_2 = 0.999, amsgrad = False
)

Adamax - Trình tối ưu hóa Adamax từ Adam.

keras.optimizers.Adamax(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)

Nadam - Trình tối ưu hóa Nesterov Adam.

keras.optimizers.Nadam(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)

Nhập mô-đun trình tối ưu hóa trước khi sử dụng trình tối ưu hóa như được chỉ định bên dưới -

from keras import optimizers

Số liệu

Trong học máy, Metricsđược sử dụng để đánh giá hiệu suất của mô hình của bạn. Nó tương tự như hàm mất mát, nhưng không được sử dụng trong quá trình đào tạo. Keras cung cấp khá nhiều chỉ số dưới dạng mô-đun,metrics và chúng như sau

  • accuracy
  • binary_accuracy
  • categorical_accuracy
  • sparse_categorical_accuracy
  • top_k_categorical_accuracy
  • sparse_top_k_categorical_accuracy
  • cosine_proximity
  • clone_metric

Tương tự như hàm mất mát, các số liệu cũng chấp nhận hai đối số dưới đây:

  • y_true - nhãn thực như tenxơ

  • y_pred - dự đoán với hình dạng giống như y_true

Nhập mô-đun số liệu trước khi sử dụng các số liệu như được chỉ định bên dưới -

from keras import metrics

Biên dịch mô hình

Mô hình Keras cung cấp một phương pháp, compile()để biên dịch mô hình. Đối số và giá trị mặc định củacompile() phương pháp như sau

compile(
   optimizer, 
   loss = None, 
   metrics = None, 
   loss_weights = None, 
   sample_weight_mode = None, 
   weighted_metrics = None, 
   target_tensors = None
)

Các đối số quan trọng như sau:

  • thiếu chức năng
  • Optimizer
  • metrics

Một mã mẫu để biên dịch chế độ như sau:

from keras import losses 
from keras import optimizers 
from keras import metrics 

model.compile(loss = 'mean_squared_error',  
   optimizer = 'sgd', metrics = [metrics.categorical_accuracy])

Ở đâu,

  • hàm mất mát được đặt là mean_squared_error

  • trình tối ưu hóa được đặt là sgd

  • số liệu được đặt là metrics.categorical_accuracy

Đào tạo người mẫu

Các mô hình được đào tạo bởi mảng NumPy bằng cách sử dụng fit(). Mục đích chính của chức năng phù hợp này được sử dụng để đánh giá mô hình của bạn khi đào tạo. Điều này cũng có thể được sử dụng để vẽ đồ thị hiệu suất mô hình. Nó có cú pháp sau:

model.fit(X, y, epochs = , batch_size = )

Đây,

  • X, y - Nó là một bộ để đánh giá dữ liệu của bạn.

  • epochs - không cần đánh giá mô hình trong quá trình đào tạo.

  • batch_size - các trường hợp đào tạo.

Chúng ta hãy lấy một ví dụ đơn giản về dữ liệu ngẫu nhiên numpy để sử dụng khái niệm này.

Tạo dữ liệu

Hãy để chúng tôi tạo một dữ liệu ngẫu nhiên bằng cách sử dụng numpy cho x và y với sự trợ giúp của lệnh được đề cập bên dưới:

import numpy as np 

x_train = np.random.random((100,4,8)) 
y_train = np.random.random((100,10))

Bây giờ, hãy tạo dữ liệu xác thực ngẫu nhiên,

x_val = np.random.random((100,4,8)) 
y_val = np.random.random((100,10))

Tạo mô hình

Hãy để chúng tôi tạo mô hình tuần tự đơn giản -

from keras.models import Sequential model = Sequential()

Thêm lớp

Tạo các lớp để thêm mô hình -

from keras.layers import LSTM, Dense 

# add a sequence of vectors of dimension 16 
model.add(LSTM(16, return_sequences = True)) 
model.add(Dense(10, activation = 'softmax'))

biên dịch mô hình

Bây giờ mô hình được xác định. Bạn có thể biên dịch bằng lệnh dưới đây:

model.compile(
   loss = 'categorical_crossentropy', optimizer = 'sgd', metrics = ['accuracy']
)

Áp dụng phù hợp ()

Bây giờ chúng tôi áp dụng hàm fit () để đào tạo dữ liệu của chúng tôi -

model.fit(x_train, y_train, batch_size = 32, epochs = 5, validation_data = (x_val, y_val))

Tạo ANN Perceptron nhiều lớp

Chúng tôi đã học cách tạo, biên dịch và đào tạo các mô hình Keras.

Hãy để chúng tôi áp dụng cách học của mình và tạo ANN dựa trên MPL đơn giản.

Mô-đun tập dữ liệu

Trước khi tạo mô hình, chúng ta cần chọn một vấn đề, cần thu thập dữ liệu cần thiết và chuyển dữ liệu sang mảng NumPy. Sau khi dữ liệu được thu thập, chúng tôi có thể chuẩn bị và đào tạo mô hình bằng cách sử dụng dữ liệu thu thập được. Thu thập dữ liệu là một trong những giai đoạn khó khăn nhất của học máy. Keras cung cấp một mô-đun đặc biệt, bộ dữ liệu để tải xuống dữ liệu máy học trực tuyến cho mục đích đào tạo. Nó lấy dữ liệu từ máy chủ trực tuyến, xử lý dữ liệu và trả về dữ liệu dưới dạng tập huấn luyện và kiểm tra. Hãy để chúng tôi kiểm tra dữ liệu được cung cấp bởi mô-đun tập dữ liệu Keras. Dữ liệu có sẵn trong mô-đun như sau,

  • Phân loại hình ảnh nhỏ CIFAR10
  • Phân loại hình ảnh nhỏ CIFAR100
  • IMDB Phim đánh giá phân loại tình cảm
  • Phân loại các chủ đề của dây tin Reuters
  • Cơ sở dữ liệu MNIST của các chữ số viết tay
  • Cơ sở dữ liệu thời trang của MNIST về các bài báo thời trang
  • Tập dữ liệu hồi quy giá nhà ở Boston

Hãy để chúng tôi sử dụng MNIST database of handwritten digits(hoặc minst) làm đầu vào của chúng tôi. minst là một bộ sưu tập các hình ảnh màu xám 60.000, 28x28. Nó chứa 10 chữ số. Nó cũng chứa 10.000 hình ảnh thử nghiệm.

Mã dưới đây có thể được sử dụng để tải tập dữ liệu -

from keras.datasets import mnist 

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

Ở đâu

  • Line 1 nhập khẩu minst từ mô-đun tập dữ liệu keras.

  • Line 3 gọi cho load_data chức năng này sẽ tìm nạp dữ liệu từ máy chủ trực tuyến và trả về dữ liệu dưới dạng 2 bộ, Bộ đầu tiên, (x_train, y_train) biểu diễn dữ liệu đào tạo bằng hình dạng, (number_sample, 28, 28) và nhãn chữ số của nó có hình dạng, (number_samples, ). Tuple thứ hai,(x_test, y_test) biểu diễn dữ liệu thử nghiệm có cùng hình dạng.

Tập dữ liệu khác cũng có thể được tìm nạp bằng cách sử dụng API tương tự và mọi API cũng trả về dữ liệu tương tự ngoại trừ hình dạng của dữ liệu. Hình dạng của dữ liệu phụ thuộc vào loại dữ liệu.

Tạo một mô hình

Hãy để chúng tôi chọn perceptron nhiều lớp đơn giản (MLP) như được trình bày bên dưới và cố gắng tạo mô hình bằng Keras.

Các tính năng cốt lõi của mô hình như sau:

  • Lớp đầu vào bao gồm 784 giá trị (28 x 28 = 784).

  • Lớp ẩn đầu tiên, Dense bao gồm 512 tế bào thần kinh và chức năng kích hoạt 'relu'.

  • Lớp ẩn thứ hai, Dropout có 0,2 là giá trị của nó.

  • Lớp ẩn thứ ba, một lần nữa là Dense bao gồm 512 tế bào thần kinh và chức năng kích hoạt 'relu'.

  • Lớp ẩn thứ tư, Dropout có 0,2 là giá trị của nó.

  • Lớp thứ năm và cuối cùng bao gồm 10 tế bào thần kinh và chức năng kích hoạt 'softmax'.

  • Sử dụng categorical_crossentropy như hàm mất mát.

  • Sử dụng RMSprop() làm Trình tối ưu hóa.

  • Sử dụng accuracy dưới dạng số liệu.

  • Sử dụng 128 làm kích thước lô.

  • Sử dụng 20 làm kỷ nguyên.

Step 1 − Import the modules

Hãy để chúng tôi nhập các mô-đun cần thiết.

import keras 
from keras.datasets import mnist 
from keras.models import Sequential 
from keras.layers import Dense, Dropout 
from keras.optimizers import RMSprop 
import numpy as np

Step 2 − Load data

Hãy để chúng tôi nhập tập dữ liệu mnist.

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

Step 3 − Process the data

Hãy để chúng tôi thay đổi tập dữ liệu theo mô hình của chúng tôi để nó có thể được đưa vào mô hình của chúng tôi.

x_train = x_train.reshape(60000, 784) 
x_test = x_test.reshape(10000, 784) 
x_train = x_train.astype('float32') 
x_test = x_test.astype('float32') 
x_train /= 255 
x_test /= 255 

y_train = keras.utils.to_categorical(y_train, 10) 
y_test = keras.utils.to_categorical(y_test, 10)

Ở đâu

  • reshape được sử dụng để định hình lại đầu vào từ (28, 28) tuple thành (784,)

  • to_categorical được sử dụng để chuyển đổi vectơ sang ma trận nhị phân

Step 4 − Create the model

Hãy để chúng tôi tạo ra mô hình thực tế.

model = Sequential() 
model.add(Dense(512, activation = 'relu', input_shape = (784,))) 
model.add(Dropout(0.2)) 
model.add(Dense(512, activation = 'relu'))
model.add(Dropout(0.2)) 
model.add(Dense(10, activation = 'softmax'))

Step 5 − Compile the model

Hãy để chúng tôi biên dịch mô hình bằng cách sử dụng chức năng mất mát, trình tối ưu hóa và số liệu đã chọn.

model.compile(loss = 'categorical_crossentropy',     
   optimizer = RMSprop(), 
   metrics = ['accuracy'])

Step 6 − Train the model

Hãy để chúng tôi đào tạo mô hình bằng cách sử dụng fit() phương pháp.

history = model.fit(
   x_train, y_train, 
   batch_size = 128, 
   epochs = 20, 
   verbose = 1, 
   validation_data = (x_test, y_test)
)

Suy nghĩ cuối cùng

Chúng tôi đã tạo mô hình, tải dữ liệu và cũng đã huấn luyện dữ liệu cho mô hình. Chúng ta vẫn cần đánh giá mô hình và dự đoán đầu ra cho đầu vào chưa biết, chúng ta sẽ học trong chương sắp tới.

import keras 
from keras.datasets import mnist 
from keras.models import Sequential 
from keras.layers import Dense, Dropout 
from keras.optimizers import RMSprop 
import numpy as np 

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

x_train = x_train.reshape(60000, 784) 
x_test = x_test.reshape(10000, 784) 
x_train = x_train.astype('float32') 
x_test = x_test.astype('float32') 
x_train /= 255 
x_test /= 255 

y_train = keras.utils.to_categorical(y_train, 10) 
y_test = keras.utils.to_categorical(y_test, 10) 

model = Sequential() 
model.add(Dense(512, activation='relu', input_shape = (784,))) 
model.add(Dropout(0.2)) 
model.add(Dense(512, activation = 'relu')) model.add(Dropout(0.2)) 
model.add(Dense(10, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy', 
   optimizer = RMSprop(), 
   metrics = ['accuracy']) 

history = model.fit(x_train, y_train, 
   batch_size = 128, epochs = 20, verbose = 1, validation_data = (x_test, y_test))

Việc thực thi ứng dụng sẽ đưa ra nội dung bên dưới dưới dạng đầu ra:

Train on 60000 samples, validate on 10000 samples Epoch 1/20 
60000/60000 [==============================] - 7s 118us/step - loss: 0.2453 
- acc: 0.9236 - val_loss: 0.1004 - val_acc: 0.9675 Epoch 2/20 
60000/60000 [==============================] - 7s 110us/step - loss: 0.1023 
- acc: 0.9693 - val_loss: 0.0797 - val_acc: 0.9761 Epoch 3/20 
60000/60000 [==============================] - 7s 110us/step - loss: 0.0744 
- acc: 0.9770 - val_loss: 0.0727 - val_acc: 0.9791 Epoch 4/20 
60000/60000 [==============================] - 7s 110us/step - loss: 0.0599 
- acc: 0.9823 - val_loss: 0.0704 - val_acc: 0.9801 Epoch 5/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0504 
- acc: 0.9853 - val_loss: 0.0714 - val_acc: 0.9817 Epoch 6/20 
60000/60000 [==============================] - 7s 111us/step - loss: 0.0438 
- acc: 0.9868 - val_loss: 0.0845 - val_acc: 0.9809 Epoch 7/20 
60000/60000 [==============================] - 7s 114us/step - loss: 0.0391 
- acc: 0.9887 - val_loss: 0.0823 - val_acc: 0.9802 Epoch 8/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0364 
- acc: 0.9892 - val_loss: 0.0818 - val_acc: 0.9830 Epoch 9/20 
60000/60000 [==============================] - 7s 113us/step - loss: 0.0308 
- acc: 0.9905 - val_loss: 0.0833 - val_acc: 0.9829 Epoch 10/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0289 
- acc: 0.9917 - val_loss: 0.0947 - val_acc: 0.9815 Epoch 11/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0279 
- acc: 0.9921 - val_loss: 0.0818 - val_acc: 0.9831 Epoch 12/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0260 
- acc: 0.9927 - val_loss: 0.0945 - val_acc: 0.9819 Epoch 13/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0257 
- acc: 0.9931 - val_loss: 0.0952 - val_acc: 0.9836 Epoch 14/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0229 
- acc: 0.9937 - val_loss: 0.0924 - val_acc: 0.9832 Epoch 15/20 
60000/60000 [==============================] - 7s 115us/step - loss: 0.0235 
- acc: 0.9937 - val_loss: 0.1004 - val_acc: 0.9823 Epoch 16/20 
60000/60000 [==============================] - 7s 113us/step - loss: 0.0214 
- acc: 0.9941 - val_loss: 0.0991 - val_acc: 0.9847 Epoch 17/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0219 
- acc: 0.9943 - val_loss: 0.1044 - val_acc: 0.9837 Epoch 18/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0190 
- acc: 0.9952 - val_loss: 0.1129 - val_acc: 0.9836 Epoch 19/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0197 
- acc: 0.9953 - val_loss: 0.0981 - val_acc: 0.9841 Epoch 20/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0198 
- acc: 0.9950 - val_loss: 0.1215 - val_acc: 0.9828