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