ข้อกำหนดการทำให้เป็นมาตรฐานที่กำหนดเองของ Tensorflow เปรียบเทียบการทำนายกับค่าจริง

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

โมเดลใช้ชุดข้อมูล 10,000 ของการกำหนดค่าไบนารี 18 x 18 เป็นอินพุต และมีการกำหนดค่า 16x16 ที่ตั้งเป็นเอาต์พุต โครงข่ายประสาทเทียมประกอบด้วยชั้น Convlutional เพียง 2 ชั้นเท่านั้น

โมเดลของฉันมีลักษณะดังนี้:

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
EPOCHS = 10
model = models.Sequential()
model.add(layers.Conv2D(1,2,activation='relu',input_shape=[18,18,1]))
model.add(layers.Conv2D(1,2,activation='sigmoid',input_shape=[17,17,1]))
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),loss=tf.keras.losses.BinaryCrossentropy())
model.fit(initial.reshape(10000,18,18,1),target.reshape(10000,16,16,1),batch_size = 1000, epochs=EPOCHS, verbose=1)
output = model(initial).numpy().reshape(10000,16,16) 

ตอนนี้ฉันเขียนฟังก์ชันที่ฉันต้องการใช้เป็นเงื่อนไขการทำให้เป็นมาตรฐานเพิ่มเติมเพื่อใช้เป็นเงื่อนไขการทำให้เป็นมาตรฐาน ฟังก์ชันนี้รับค่าจริงและการทำนาย โดยพื้นฐานแล้ว มันจะทวีคูณทุกจุดของทั้งสองอย่างด้วยเพื่อนบ้านที่ 'ถูกต้อง' จากนั้นนำความแตกต่าง ฉันคิดว่าคำจริงและการทำนายคือ 16x16 (ไม่ใช่ 10,000x16x16) สิ่งนี้ถูกต้องหรือไม่?

def regularization_term(prediction, true):
    order = list(range(1,4))
    order.append(0)
    
    deviation = (true*true[:,order]) - (prediction*prediction[:,order])
    deviation = abs(deviation)**2
    return 0.2 * deviation

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




คำตอบ (1)


มันค่อนข้างง่าย คุณต้องระบุการสูญเสียที่กำหนดเองซึ่งคุณกำหนดเงื่อนไขการเพิ่มการทำให้เป็นมาตรฐาน บางสิ่งเช่นนี้:

# to minimize!
def regularization_term(true, prediction):
    order = list(range(1,4))
    order.append(0)
    
    deviation = (true*true[:,order]) - (prediction*prediction[:,order])
    deviation = abs(deviation)**2
    return 0.2 * deviation

def my_custom_loss(y_true, y_pred):
    return tf.keras.losses.BinaryCrossentropy()(y_true, y_pred) + regularization_term(y_true, y_pred)


model.compile(optimizer='Adam', loss=my_custom_loss)

ตามที่ระบุไว้โดย keras:

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

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

รายละเอียดที่นี่: https://keras.io/api/losses/

person Nikaido    schedule 08.12.2020