Keras - การรวบรวมโมเดล
ก่อนหน้านี้เราได้ศึกษาพื้นฐานเกี่ยวกับวิธีการสร้างโมเดลโดยใช้ Sequential และ Functional API บทนี้จะอธิบายเกี่ยวกับวิธีการรวบรวมโมเดล การรวบรวมเป็นขั้นตอนสุดท้ายในการสร้างแบบจำลอง เมื่อรวบรวมเสร็จแล้วเราสามารถไปยังขั้นตอนการฝึกอบรมได้
ให้เราเรียนรู้แนวคิดบางประการที่จำเป็นเพื่อให้เข้าใจกระบวนการรวบรวมได้ดีขึ้น
การสูญเสีย
ในการเรียนรู้ของเครื่อง Lossฟังก์ชันใช้เพื่อค้นหาข้อผิดพลาดหรือความเบี่ยงเบนในกระบวนการเรียนรู้ Keras ต้องการฟังก์ชันการสูญเสียระหว่างกระบวนการคอมไพล์โมเดล
Keras มีฟังก์ชันการสูญเสียค่อนข้างน้อยในไฟล์ losses โมดูลและมีดังนี้ -
- 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
ฟังก์ชันการสูญเสียข้างต้นทั้งหมดยอมรับสองอาร์กิวเมนต์ -
y_true - ฉลากที่แท้จริงเป็นเทนเซอร์
y_pred - การทำนายที่มีรูปร่างเหมือนกัน y_true
นำเข้าโมดูลการสูญเสียก่อนใช้ฟังก์ชันการสูญเสียตามที่ระบุด้านล่าง -
from keras import losses
เครื่องมือเพิ่มประสิทธิภาพ
ในการเรียนรู้ของเครื่อง Optimizationเป็นกระบวนการสำคัญที่เพิ่มประสิทธิภาพน้ำหนักอินพุตโดยการเปรียบเทียบการคาดคะเนและฟังก์ชันการสูญเสีย Keras มีเครื่องมือเพิ่มประสิทธิภาพบางตัวเป็นโมดูลเครื่องมือเพิ่มประสิทธิภาพและมีดังนี้:
SGD - เครื่องมือเพิ่มประสิทธิภาพการไล่ระดับสีแบบสุ่ม
keras.optimizers.SGD(learning_rate = 0.01, momentum = 0.0, nesterov = False)
RMSprop - เครื่องมือเพิ่มประสิทธิภาพ RMSProp
keras.optimizers.RMSprop(learning_rate = 0.001, rho = 0.9)
Adagrad - เครื่องมือเพิ่มประสิทธิภาพ Adagrad
keras.optimizers.Adagrad(learning_rate = 0.01)
Adadelta - เครื่องมือเพิ่มประสิทธิภาพ Adadelta
keras.optimizers.Adadelta(learning_rate = 1.0, rho = 0.95)
Adam - เครื่องมือเพิ่มประสิทธิภาพ Adam
keras.optimizers.Adam(
learning_rate = 0.001, beta_1 = 0.9, beta_2 = 0.999, amsgrad = False
)
Adamax - เครื่องมือเพิ่มประสิทธิภาพ Adamax จาก Adam
keras.optimizers.Adamax(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)
Nadam - เครื่องมือเพิ่มประสิทธิภาพ Nesterov Adam
keras.optimizers.Nadam(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)
นำเข้าโมดูลเครื่องมือเพิ่มประสิทธิภาพก่อนใช้เครื่องมือเพิ่มประสิทธิภาพตามที่ระบุด้านล่าง -
from keras import optimizers
เมตริก
ในการเรียนรู้ของเครื่อง Metricsใช้ในการประเมินประสิทธิภาพของโมเดลของคุณ คล้ายกับฟังก์ชันการสูญเสีย แต่ไม่ได้ใช้ในกระบวนการฝึกอบรม Keras ให้เมตริกค่อนข้างน้อยเป็นโมดูลmetrics และมีดังต่อไปนี้
- accuracy
- binary_accuracy
- categorical_accuracy
- sparse_categorical_accuracy
- top_k_categorical_accuracy
- sparse_top_k_categorical_accuracy
- cosine_proximity
- clone_metric
เช่นเดียวกับฟังก์ชันการสูญเสียเมตริกยังยอมรับอาร์กิวเมนต์สองรายการด้านล่าง -
y_true - ฉลากที่แท้จริงเป็นเทนเซอร์
y_pred - การทำนายที่มีรูปร่างเหมือนกัน y_true
นำเข้าโมดูลเมตริกก่อนใช้เมตริกตามที่ระบุด้านล่าง -
from keras import metrics
รวบรวมโมเดล
Keras model มีวิธีการ compile()เพื่อรวบรวมโมเดล อาร์กิวเมนต์และค่าเริ่มต้นของcompile() วิธีการมีดังนี้
compile(
optimizer,
loss = None,
metrics = None,
loss_weights = None,
sample_weight_mode = None,
weighted_metrics = None,
target_tensors = None
)
ข้อโต้แย้งที่สำคัญมีดังนี้ -
- ฟังก์ชั่นการสูญเสีย
- Optimizer
- metrics
โค้ดตัวอย่างในการคอมไพล์โหมดมีดังนี้ -
from keras import losses
from keras import optimizers
from keras import metrics
model.compile(loss = 'mean_squared_error',
optimizer = 'sgd', metrics = [metrics.categorical_accuracy])
ที่ไหน
ฟังก์ชั่นการสูญเสียถูกตั้งค่าเป็น mean_squared_error
เครื่องมือเพิ่มประสิทธิภาพถูกตั้งค่าเป็น sgd
เมตริกถูกตั้งค่าเป็น metrics.categorical_accuracy
การฝึกโมเดล
โมเดลได้รับการฝึกฝนโดยอาร์เรย์ NumPy โดยใช้ไฟล์ fit(). จุดประสงค์หลักของฟังก์ชัน Fit นี้ใช้เพื่อประเมินโมเดลของคุณในการฝึกซ้อม นอกจากนี้ยังสามารถใช้สำหรับประสิทธิภาพของโมเดลกราฟ มีไวยากรณ์ต่อไปนี้ -
model.fit(X, y, epochs = , batch_size = )
ที่นี่
X, y - เป็นทูเพิลในการประเมินข้อมูลของคุณ
epochs - ไม่จำเป็นต้องประเมินโมเดลในระหว่างการฝึกอบรม
batch_size - อินสแตนซ์การฝึกอบรม
ให้เรายกตัวอย่างง่ายๆของข้อมูลสุ่มจำนวนมากเพื่อใช้แนวคิดนี้
สร้างข้อมูล
ให้เราสร้างข้อมูลแบบสุ่มโดยใช้ numpy สำหรับ x และ y ด้วยความช่วยเหลือของคำสั่งที่กล่าวถึงด้านล่าง -
import numpy as np
x_train = np.random.random((100,4,8))
y_train = np.random.random((100,10))
ตอนนี้สร้างข้อมูลการตรวจสอบแบบสุ่ม
x_val = np.random.random((100,4,8))
y_val = np.random.random((100,10))
สร้างแบบจำลอง
ให้เราสร้างแบบจำลองลำดับอย่างง่าย -
from keras.models import Sequential model = Sequential()
เพิ่มเลเยอร์
สร้างเลเยอร์เพื่อเพิ่มโมเดล -
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'))
รวบรวมโมเดล
ตอนนี้มีการกำหนดโมเดลแล้ว คุณสามารถรวบรวมโดยใช้คำสั่งด้านล่าง -
model.compile(
loss = 'categorical_crossentropy', optimizer = 'sgd', metrics = ['accuracy']
)
ใช้พอดี ()
ตอนนี้เราใช้ฟังก์ชันfit ()เพื่อฝึกอบรมข้อมูลของเรา -
model.fit(x_train, y_train, batch_size = 32, epochs = 5, validation_data = (x_val, y_val))
สร้าง Multi-Layer Perceptron ANN
เราได้เรียนรู้การสร้างรวบรวมและฝึกโมเดล Keras
ให้เราใช้การเรียนรู้ของเราและสร้าง ANN ตาม MPL อย่างง่าย
โมดูลชุดข้อมูล
ก่อนสร้างแบบจำลองเราต้องเลือกปัญหาต้องรวบรวมข้อมูลที่ต้องการและแปลงข้อมูลเป็นอาร์เรย์ NumPy เมื่อรวบรวมข้อมูลแล้วเราสามารถเตรียมแบบจำลองและฝึกอบรมโดยใช้ข้อมูลที่รวบรวมได้ การรวบรวมข้อมูลเป็นหนึ่งในขั้นตอนที่ยากที่สุดของการเรียนรู้ของเครื่อง Keras มีโมดูลพิเศษชุดข้อมูลสำหรับดาวน์โหลดข้อมูลการเรียนรู้ของเครื่องออนไลน์เพื่อวัตถุประสงค์ในการฝึกอบรม ดึงข้อมูลจากเซิร์ฟเวอร์ออนไลน์ประมวลผลข้อมูลและส่งคืนข้อมูลเป็นการฝึกอบรมและชุดทดสอบ ให้เราตรวจสอบข้อมูลที่มาจากโมดูลชุดข้อมูล Keras ข้อมูลที่มีอยู่ในโมดูลมีดังนี้
- การจำแนกภาพขนาดเล็ก CIFAR10
- การจำแนกภาพขนาดเล็ก CIFAR100
- IMDB Movie บทวิจารณ์การจำแนกประเภทความรู้สึก
- การจำแนกหัวข้อของ Reuters newswire
- ฐานข้อมูล MNIST ของตัวเลขที่เขียนด้วยลายมือ
- ฐานข้อมูล Fashion-MNIST ของบทความแฟชั่น
- ชุดข้อมูลการถดถอยราคาที่อยู่อาศัยในบอสตัน
ให้เราใช้ไฟล์ MNIST database of handwritten digits(หรือ minst) เป็นข้อมูลเข้าของเรา minst คือคอลเล็กชันภาพสีเทาขนาด 60,000, 28x28 ภาพ ประกอบด้วยตัวเลข 10 หลัก นอกจากนี้ยังมีภาพทดสอบ 10,000 ภาพ
โค้ดด้านล่างนี้สามารถใช้เพื่อโหลดชุดข้อมูล -
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
ที่ไหน
Line 1 การนำเข้า minst จากโมดูลชุดข้อมูล keras
Line 3 เรียกไฟล์ load_data ซึ่งจะดึงข้อมูลจากเซิร์ฟเวอร์ออนไลน์และส่งคืนข้อมูลเป็น 2 tuples, First tuple, (x_train, y_train) แสดงข้อมูลการฝึกอบรมด้วยรูปร่าง (number_sample, 28, 28) และฉลากหลักที่มีรูปร่าง (number_samples, ). ทูเพิลที่สอง(x_test, y_test) แสดงข้อมูลการทดสอบที่มีรูปร่างเดียวกัน
นอกจากนี้ยังสามารถดึงชุดข้อมูลอื่น ๆ โดยใช้ API ที่คล้ายกันได้และทุก API จะส่งคืนข้อมูลที่คล้ายกันเช่นกันยกเว้นรูปร่างของข้อมูล รูปร่างของข้อมูลขึ้นอยู่กับชนิดของข้อมูล
สร้างแบบจำลอง
ให้เราเลือก Perceptron แบบหลายชั้นอย่างง่าย (MLP) ตามที่แสดงด้านล่างและพยายามสร้างแบบจำลองโดยใช้ Keras
คุณสมบัติหลักของรุ่นมีดังนี้ -
ชั้นอินพุตประกอบด้วย 784 ค่า (28 x 28 = 784)
ชั้นแรกที่ซ่อนอยู่ Dense ประกอบด้วยเซลล์ประสาท 512 เซลล์และฟังก์ชันการกระตุ้น 'relu'
ชั้นที่สองที่ซ่อนอยู่ Dropout มี 0.2 เป็นค่าของมัน
ชั้นที่สามที่ซ่อนอยู่อีกครั้ง Dense ประกอบด้วย 512 เซลล์ประสาทและฟังก์ชันการกระตุ้น 'relu'
ชั้นที่สี่ที่ซ่อนอยู่ Dropout มี 0.2 เป็นค่าของมัน
ชั้นที่ห้าและสุดท้ายประกอบด้วยเซลล์ประสาท 10 เซลล์และฟังก์ชันกระตุ้น 'ซอฟต์แม็กซ์'
ใช้ categorical_crossentropy เป็นฟังก์ชันการสูญเสีย
ใช้ RMSprop() เป็นเครื่องมือเพิ่มประสิทธิภาพ
ใช้ accuracy เป็นเมตริก
ใช้ 128 เป็นขนาดแบทช์
ใช้ 20 เป็นยุค
Step 1 − Import the modules
ให้เรานำเข้าโมดูลที่จำเป็น
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
ให้เรานำเข้าชุดข้อมูล mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
Step 3 − Process the 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)
ที่ไหน
reshape ใช้เพื่อปรับรูปแบบอินพุตจาก (28, 28) ทูเพิลเป็น (784,)
to_categorical ใช้ในการแปลงเวกเตอร์เป็นเมทริกซ์ไบนารี
Step 4 − Create the model
ให้เราสร้างแบบจำลองจริง
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
ให้เรารวบรวมโมเดลโดยใช้ฟังก์ชันการสูญเสียเครื่องมือเพิ่มประสิทธิภาพและเมตริกที่เลือก
model.compile(loss = 'categorical_crossentropy',
optimizer = RMSprop(),
metrics = ['accuracy'])
Step 6 − Train the model
ให้เราฝึกโมเดลโดยใช้ fit() วิธี.
history = model.fit(
x_train, y_train,
batch_size = 128,
epochs = 20,
verbose = 1,
validation_data = (x_test, y_test)
)
ความคิดสุดท้าย
เราได้สร้างโมเดลโหลดข้อมูลและฝึกฝนข้อมูลให้กับโมเดลด้วย เรายังคงต้องประเมินโมเดลและคาดการณ์ผลลัพธ์สำหรับอินพุตที่ไม่รู้จักซึ่งเราจะเรียนรู้ในบทต่อไป
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))
การดำเนินการแอปพลิเคชันจะให้เนื้อหาด้านล่างเป็นผลลัพธ์ -
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