AI กับ Python - Neural Networks

เครือข่ายประสาทเทียมเป็นอุปกรณ์คอมพิวเตอร์แบบขนานที่พยายามสร้างแบบจำลองคอมพิวเตอร์ของสมอง วัตถุประสงค์หลักเบื้องหลังคือการพัฒนาระบบเพื่อทำงานด้านการคำนวณต่างๆได้เร็วกว่าระบบแบบเดิม งานเหล่านี้รวมถึงการจดจำรูปแบบและการจำแนกประเภทการประมาณค่าการเพิ่มประสิทธิภาพและการจัดกลุ่มข้อมูล

โครงข่ายประสาทเทียมคืออะไร (ANN)

โครงข่ายประสาทเทียม (ANN) เป็นระบบคอมพิวเตอร์ที่มีประสิทธิภาพซึ่งมีธีมหลักที่ยืมมาจากการเปรียบเทียบเครือข่ายประสาททางชีววิทยา ANN ยังมีชื่อเป็นระบบประสาทเทียมระบบประมวลผลแบบกระจายขนานและระบบ Connectionist ANN ได้รับชุดอุปกรณ์จำนวนมากที่เชื่อมต่อกันในบางรูปแบบเพื่อให้สามารถสื่อสารระหว่างกันได้ หน่วยเหล่านี้เรียกอีกอย่างว่าnodes หรือ neuronsเป็นโปรเซสเซอร์อย่างง่ายที่ทำงานแบบขนาน

เซลล์ประสาททุกเซลล์เชื่อมต่อกับเซลล์ประสาทอื่น ๆ ผ่านทาง connection link. ลิงค์เชื่อมต่อแต่ละลิงค์เกี่ยวข้องกับน้ำหนักที่มีข้อมูลเกี่ยวกับสัญญาณอินพุต นี่เป็นข้อมูลที่มีประโยชน์ที่สุดสำหรับเซลล์ประสาทในการแก้ปัญหาโดยเฉพาะเนื่องจากweightโดยปกติจะกระตุ้นหรือยับยั้งสัญญาณที่กำลังสื่อสาร เซลล์ประสาทแต่ละเซลล์มีสถานะภายในซึ่งเรียกว่าactivation signal. สัญญาณเอาท์พุตซึ่งเกิดขึ้นหลังจากรวมสัญญาณอินพุตและกฎการเปิดใช้งานอาจถูกส่งไปยังหน่วยอื่น

หากคุณต้องการที่จะศึกษาเครือข่ายประสาทในรายละเอียดแล้วคุณสามารถทำตามลิงค์ - โครงข่ายประสาทเทียม

การติดตั้งแพ็คเกจที่เป็นประโยชน์

สำหรับการสร้างเครือข่ายประสาทเทียมใน Python เราสามารถใช้แพ็คเกจที่มีประสิทธิภาพสำหรับเครือข่ายประสาทที่เรียกว่า NeuroLab. เป็นไลบรารีของอัลกอริทึมเครือข่ายประสาทพื้นฐานที่มีการกำหนดค่าเครือข่ายที่ยืดหยุ่นและอัลกอริทึมการเรียนรู้สำหรับ Python คุณสามารถติดตั้งแพ็คเกจนี้ด้วยความช่วยเหลือของคำสั่งต่อไปนี้ในพรอมต์คำสั่ง -

pip install NeuroLab

หากคุณใช้สภาพแวดล้อม Anaconda ให้ใช้คำสั่งต่อไปนี้เพื่อติดตั้ง NeuroLab -

conda install -c labfabulous neurolab

การสร้างโครงข่ายประสาทเทียม

ในส่วนนี้ให้เราสร้างเครือข่ายประสาทเทียมใน Python โดยใช้แพ็คเกจ NeuroLab

ตัวจำแนกตาม Perceptron

Perceptrons เป็นส่วนประกอบสำคัญของ ANN หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ Perceptron คุณสามารถไปที่ลิงค์ - artificial_neural_network

ต่อไปนี้คือการดำเนินการตามขั้นตอนของรหัส Python สำหรับการสร้างตัวจำแนกตาม Perceptron ของเครือข่ายประสาทเทียม -

นำเข้าแพ็คเกจที่จำเป็นตามที่แสดง -

import matplotlib.pyplot as plt
import neurolab as nl

