6

Tôi có mạng tạo ra một bộ tạo đầu ra 4D, trong đó giá trị tại mỗi vị trí trong kích thước không gian (~ pixel) được hiểu là xác suất lớp cho vị trí đó. Nói cách khác, đầu ra là (num_batches, height, width, num_classes). Tôi có các nhãn có cùng kích thước trong đó lớp thực được mã hóa là một nóng. Tôi muốn tính toán tổn thất categorical-crossentropy bằng cách sử dụng này.Làm thế nào để khắc phục sự cố xuyên suốt phân loại theo điểm trong Keras?

Vấn đề # 1: Chức năng K.softmax hy vọng một tensor 2D(num_batches, num_classes)

Vấn đề # 2: Tôi không chắc chắn như thế nào những tổn thất từ ​​mỗi vị trí nên được kết hợp. Có đúng không reshape tensor đến (num_batches * height * width, num_classes) và sau đó gọi K.categorical_crossentropy về điều đó? Hay đúng hơn, hãy gọi K.categorical_crossentropy(num_batches, num_classes) chiều cao * chiều rộng và trung bình kết quả?

+0

Bạn sử dụng chương trình phụ trợ nào? –

+0

@ MarcinMożejko Tôi sử dụng TensorFlow - có thể sử dụng api phụ trợ Keras hoặc các chức năng của TF, hoặc là tốt. Cảm ơn! –

+0

Tôi đã trả lời câu hỏi của bạn :-) –

Trả lời

2

Chỉ cần san phẳng đầu ra thành một dải có kích thước 2D (num_batches, height * width * num_classes). Bạn có thể làm điều này với lớp Flatten. Đảm bảo rằng y của bạn được làm phẳng theo cùng một cách (thường gọi y = y.reshape((num_batches, height * width * num_classes)) là đủ).

Đối với câu hỏi thứ hai của bạn, sử dụng crossentropy phân loại trên tất cả các dự đoán width*height về cơ bản giống như trung bình crossentropy cho mỗi dự đoán width*height (theo định nghĩa về crossentropy phân loại).

+0

Cảm ơn! Tôi đang bối rối bởi (num_batches, chiều cao * chiều rộng * num_classes) mặc dù. Đó không phải là về cơ bản tính chéo entropy như thể có num_batches mẫu với chiều cao * chiều rộng * num_classes lớp học mỗi? Tôi khá chắc chắn rằng tôi muốn mỗi điểm được tính là một mẫu riêng biệt, không phải là giống như định dạng lại thành (num_batches * height * width, num_classes)? Xin vui lòng cho tôi biết nếu hai là tương đương toán học khôn ngoan. –

+0

Xin lỗi, chỉ riêng tính năng crossentropy về mặt thể chất sẽ giống như toán học. Nhưng việc sử dụng nó cùng với softmax sẽ không giống nhau về mặt toán học vì đầu ra được chuẩn hóa, đó là một câu trả lời trong câu trả lời của tôi. Tôi không nghĩ rằng có thể thay đổi kích thước lô của điểm giữa đầu vào trong mô hình. Cách tốt nhất có lẽ là tạo một xung quanh và thực hiện chức năng kích hoạt softmax của riêng bạn để chuẩn hóa đầu ra cho mỗi ô 'chiều rộng * chiều rộng '. – oscfri

+0

Cảm ơn! Tôi vẫn còn bối rối về việc làm thế nào để dịch nó sang mã làm việc, bạn có thể có một shot ở đó không? Tôi bắt đầu một tiền thưởng :) –

2

Tìm thấy this issue để xác nhận trực giác của tôi.

Tóm lại: softmax sẽ lấy đầu vào 2D hoặc 3D. Nếu chúng là 3D keras sẽ giả định một hình dạng như thế này (mẫu, timedimension, numclasses) và áp dụng softmax trên cái cuối cùng. Đối với một số lý do kỳ lạ, nó không làm điều đó cho 4D tensors.

Giải pháp: định hình lại đầu ra của bạn đến một chuỗi các pixel

reshaped_output = Reshape((height*width, num_classes))(output_tensor) 

Sau đó áp dụng của bạn softmax

new_output = Activation('softmax')(reshaped_output) 

Và sau đó, hoặc bạn định hình lại tensors mục tiêu của bạn để 2D hoặc bạn chỉ định hình lại mà lớp cuối cùng vào (chiều rộng, chiều cao, num_classes).

Nếu không, tôi sẽ thử điều gì đó nếu tôi không có trên điện thoại của mình ngay bây giờ là sử dụng tính năng phân phối theo thời gian (Kích hoạt ('softmax')). Nhưng không biết nếu điều đó sẽ làm việc ... sẽ cố gắng sau

Tôi hy vọng điều này sẽ giúp :-)

2

Bạn có thể cũng không reshape bất cứ điều gì và xác định cả softmaxloss trên của riêng bạn. Dưới đây là softmax đó được áp dụng cho kích thước đầu vào cuối cùng (như trong tf backend):

def image_softmax(input): 
    label_dim = -1 
    d = K.exp(input - K.max(input, axis=label_dim, keepdims=True)) 
    return d/K.sum(d, axis=label_dim, keepdims=True) 

và ở đây bạn có loss (không có cần phải định hình lại bất cứ điều gì):

__EPS = 1e-5 
def image_categorical_crossentropy(y_true, y_pred): 
    y_pred = K.clip(y_pred, __EPS, 1 - __EPS) 
    return -K.mean(y_true * K.log(y_pred) + (1 - y_true) * K.log(1 - y_pred)) 

Không reshapes thêm nhu cầu.

Các vấn đề liên quan