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