ป้อนค่าอินพุต โปรดทราบว่านี่เป็นตัวอย่างของการเรียนรู้ภายใต้การดูแลดังนั้นคุณจะต้องระบุค่าเป้าหมายด้วย

input = [[0, 0], [0, 1], [1, 0], [1, 1]]
target = [[0], [0], [0], [1]]

สร้างเครือข่ายด้วย 2 อินพุตและ 1 เซลล์ประสาท -

net = nl.net.newp([[0, 1],[0, 1]], 1)

ตอนนี้ฝึกเครือข่าย ที่นี่เราใช้กฎเดลต้าในการฝึกอบรม

error_progress = net.train(input, target, epochs=100, show=10, lr=0.1)

ตอนนี้ให้เห็นภาพผลลัพธ์และพล็อตกราฟ -

plt.figure()
plt.plot(error_progress)
plt.xlabel('Number of epochs')
plt.ylabel('Training error')
plt.grid()
plt.show()

คุณสามารถดูกราฟต่อไปนี้แสดงความคืบหน้าของการฝึกโดยใช้เมตริกข้อผิดพลาด -

โครงข่ายประสาทชั้นเดียว

ในตัวอย่างนี้เรากำลังสร้างเครือข่ายประสาทชั้นเดียวที่ประกอบด้วยเซลล์ประสาทอิสระที่ทำหน้าที่ป้อนข้อมูลเพื่อสร้างผลลัพธ์ โปรดทราบว่าเรากำลังใช้ไฟล์ข้อความชื่อneural_simple.txt เป็นข้อมูลของเรา

นำเข้าแพ็คเกจที่มีประโยชน์ดังที่แสดง -

import numpy as np
import matplotlib.pyplot as plt
import neurolab as nl

โหลดชุดข้อมูลดังนี้ -

