ทำไม binary_crossentropy และ categorical_crossentropy ให้การแสดงต่างกันสำหรับปัญหาเดียวกัน?


160

ฉันพยายามฝึก CNN เพื่อจัดหมวดหมู่ข้อความตามหัวข้อ เมื่อฉันใช้ไบนารีข้ามเอนโทรปีฉันจะได้รับความแม่นยำประมาณ 80% และจากการข้ามเอนโทรปีอย่างเด็ดขาดฉันจะได้รับความแม่นยำ 50%

ฉันไม่เข้าใจว่าทำไมถึงเป็นเช่นนี้ มันเป็นปัญหามัลติคลาสนั่นไม่ได้หมายความว่าฉันต้องใช้การข้ามเอนโทรปีแบบเด็ดขาดและผลลัพธ์ที่ได้จากการข้ามเอนโทรปีแบบไบนารีนั้นไร้ความหมาย?

model.add(embedding_layer)
model.add(Dropout(0.25))
# convolution layers
model.add(Conv1D(nb_filter=32,
                    filter_length=4,
                    border_mode='valid',
                    activation='relu'))
model.add(MaxPooling1D(pool_length=2))
# dense layers
model.add(Flatten())
model.add(Dense(256))
model.add(Dropout(0.25))
model.add(Activation('relu'))
# output layer
model.add(Dense(len(class_id_index)))
model.add(Activation('softmax'))

จากนั้นฉันก็คอมไพล์มันแบบนี้โดยใช้categorical_crossentropyเป็นฟังก์ชันการสูญเสีย:

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

หรือ

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

โดยสัญชาตญาณมันสมเหตุสมผลแล้วว่าทำไมฉันถึงต้องการใช้เอนโทรปีแบบข้ามหมวดหมู่ฉันไม่เข้าใจว่าทำไมฉันถึงได้ผลลัพธ์ที่ดีด้วยเลขฐานสองและผลลัพธ์ที่ไม่ดีกับการจัดหมวดหมู่


10
ถ้ามันเป็นปัญหา multiclass categorical_crossentropyคุณต้องใช้ ป้ายกำกับยังต้องแปลงเป็นรูปแบบเด็ดขาด มาดูto_categoricalกันเลย ยังเห็นคำจำกัดความของเด็ดขาดและ crossentropies ไบนารีที่นี่
อิสระ

ป้ายกำกับของฉันแบ่งเป็นหมวดหมู่สร้างโดยใช้ to_categorical (หนึ่งเวกเตอร์ยอดนิยมสำหรับแต่ละชั้นเรียน) นั่นหมายความว่าความแม่นยำ ~ 80% จากเลขฐานสองเป็นเพียงตัวเลขปลอมหรือ
Daniel Messias

ฉันคิดอย่างนั้น categorical_crossentropyถ้าคุณใช้ป้ายเด็ดขาดหนึ่งคือเวกเตอร์ร้อนแล้วคุณต้องการ หากคุณมีสองคลาสคลาสเหล่านั้นจะถูกแสดง0, 1ในรูปแบบฉลากไบนารีและ10, 01ในรูปแบบป้ายกำกับหมวดหมู่
อิสระ

1
ฉันคิดว่าเขาเพิ่งเปรียบเทียบกับหมายเลขแรกในเวกเตอร์และละเว้นส่วนที่เหลือ
Thomas Pinetz

2
@NilavBaranGhosh การแสดงจะเป็น [[1, 0], [0, 1]] สำหรับการจัดหมวดหมู่หมวดหมู่ที่เกี่ยวข้องกับสองคลาส (ไม่ใช่ [[0, 0], [0, 1]] เหมือนที่คุณพูดถึง) Dense(1, activation='softmax')สำหรับการจำแนกไบนารีนั้นผิด จำเอาท์พุท softmax คือการกระจายความน่าจะเป็นที่รวมเป็นหนึ่ง หากคุณต้องการมีเซลล์ประสาทขาออกเพียงอันเดียวที่มีการจำแนกประเภทไบนารีให้ใช้ sigmoid พร้อมเลขฐานสองข้ามเอนโทรปี
อิสระ

