Keras: เครือข่ายประสาทธรรมดาที่มีข้อมูลธรรมดาไม่ทำงาน

Aug 20 2020

ฉันพยายามสร้างเครือข่ายประสาทที่เรียบง่าย: ชั้นที่ซ่อนอยู่ชั้นหนึ่งมีเซลล์ประสาท 2 เซลล์ สำหรับข้อมูลที่เรียบง่ายมีเพียงคุณสมบัติเดียว

import numpy as np
X=np.concatenate([np.linspace(0,10,100),np.linspace(11,20,100),np.linspace(21,30,100)])
y=np.concatenate([np.repeat(0,100),np.repeat(1,100),np.repeat(0,100)])

นี่คือแบบจำลอง

from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(2, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.fit(X, y, epochs=200)

ตามทฤษฎีแล้วแบบจำลองนี้ควรใช้งานได้ แต่ถึงแม้จะผ่านไป 1,000 ยุคแล้วความแม่นยำก็ยังคงอยู่ที่ 0.667

Epoch 999/1000
10/10 [==============================] - 0s 1ms/step - loss: 0.5567 - accuracy: 0.6667
Epoch 1000/1000
10/10 [==============================] - 0s 2ms/step - loss: 0.5566 - accuracy: 0.6667

ฉันคิดว่าฉันทำอะไรผิด คุณช่วยแนะนำการปรับเปลี่ยนได้ไหม

ดูเหมือนว่าจะมีค่าต่ำสุดในท้องถิ่นจำนวนมากและการเริ่มต้นสามารถเปลี่ยนรูปแบบสุดท้ายได้ เป็นกรณีที่ทดสอบกับแพ็คเกจnnetใน R ฉันต้องทดสอบเมล็ดจำนวนมากฉันพบโมเดลนี้ (ในกลุ่มอื่น ๆ )

และนี่คือโครงสร้างที่ฉันต้องการสร้างด้วยเครา: ชั้นที่ซ่อนอยู่หนึ่งชั้นที่มีเซลล์ประสาท 2 เซลล์ ฟังก์ชันการเปิดใช้งานคือ sigmoid

ดังนั้นฉันจึงสงสัยว่า keras มีปัญหาเดียวกันกับการเริ่มต้นหรือไม่ ด้วยแพ็คเกจnnetใน R นี้ฉันคิดว่ามันไม่ใช่แพ็คเกจที่ "สมบูรณ์แบบ" และฉันคิดว่า Keras น่าจะเป็นนักแสดงมากกว่า หากการเริ่มต้นมีความสำคัญ Keras จะทดสอบการเริ่มต้นที่แตกต่างกันหรือไม่? ถ้าไม่ทำไม? อาจเป็นเพราะโดยทั่วไปมีข้อมูลมากขึ้น (และคุณสมบัติอื่น ๆ ) จึงทำงานได้ดีขึ้น (โดยไม่ต้องทดสอบการเริ่มต้นหลายอย่าง)?

ตัวอย่างเช่นเมื่อใช้ kmeans ดูเหมือนว่าจะมีการทดสอบการเริ่มต้นที่แตกต่างกัน

คำตอบ

3 Mitiku Aug 26 2020 at 16:19

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

ฉันต้องการเริ่มต้นด้วยการแสดงภาพของชุดข้อมูล ชุดข้อมูลคือ 1D และหลังจากได้รับการปรับให้เป็นมาตรฐานด้วยการปรับมาตรฐานแล้วจะมีลักษณะดังต่อไปนี้

X_original = np.concatenate([np.linspace(0, 10, 100), np.linspace(
11, 20, 100), np.linspace(21, 30, 100)])
X = (X_original - X_original.mean())/X_original.std()

y = np.concatenate(
        [np.repeat(0, 100), np.repeat(1, 100), np.repeat(0, 100)])
plt.figure()
plt.scatter(X, np.zeros(X.shape[0]), c=y)
plt.show()

วิธีที่ดีที่สุดในการแยกจุดข้อมูลเหล่านี้ออกเป็นชั้นเรียนตามลำดับคือการลากเส้นสองเส้นบนพื้นที่ป้อนข้อมูล เนื่องจากพื้นที่ป้อนข้อมูลคือ 1D ขอบเขตการจำแนกจึงเป็นเพียงจุด 1D

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

ขณะนี้ด้วยการทำให้เป็นมาตรฐานและสคริปต์การฝึกอบรมต่อไปนี้โมเดลสามารถเรียนรู้ที่จะจำแนกประเด็นได้อย่างง่ายดาย

model = Sequential()
model.add(Dense(2, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
                  optimizer=keras.optimizers.Adam(1e-1), metrics=['accuracy'])
model.fit(X, y, epochs=20)

Train on 300 samples
Epoch 1/20
300/300 [==============================] - 1s 2ms/sample - loss: 0.6455 - accuracy: 0.6467
Epoch 2/20
300/300 [==============================] - 0s 79us/sample - loss: 0.6493 - accuracy: 0.6667
Epoch 3/20
300/300 [==============================] - 0s 85us/sample - loss: 0.6397 - accuracy: 0.6667
Epoch 4/20
300/300 [==============================] - 0s 100us/sample - loss: 0.6362 - accuracy: 0.6667
Epoch 5/20
300/300 [==============================] - 0s 115us/sample - loss: 0.6342 - accuracy: 0.6667
Epoch 6/20
300/300 [==============================] - 0s 96us/sample - loss: 0.6317 - accuracy: 0.6667
Epoch 7/20
300/300 [==============================] - 0s 93us/sample - loss: 0.6110 - accuracy: 0.6667
Epoch 8/20
300/300 [==============================] - 0s 110us/sample - loss: 0.5746 - accuracy: 0.6667
Epoch 9/20
300/300 [==============================] - 0s 142us/sample - loss: 0.5103 - accuracy: 0.6900
Epoch 10/20
300/300 [==============================] - 0s 124us/sample - loss: 0.4207 - accuracy: 0.9367
Epoch 11/20
300/300 [==============================] - 0s 124us/sample - loss: 0.3283 - accuracy: 0.9833
Epoch 12/20
300/300 [==============================] - 0s 124us/sample - loss: 0.2553 - accuracy: 0.9800
Epoch 13/20
300/300 [==============================] - 0s 138us/sample - loss: 0.2030 - accuracy: 1.0000
Epoch 14/20
300/300 [==============================] - 0s 124us/sample - loss: 0.1624 - accuracy: 1.0000
Epoch 15/20
300/300 [==============================] - 0s 150us/sample - loss: 0.1375 - accuracy: 1.0000
Epoch 16/20
300/300 [==============================] - 0s 122us/sample - loss: 0.1161 - accuracy: 1.0000
Epoch 17/20
300/300 [==============================] - 0s 115us/sample - loss: 0.1025 - accuracy: 1.0000
Epoch 18/20
300/300 [==============================] - 0s 126us/sample - loss: 0.0893 - accuracy: 1.0000
Epoch 19/20
300/300 [==============================] - 0s 121us/sample - loss: 0.0804 - accuracy: 1.0000
Epoch 20/20
300/300 [==============================] - 0s 132us/sample - loss: 0.0720 - accuracy: 1.0000

เนื่องจากแบบจำลองนี้ง่ายมากการเลือกอัตราการเรียนรู้และเครื่องมือเพิ่มประสิทธิภาพจึงมีผลต่อความเร็วของการเรียนรู้ ด้วยเครื่องมือเพิ่มประสิทธิภาพ SGD และอัตราการเรียนรู้ 1e-1 โมเดลอาจใช้เวลาฝึกอบรมนานกว่า Adam Optimizer ที่มีอัตราการเรียนรู้เท่ากัน