input_data = np.loadtxt(“/Users/admin/neural_simple.txt')

ต่อไปนี้เป็นข้อมูลที่เราจะใช้ โปรดทราบว่าในข้อมูลนี้สองคอลัมน์แรกคือคุณลักษณะและสองคอลัมน์สุดท้ายคือป้ายกำกับ

array([[2. , 4. , 0. , 0. ],
      [1.5, 3.9, 0. , 0. ],
      [2.2, 4.1, 0. , 0. ],
      [1.9, 4.7, 0. , 0. ],
      [5.4, 2.2, 0. , 1. ],
      [4.3, 7.1, 0. , 1. ],
      [5.8, 4.9, 0. , 1. ],
      [6.5, 3.2, 0. , 1. ],
      [3. , 2. , 1. , 0. ],
      [2.5, 0.5, 1. , 0. ],
      [3.5, 2.1, 1. , 0. ],
      [2.9, 0.3, 1. , 0. ],
      [6.5, 8.3, 1. , 1. ],
      [3.2, 6.2, 1. , 1. ],
      [4.9, 7.8, 1. , 1. ],
      [2.1, 4.8, 1. , 1. ]])

ตอนนี้แยกสี่คอลัมน์ออกเป็น 2 คอลัมน์ข้อมูลและ 2 ป้ายกำกับ -

data = input_data[:, 0:2]
labels = input_data[:, 2:]

พล็อตข้อมูลอินพุตโดยใช้คำสั่งต่อไปนี้ -

plt.figure()
plt.scatter(data[:,0], data[:,1])
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.title('Input data')

ตอนนี้กำหนดค่าต่ำสุดและสูงสุดสำหรับแต่ละมิติดังที่แสดงไว้ที่นี่ -

dim1_min, dim1_max = data[:,0].min(), data[:,0].max()
dim2_min, dim2_max = data[:,1].min(), data[:,1].max()

จากนั้นกำหนดจำนวนเซลล์ประสาทในชั้นผลลัพธ์ดังนี้ -

nn_output_layer = labels.shape[1]

ตอนนี้กำหนดเครือข่ายประสาทชั้นเดียว -

dim1 = [dim1_min, dim1_max]
dim2 = [dim2_min, dim2_max]
neural_net = nl.net.newp([dim1, dim2], nn_output_layer)

ฝึกโครงข่ายใยประสาทด้วยจำนวนยุคและอัตราการเรียนรู้ดังที่แสดง -

error = neural_net.train(data, labels, epochs = 200, show = 20, lr = 0.01)

ตอนนี้ให้เห็นภาพและวางแผนความคืบหน้าการฝึกอบรมโดยใช้คำสั่งต่อไปนี้ -

plt.figure()
plt.plot(error)
plt.xlabel('Number of epochs')
plt.ylabel('Training error')
plt.title('Training error progress')
plt.grid()
plt.show()

ตอนนี้ใช้จุดข้อมูลทดสอบในลักษณนามด้านบน -

print('\nTest Results:')
data_test = [[1.5, 3.2], [3.6, 1.7], [3.6, 5.7],[1.6, 3.9]] for item in data_test:
   print(item, '-->', neural_net.sim([item])[0])

คุณสามารถดูผลการทดสอบดังที่แสดงไว้ที่นี่ -

[1.5, 3.2] --> [1. 0.]
[3.6, 1.7] --> [1. 0.]
[3.6, 5.7] --> [1. 1.]
[1.6, 3.9] --> [1. 0.]

คุณสามารถดูกราฟต่อไปนี้เป็นผลลัพธ์ของโค้ดที่กล่าวถึงจนถึงตอนนี้ -

เครือข่ายประสาทหลายชั้น

ในตัวอย่างนี้เรากำลังสร้างเครือข่ายประสาทเทียมแบบหลายชั้นที่ประกอบด้วยเลเยอร์มากกว่าหนึ่งชั้นเพื่อดึงรูปแบบพื้นฐานในข้อมูลการฝึกอบรม เครือข่ายประสาทหลายชั้นนี้จะทำงานเหมือนรีเครสเซอร์ เราจะสร้างจุดข้อมูลตามสมการ: y = 2x 2 +8

นำเข้าแพ็คเกจที่จำเป็นตามที่แสดง -

import numpy as np
import matplotlib.pyplot as plt
import neurolab as nl

สร้างจุดข้อมูลตามสมการที่กล่าวถึงข้างต้น -

min_val = -30
max_val = 30
num_points = 160
x = np.linspace(min_val, max_val, num_points)
y = 2 * np.square(x) + 8
y /= np.linalg.norm(y)

ตอนนี้จัดรูปแบบชุดข้อมูลนี้ใหม่ดังนี้ -

data = x.reshape(num_points, 1)
labels = y.reshape(num_points, 1)

แสดงภาพและพล็อตชุดข้อมูลอินพุตโดยใช้คำสั่งต่อไปนี้ -

plt.figure()
plt.scatter(data, labels)
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.title('Data-points')

ตอนนี้สร้างเครือข่ายประสาทที่มีสองชั้นที่ซ่อนอยู่ด้วย neurolab ด้วย ten เซลล์ประสาทในชั้นแรกที่ซ่อนอยู่ six ในเลเยอร์ที่ซ่อนอยู่ที่สองและ one ในเลเยอร์เอาต์พุต

neural_net = nl.net.newff([[min_val, max_val]], [10, 6, 1])

ตอนนี้ใช้อัลกอริธึมการฝึกไล่ระดับสี -

neural_net.trainf = nl.train.train_gd

ตอนนี้ฝึกอบรมเครือข่ายโดยมีเป้าหมายในการเรียนรู้จากข้อมูลที่สร้างขึ้นด้านบน -

error = neural_net.train(data, labels, epochs = 1000, show = 100, goal = 0.01)

ตอนนี้เรียกใช้เครือข่ายประสาทบนจุดข้อมูลการฝึกอบรม -

output = neural_net.sim(data)
y_pred = output.reshape(num_points)

ตอนนี้งานพล็อตและการสร้างภาพ -

plt.figure()
plt.plot(error)
plt.xlabel('Number of epochs')
plt.ylabel('Error')
plt.title('Training error progress')

ตอนนี้เราจะวางแผนผลลัพธ์จริงกับผลลัพธ์ที่คาดการณ์ไว้ -

x_dense = np.linspace(min_val, max_val, num_points * 2)
y_dense_pred = neural_net.sim(x_dense.reshape(x_dense.size,1)).reshape(x_dense.size)
plt.figure()
plt.plot(x_dense, y_dense_pred, '-', x, y, '.', x, y_pred, 'p')
plt.title('Actual vs predicted')
plt.show()

จากคำสั่งข้างต้นคุณสามารถสังเกตกราฟดังที่แสดงด้านล่าง -