คำตอบ:


204

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

ความแม่นยำที่คำนวณด้วยวิธี Keras evaluateนั้นผิดธรรมดาเมื่อใช้ binary_crossentropy ที่มีมากกว่า 2 ป้าย

ฉันต้องการที่จะอธิบายเพิ่มเติมเกี่ยวกับเรื่องนี้แสดงให้เห็นถึงปัญหาพื้นฐานที่แท้จริงอธิบายและเสนอวิธีการรักษา

พฤติกรรมนี้ไม่ได้เป็นข้อบกพร่อง เหตุผลพื้นฐานเป็นปัญหาที่ค่อนข้างบอบบางและไม่มีวิธีการที่ Keras คาดเดาความถูกต้องแม่นยำในการใช้งานขึ้นอยู่กับฟังก์ชันการสูญเสียที่คุณเลือกเมื่อคุณรวมเพียงแค่metrics=['accuracy']ในการรวบรวมแบบจำลองของคุณ ในคำอื่น ๆ ในขณะที่ตัวเลือกการรวบรวมครั้งแรกของคุณ

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

ถูกต้องอันที่สองของคุณ:

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

จะไม่สร้างสิ่งที่คุณคาดหวัง แต่เหตุผลไม่ใช่การใช้ไบนารีข้ามเอนโทรปี (ซึ่งอย่างน้อยก็ในหลักการเป็นฟังก์ชั่นการสูญเสียที่ถูกต้องอย่างแน่นอน)

ทำไมถึงเป็นอย่างนั้น? หากคุณตรวจสอบรหัสตัวชี้วัดแหล่งที่มา , Keras ไม่ได้กำหนดตัวชี้วัดความถูกต้องเดียว แต่คนที่แตกต่างกันในหมู่พวกเขาและbinary_accuracy categorical_accuracyสิ่งที่เกิดขึ้นภายใต้ประทุนคือเมื่อคุณเลือกไบนารีไขว้เอนโทรปีเป็นฟังก์ชันการสูญเสียของคุณและไม่ได้ระบุเมตริกความแม่นยำเฉพาะ Keras (ผิด ... ) infers ที่คุณสนใจbinary_accuracyและนี่คือสิ่งที่มันกลับมา - categorical_accuracyขณะที่ในความเป็นจริงคุณมีความสนใจใน

เรามาตรวจสอบว่าเป็นกรณีนี้หรือไม่โดยใช้ตัวอย่าง MNIST CNNใน Keras ด้วยการแก้ไขต่อไปนี้:

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])  # WRONG way

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=2,  # only 2 epochs, for demonstration purposes
          verbose=1,
          validation_data=(x_test, y_test))

# Keras reported accuracy:
score = model.evaluate(x_test, y_test, verbose=0) 
score[1]
# 0.9975801164627075

# Actual accuracy calculated manually:
import numpy as np
y_pred = model.predict(x_test)
acc = sum([np.argmax(y_test[i])==np.argmax(y_pred[i]) for i in range(10000)])/10000
acc
# 0.98780000000000001

score[1]==acc
# False    

เพื่อแก้ไขปัญหานี้คือการใช้เอนโทรปีไบนารีแน่นอนข้ามเป็นฟังก์ชั่นการสูญเสียของคุณ (ที่ผมกล่าวว่าผิดอะไรกับเรื่องนี้อย่างน้อยในหลักการ) ในขณะที่ยังคงได้รับเด็ดขาดความถูกต้องต้องตามปัญหาที่มือคุณควรถามอย่างชัดเจนสำหรับcategorical_accuracyใน การรวบรวมรูปแบบดังต่อไปนี้:

from keras.metrics import categorical_accuracy
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[categorical_accuracy])

ในตัวอย่าง MNIST หลังจากการฝึกอบรมการให้คะแนนและการทำนายชุดการทดสอบตามที่ฉันแสดงด้านบนตอนนี้เมตริกทั้งสองก็เหมือนกันตามที่ควรจะเป็น:

# Keras reported accuracy:
score = model.evaluate(x_test, y_test, verbose=0) 
score[1]
# 0.98580000000000001

