Keras หลาย“Softmax” ในชั้นสุดท้ายไปได้หรือไม่


10

หลาย softmax ในเลเยอร์สุดท้าย

เป็นไปได้หรือไม่ที่จะใช้ softmaxes mutiple ในเลเยอร์สุดท้ายใน Keras ดังนั้นผลรวมของโหนด 1-4 = 1; 5-8 = 1; เป็นต้น

ฉันควรจะไปออกแบบเครือข่ายอื่นหรือไม่?

คำตอบ:


7

ฉันจะใช้ส่วนต่อประสานการทำงาน

บางสิ่งเช่นนี้

from keras.layers import Activation, Input, Dense
from keras.models import Model
from keras.layers.merge import Concatenate

input_ = Input(shape=input_shape)

x = input_
x1 = Dense(4, x)
x2 = Dense(4, x)
x3 = Dense(4, x)
x1 = Activation('softmax')(x1)
x2 = Activation('softmax')(x2)
x3 = Activation('softmax')(x3)
x = Concatenate([x1, x2, x3])

model = Model(inputs=input_, outputs=x)

2
ฉันไม่ได้แนะนำให้คุณเพิ่มวิธีแก้ปัญหา แต่ฉันคิดว่าการตอบกลับอย่างที่เป็นอยู่นั้นให้ความประทับใจว่างานสร้างโมเดลของ OP จะเสร็จสมบูรณ์ แต่มีจำนวนงานพิเศษที่ OP ต้องทำในส่วนอื่น ๆ ของรหัสหากพวกเขาต้องการฝึกอบรมโมเดลจริง ๆ อย่างน้อยคุณสามารถอ้างอิงข้อกำหนดนั้น เช่นเดียวกับคำตอบอื่น ๆ . .
นีลตำหนิ

1
@ NeilSlater คุณพูดถูก ฉันไม่รู้ว่าทำไมฉันจึงต้องใช้ฟังก์ชันต้นทุนที่แตกต่างกัน คุณบอกฉันได้ไหมว่าทำไมเรื่องนี้ถึงมีความสำคัญ
arthurDent

1
@arthurDent - เพราะ Keras' หลายระดับการสูญเสียข้ามเอนโทรปีถูกอาจจะไม่ได้มุ่งขึ้นเพื่อรับมือกับสามชั้นเรียนจริงพร้อมกันในแต่ละตัวอย่างและแยกออกเป็นกลุ่ม - ข้อผิดพลาดในกลุ่มหนึ่งอาจส่งผลให้การไล่ระดับสีที่ได้รับมอบหมายอย่างไม่ถูกต้องผลในกลุ่มอื่น ๆ . คุณสามารถลองและดูว่าเกิดอะไรขึ้น . . มันอาจยังคงมาบรรจบกัน แต่จุดสมดุลอาจไม่ดีเท่ากับการมีเครือข่ายสามเครือข่ายแยกกันโดยสิ้นเชิง
Neil Slater

1
@arthurent: . . แม้ว่าฉันจะคิดในรายละเอียดมากกว่านี้และการไล่ระดับสีที่ logit สำหรับมัลติคลาสไขว้เอนโทรปีด้วย softmax ซึ่งก็คืออาจยังคงใช้งานได้และประสบความสำเร็จ แน่นอนว่าเอาต์พุต softmax ปกติจะไม่สามารถเรียนรู้ได้พร้อมกัน 3 คลาส แต่บางทีคำตอบนี้อาจเป็นสิ่งที่คุณต้องการ . . y^y
Neil Slater

1
การใช้ตัวชี้วัดเช่นcategorical_accuracyและpredict_classesวิธีการอาจต้องการความคิดมากกว่านี้ . .
Neil Slater

5

มันเป็นไปได้เพียงแค่ใช้ฟังก์ชั่น softmax ของคุณเอง คุณสามารถแยกเมตริกซ์เป็นชิ้นส่วนจากนั้นคำนวณ softmax แยกกันต่อชิ้นส่วนและต่อส่วนเทนเซอร์ดังนี้

def custom_softmax(t):
    sh = K.shape(t)
    partial_sm = []
    for i in range(sh[1] // 4):
        partial_sm.append(K.softmax(t[:, i*4:(i+1)*4]))
    return K.concatenate(partial_sm)

concatenate ไม่มีอาร์กิวเมนต์แกนเชื่อมต่อกันผ่านแกนสุดท้าย (ในแกนตัวพิมพ์ของเรา = 1)

จากนั้นคุณสามารถรวมฟังก์ชันการเปิดใช้งานนี้ในเลเยอร์ที่ซ่อนอยู่หรือเพิ่มเข้าไปในกราฟ

Dense(activation=custom_activation)

หรือ

model.add(Activation(custom_activation))

นอกจากนี้คุณยังจำเป็นต้องกำหนดฟังก์ชั่นค่าใช้จ่ายใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.