CNTK - การสร้างเครือข่ายประสาทเทียมครั้งแรก
บทนี้จะอธิบายรายละเอียดเกี่ยวกับการสร้างเครือข่ายประสาทเทียมใน CNTK
สร้างโครงสร้างเครือข่าย
เพื่อที่จะใช้แนวคิด CNTK ในการสร้าง NN แรกของเราเราจะใช้ NN เพื่อจำแนกชนิดของดอกไอริสตามคุณสมบัติทางกายภาพของความกว้างและความยาวกลีบเลี้ยงและความกว้างและความยาวของกลีบดอก ชุดข้อมูลที่เราจะใช้ชุดข้อมูลไอริสที่อธิบายคุณสมบัติทางกายภาพของดอกไอริสพันธุ์ต่างๆ -
- ความยาวกลีบเลี้ยง
- ความกว้างของกลีบเลี้ยง
- ความยาวกลีบดอก
- ความกว้างของกลีบดอก
- ระดับ ได้แก่ iris setosa หรือ iris versicolor หรือ iris virginica
ที่นี่เราจะสร้าง NN ปกติที่เรียกว่า NN feedforward ให้เราดูขั้นตอนการใช้งานเพื่อสร้างโครงสร้างของ NN -
Step 1 - ขั้นแรกเราจะนำเข้าส่วนประกอบที่จำเป็นเช่นประเภทเลเยอร์ของเราฟังก์ชันการเปิดใช้งานและฟังก์ชันที่ช่วยให้เรากำหนดตัวแปรอินพุตสำหรับ NN ของเราจากไลบรารี CNTK
from cntk import default_options, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import log_softmax, relu
Step 2- หลังจากนั้นเราจะสร้างโมเดลของเราโดยใช้ฟังก์ชันลำดับ เมื่อสร้างแล้วเราจะป้อนด้วยเลเยอร์ที่เราต้องการ ที่นี่เราจะสร้างเลเยอร์ที่แตกต่างกันสองชั้นใน NN ของเรา หนึ่งเซลล์มีสี่เซลล์และอีกเซลล์หนึ่งมีเซลล์ประสาทสามเซลล์
model = Sequential([Dense(4, activation=relu), Dense(3, activation=log_sogtmax)])
Step 3- ในที่สุดเพื่อรวบรวม NN เราจะผูกเครือข่ายกับตัวแปรอินพุต มีชั้นอินพุตที่มีเซลล์ประสาทสี่เซลล์และชั้นเอาต์พุตที่มีเซลล์ประสาทสามเซลล์
feature= input_variable(4)
z = model(feature)
การใช้ฟังก์ชันการเปิดใช้งาน
มีฟังก์ชั่นการเปิดใช้งานมากมายให้เลือกและการเลือกฟังก์ชั่นการเปิดใช้งานที่เหมาะสมจะสร้างความแตกต่างอย่างมากว่าโมเดลการเรียนรู้เชิงลึกของเราจะทำงานได้ดีเพียงใด
ที่เลเยอร์เอาต์พุต
การเลือกไฟล์ activation ฟังก์ชันที่เลเยอร์เอาต์พุตจะขึ้นอยู่กับประเภทของปัญหาที่เราจะแก้ไขด้วยโมเดลของเรา
สำหรับปัญหาการถดถอยเราควรใช้ไฟล์ linear activation function บนเลเยอร์เอาต์พุต
สำหรับปัญหาการจัดประเภทไบนารีเราควรใช้ไฟล์ sigmoid activation function บนเลเยอร์เอาต์พุต
สำหรับปัญหาการจำแนกหลายชั้นเราควรใช้ไฟล์ softmax activation function บนเลเยอร์เอาต์พุต
ที่นี่เราจะสร้างแบบจำลองสำหรับทำนายหนึ่งในสามคลาส หมายความว่าเราจำเป็นต้องใช้softmax activation function ที่ชั้นเอาต์พุต
ที่เลเยอร์ที่ซ่อนอยู่
การเลือกไฟล์ activation ฟังก์ชันที่เลเยอร์ที่ซ่อนอยู่จำเป็นต้องมีการทดลองบางอย่างเพื่อตรวจสอบประสิทธิภาพเพื่อดูว่าฟังก์ชันการเปิดใช้งานใดทำงานได้ดี
ในปัญหาการจำแนกประเภทเราจำเป็นต้องคาดการณ์ความน่าจะเป็นที่ตัวอย่างเป็นของคลาสเฉพาะ นั่นเป็นเหตุผลที่เราต้องการไฟล์activation functionที่ทำให้เรามีค่าความน่าจะเป็น เพื่อบรรลุเป้าหมายนี้sigmoid activation function สามารถช่วยเราได้
ปัญหาสำคัญอย่างหนึ่งที่เกี่ยวข้องกับฟังก์ชัน sigmoid คือการหายไปจากปัญหาการไล่ระดับสี เพื่อเอาชนะปัญหาดังกล่าวเราสามารถใช้ReLU activation function ซึ่งครอบคลุมค่าลบทั้งหมดเป็นศูนย์และทำงานเป็นตัวกรองแบบพาสทรูสำหรับค่าบวก
เลือกฟังก์ชั่นการสูญเสีย
เมื่อเรามีโครงสร้างสำหรับโมเดล NN ของเราแล้วเราต้องปรับให้เหมาะสม สำหรับการเพิ่มประสิทธิภาพเราจำเป็นต้องมีloss function. ไม่เหมือนactivation functionsเรามีฟังก์ชันการสูญเสียน้อยมากให้เลือก อย่างไรก็ตามการเลือกฟังก์ชันการสูญเสียจะขึ้นอยู่กับประเภทของปัญหาที่เรากำลังจะแก้ไขด้วยแบบจำลองของเรา
ตัวอย่างเช่นในปัญหาการจำแนกประเภทเราควรใช้ฟังก์ชันการสูญเสียที่สามารถวัดความแตกต่างระหว่างคลาสที่คาดคะเนและคลาสจริง
ฟังก์ชั่นการสูญเสีย
สำหรับปัญหาการจำแนกประเภทเราจะแก้ปัญหาด้วยโมเดล NN ของเรา categorical cross entropyฟังก์ชันการสูญเสียเป็นตัวเลือกที่ดีที่สุด ใน CNTK จะดำเนินการเป็นไฟล์cross_entropy_with_softmax ซึ่งสามารถนำเข้าจาก cntk.losses แพคเกจดังต่อไปนี้
label= input_variable(3)
loss = cross_entropy_with_softmax(z, label)
เมตริก
ด้วยการมีโครงสร้างสำหรับโมเดล NN ของเราและฟังก์ชันการสูญเสียที่จะนำไปใช้เราจึงมีส่วนผสมทั้งหมดเพื่อเริ่มสร้างสูตรสำหรับการปรับโมเดลการเรียนรู้เชิงลึกของเราให้เหมาะสมที่สุด แต่ก่อนที่จะเจาะลึกเรื่องนี้เราควรเรียนรู้เกี่ยวกับเมตริก
cntk.metrics
CNTK มีชื่อแพคเกจ cntk.metricsซึ่งเราสามารถนำเข้าเมตริกที่เรากำลังจะใช้ ในขณะที่เรากำลังสร้างแบบจำลองการจำแนกประเภทเราจะใช้classification_error เมทริกที่จะสร้างตัวเลขระหว่าง 0 ถึง 1 จำนวนระหว่าง 0 ถึง 1 แสดงเปอร์เซ็นต์ของตัวอย่างที่ทำนายได้อย่างถูกต้อง -
ขั้นแรกเราต้องนำเข้าเมตริกจาก cntk.metrics แพ็คเกจ -
from cntk.metrics import classification_error
error_rate = classification_error(z, label)
ฟังก์ชันข้างต้นต้องการเอาต์พุตของ NN และเลเบลที่คาดไว้เป็นอินพุต