# Actual accuracy calculated manually:
y_pred = model.predict(x_test)
acc = sum([np.argmax(y_test[i])==np.argmax(y_pred[i]) for i in range(10000)])/10000
acc
# 0.98580000000000001

score[1]==acc
# True    

ติดตั้งระบบ:

Python version 3.5.3
Tensorflow version 1.2.1
Keras version 2.0.4

อัปเดต : หลังจากโพสต์ของฉันฉันค้นพบว่าปัญหานี้ได้รับการระบุในคำตอบนี้แล้ว


1
มีความผิดปกติในการใช้loss='categorical_crossentropy', metrics=['categorical_accuracy']สำหรับการจำแนกประเภทหลายคลาสหรือไม่ นี่จะเป็นสัญชาตญาณของฉัน
NeStack

2
@ NeStack ไม่เพียง แต่มีอะไรผิดปกติ แต่นี่คือการรวมกันเล็กน้อย
desertnaut

1
ตามที่คุณพูดตราบใดที่ฉันใช้ loss = 'binary_crossentropy' ฉันจะได้รับผลตอบแทนแบบเดียวกันโดยไม่ต้องใช้ตัวชี้วัด = 'binary_accuracy' หรือตัวชี้วัด = 'ความถูกต้อง'?
BioCoder

2
@BioCoder แน่นอน
desertnaut

54

ทุกอย่างขึ้นอยู่กับประเภทของปัญหาการจำแนกที่คุณกำลังเผชิญอยู่ มีสามประเภทหลักคือ

  • การจำแนกไบนารี (คลาสเป้าหมายสองคลาส),
  • การจำแนกประเภทหลายระดับ (มากกว่าสองเป้าหมายพิเศษ )
  • การจำแนกประเภทหลายฉลาก (มากกว่าสองเป้าหมายที่ไม่ผูกขาด ) ซึ่งคลาสเป้าหมายหลายรายการสามารถเปิดพร้อมกัน

ในกรณีแรกควรใช้ไบนารีไขว้เอนโทรปีและเป้าหมายควรถูกเข้ารหัสเป็นเวกเตอร์แบบร้อน

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

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

ไบนารีเอนโทรปีถูกกำหนดเป็น

ป้อนคำอธิบายรูปภาพที่นี่

และการจำแนกข้ามเอนโทรปีถูกกำหนดเป็น

ป้อนคำอธิบายรูปภาพที่นี่

โดยที่cดัชนีรันอยู่ตามจำนวนคลาส


คำตอบของคุณดูเหมือนจะเป็นเรื่องจริง แต่ ... ฉันพยายามทำตาม @desertnaut ตอบและทำการทดสอบนั้น: ด้วยฟังก์ชั่นการสูญเสียของ binary_crossentropy และ metrcis ไปเป็น categorical_accurency ฉันมีความแม่นยำที่ดีกว่าโดยใช้ นั่น ...
Metal3d

@ Metal3d: การกำหนดปัญหาของคุณคืออะไร: ฉลากหลายป้ายหรือฉลากเดี่ยว?
Whynote

single-label และตอนนี้ฉันรู้แล้วว่าทำไมมันถึงได้ผลดีกว่า :)
Metal3d

คุณแน่ใจหรือไม่ว่าการกำหนดเลขฐานสองและการจำแนกข้ามประเภทมีการกำหนดไว้ในสูตรในคำตอบนี้หรือไม่?
nbro

@nbro จริง ๆ แล้วcดัชนีนั้นซ้ำซ้อนในสูตรไบนารีไขว้เอนโทรปีจึงไม่จำเป็นต้องมี (เนื่องจากมีเพียง 2 คลาสและความน่าจะเป็นของแต่ละชั้นจะถูกฝังอยู่y(x)มิฉะนั้นสูตรเหล่านั้นควรจะถูกต้อง แต่ สังเกตเหล่านี้จะไม่สูญเสียผู้ที่มีโอกาสเกิดถ้าคุณต้องการการสูญเสียที่คุณต้องใช้. logเหล่านี้.
Whynote

40

ฉันเจอปัญหา "กลับด้าน" - ฉันได้รับผลลัพธ์ที่ดีด้วย categorical_crossentropy (มี 2 คลาส) และแย่ลงด้วย binary_crossentropy ดูเหมือนว่าปัญหานั้นเกิดจากฟังก์ชั่นการเปิดใช้งานที่ไม่ถูกต้อง การตั้งค่าที่ถูกต้องคือ:

  • สำหรับbinary_crossentropy: การเปิดใช้งาน sigmoid, เป้าหมายสเกลาร์
  • สำหรับcategorical_crossentropy: การเปิดใช้งาน softmax, เป้าหมายที่ถูกเข้ารหัสร้อนแรงหนึ่งรายการ

4
คุณแน่ใจเกี่ยวกับเป้าหมายสเกลาร์สำหรับ binary_crossentropy ดูเหมือนว่าคุณควรใช้เป้าหมายที่เข้ารหัส "จำนวนมาก" (เช่น [0 1 0 0 1 1])
Dmitry

5
แน่ใจ ดูkeras.io/losses/#usage-of-loss-functionsมันบอกว่า: "เมื่อใช้การสูญเสีย categorical_crossentropy เป้าหมายของคุณควรอยู่ในรูปแบบเด็ดขาด (เช่นถ้าคุณมี 10 คลาสเป้าหมายสำหรับแต่ละตัวอย่างควรเป็น 10 เวกเตอร์สามมิติที่เป็นศูนย์ทั้งหมดคาดหวังว่า 1 ที่ดัชนีสอดคล้องกับคลาสของกลุ่มตัวอย่าง) "
Alexander Svetkin

1
แต่เรากำลังพูดถึง binary_crossentropy - ไม่ใช่ categorical_crossentropy
Dmitry

คำตอบนี้ดูเหมือนจะไม่สอดคล้องกับstackoverflow.com/a/49175655/3924118ซึ่งผู้เขียนบอกว่าเป้าหมายควรมีการเข้ารหัสแบบร้อนแรงขณะที่คำตอบของคุณคุณแนะนำว่าควรเป็นสเกลาร์ คุณควรชี้แจงเรื่องนี้
nbro

@AlexanderSvetkin เป้าหมายควรได้รับการเข้ารหัสร้อนแรงทุกหนทุกแห่งไม่ใช่เฉพาะเมื่อใช้การข้ามเอนโทรปีอย่าง
เด็ดขาด

28

เป็นกรณีที่น่าสนใจจริงๆ ที่จริงแล้วในการตั้งค่าของคุณข้อความต่อไปนี้เป็นจริง:

binary_crossentropy = len(class_id_index) * categorical_crossentropy

ซึ่งหมายความว่าขึ้นอยู่กับปัจจัยคูณคูณคงที่การสูญเสียของคุณจะเทียบเท่า พฤติกรรมแปลก ๆ ที่คุณสังเกตในระหว่างขั้นตอนการฝึกอบรมอาจเป็นตัวอย่างของปรากฏการณ์ต่อไปนี้:

  1. ในตอนแรกชั้นเรียนที่พบบ่อยที่สุดมีอำนาจเหนือการสูญเสียดังนั้นเครือข่ายจึงเรียนรู้ที่จะทำนายชั้นเรียนนี้เป็นส่วนใหญ่สำหรับทุกตัวอย่าง
  2. หลังจากเรียนรู้รูปแบบที่พบบ่อยที่สุดก็เริ่มแยกแยะระหว่างชั้นเรียนที่น้อยกว่าปกติ แต่เมื่อคุณใช้adam- อัตราการเรียนรู้มีค่าน้อยกว่าเมื่อเริ่มการฝึกอบรม (เป็นเพราะธรรมชาติของเครื่องมือเพิ่มประสิทธิภาพนี้) มันทำให้การฝึกอบรมช้าลงและป้องกันเครือข่ายของคุณเช่นทำให้เหลือน้อยที่สุดในท้องถิ่นน้อยที่สุด

binary_crossentropyนั่นเป็นเหตุผลที่นี้คงปัจจัยที่อาจจะช่วยในกรณีของ หลังจากยุคหลาย - ค่าอัตราการเรียนรู้มากกว่าในcategorical_crossentropyกรณี ฉันมักจะเริ่มการฝึกอบรม (และช่วงการเรียนรู้) สองสามครั้งเมื่อฉันสังเกตเห็นพฤติกรรมดังกล่าวหรือ / และปรับน้ำหนักของห้องเรียนโดยใช้รูปแบบต่อไปนี้:

class_weight = 1 / class_frequency

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

แก้ไข:

จริง - ฉันตรวจสอบว่าแม้ว่าในกรณีของคณิตศาสตร์:

binary_crossentropy = len(class_id_index) * categorical_crossentropy

ควรถือ - ในกรณีของkerasมันไม่เป็นความจริงเพราะkerasเป็นผล normalizing 1ทั้งหมดโดยอัตโนมัติจะรวมถึง นี่คือเหตุผลที่แท้จริงที่อยู่เบื้องหลังพฤติกรรมแปลก ๆ เช่นเดียวกับในกรณีของการจำแนกประเภทหลายระดับเช่นการทำให้เป็นมาตรฐานนั้นเป็นอันตรายต่อการฝึกอบรม


คำตอบของฉันช่วยคุณได้ไหม
Marcin Możejko

1
นี่เป็นคำอธิบายที่สมเหตุสมผลมาก แต่ฉันไม่แน่ใจว่ามันเป็นเหตุผลหลักจริงๆ เพราะฉันยังสังเกตเห็นว่านักเรียนหลายคนของฉันทำงานพฤติกรรมแปลก ๆ นี้เมื่อใช้ binary-X-ent แทน cat-X-ent (ซึ่งเป็นความผิดพลาด) และนี่คือความจริงแม้เมื่อฝึกฝนเพียง 2 ยุคเท่านั้น! การใช้ class_weight ร่วมกับไพรเออร์คลาสผกผันไม่ได้ช่วยอะไร อาจเป็นการปรับอัตราการเรียนรู้อย่างเข้มงวดจะช่วยได้ แต่ค่าเริ่มต้นดูเหมือนจะชอบ bin-X-ent ฉันคิดว่าคำถามนี้สมควรได้รับการสอบสวนเพิ่มเติม ...
xtof54

1
รอไม่ต้องขอโทษด้วยฉันไม่ได้รับการอัปเดตของคุณ: softmax จะสร้างผลรวมเป็น 1 เสมอดังนั้นเราจึงไม่สนใจสิ่งนั้น และทำไมจึงเป็นอันตรายต่อการฝึกอบรมตราบใดที่เรามีเพียงระดับชั้นเดียวที่ถูกต้องต่อตัวอย่าง?
xtof54

20

หลังจากแสดงความคิดเห็น @Marcin คำตอบฉันได้ตรวจสอบรหัสนักเรียนของฉันอย่างระมัดระวังมากขึ้นซึ่งฉันพบว่าพฤติกรรมแปลก ๆ เหมือนกันแม้หลังจากนั้นเพียง 2 ยุค! (ดังนั้นคำอธิบาย @ @ Marcin ก็ไม่น่าเป็นไปได้ในกรณีของฉัน)

และฉันพบว่าคำตอบนั้นง่ายมากจริง ๆ ความแม่นยำที่คำนวณด้วยวิธี Keras evaluateนั้นผิดธรรมดาเมื่อใช้ binary_crossentropy ที่มีป้ายกำกับมากกว่า 2 รายการ คุณสามารถตรวจสอบได้โดยการคำนวณความถูกต้องด้วยตัวเองอีกครั้ง (เรียกวิธี Keras ก่อน "ทำนาย" แล้วคำนวณจำนวนคำตอบที่ถูกต้องที่ส่งคืนโดยทำนาย): คุณได้รับความแม่นยำที่แท้จริงซึ่งต่ำกว่า "ประเมิน" Keras


1
ฉันเห็นพฤติกรรมที่คล้ายกันในการทำซ้ำครั้งแรกเช่นกัน
dolbi

10

ตัวอย่างง่าย ๆ ภายใต้การตั้งค่าหลายคลาสเพื่อแสดง

สมมติว่าคุณมี 4 คลาส (เข้ารหัสหนึ่งช็อต) และด้านล่างเป็นเพียงคำทำนายเดียว

true_label = [0,1,0,0] predicted_label = [0,0,1,0]

เมื่อใช้ categorical_crossentropy ความถูกต้องเป็นเพียง 0 มันจะสนใจก็ต่อเมื่อคุณได้คลาสที่ถูกต้อง

อย่างไรก็ตามเมื่อใช้ binary_crossentropy ความแม่นยำจะถูกคำนวณสำหรับทุกคลาสมันจะเป็น 50% สำหรับการทำนายนี้ และผลลัพธ์สุดท้ายจะเป็นค่าเฉลี่ยของความถูกต้องส่วนบุคคลสำหรับทั้งสองกรณี

ขอแนะนำให้ใช้ categorical_crossentropy สำหรับปัญหาหลายคลาส (คลาสเป็นสิ่งที่เกิดร่วมกัน) แต่ไบนารี_crossentropyสำหรับปัญหาหลายฉลาก


8

เนื่องจากเป็นปัญหาหลายคลาสคุณต้องใช้ categorical_crossentropy ดังนั้นการข้ามเอนโทรปีแบบไบนารีจะสร้างผลลัพธ์ปลอมโดยส่วนใหญ่จะประเมินเฉพาะสองคลาสแรกเท่านั้น

50% สำหรับปัญหาหลายคลาสนั้นค่อนข้างดีขึ้นอยู่กับจำนวนคลาส หากคุณมีคลาส n แล้ว 100 / n คือประสิทธิภาพขั้นต่ำที่คุณจะได้รับโดยการแสดงคลาสแบบสุ่ม


2

เมื่อใช้การcategorical_crossentropyสูญเสียเป้าหมายของคุณควรอยู่ในรูปแบบที่เป็นหมวดหมู่ (เช่นถ้าคุณมี 10 คลาสเป้าหมายสำหรับแต่ละตัวอย่างควรเป็นเวกเตอร์ 10 มิติที่เป็นศูนย์ทั้งหมดยกเว้นค่า 1 ที่ดัชนีที่สอดคล้องกับคลาสของ ตัวอย่าง).


3
ตรงนี้ตอบคำถามอย่างไร
Desertnaut

2

ลองดูที่สมการที่คุณพบว่าเอนโทรปีของไบนารีไขว้ไม่เพียง แต่ลงโทษฉลากเหล่านั้น = 1, ทำนาย = 0 แต่ยังติดป้าย = 0, ทำนาย = 1

อย่างไรก็ตามเอนโทรปีของการข้ามอย่างเป็นหมวดหมู่จะลงโทษฉลากเหล่านั้นเท่านั้น = 1 แต่คาดการณ์ = 1 นั่นคือเหตุผลที่เราสันนิษฐานว่ามีเพียงฉลากเดียวเท่านั้น


1

คุณจะผ่านอาร์เรย์เป้าหมายของรูปร่าง (x-มซำ, y-สลัว) categorical_crossentropyในขณะที่ใช้การสูญเสีย categorical_crossentropyคาดว่าเป้าหมายจะเป็นเมทริกซ์ไบนารี (1s และ 0s) ของรูปร่าง (ตัวอย่างคลาส) หากเป้าหมายของคุณเป็นคลาสจำนวนเต็มคุณสามารถแปลงเป็นรูปแบบที่คาดหวังผ่าน:

from keras.utils import to_categorical
y_binary = to_categorical(y_int)

หรือคุณสามารถใช้ฟังก์ชันการสูญเสียsparse_categorical_crossentropyแทนซึ่งคาดว่าจะเป็นเป้าหมายจำนวนเต็ม

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

0

binary_crossentropy (y_target, y_predict) ไม่จำเป็นต้องใช้ในปัญหาการจำแนกเลขฐานสอง .

ในซอร์สโค้ดของbinary_crossentropy ()ที่nn.sigmoid_cross_entropy_with_logits(labels=target, logits=output)ฟังก์ชั่น TensorFlow ถูกนำมาใช้จริง และในเอกสารอธิบายว่า:

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

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