Sự khác biệt giữa precision_softmax_cross_entropy_with_logits và softmax_cross_entropy_with_logits là gì?


111

Gần đây tôi đã xem tf.nn.sparse_softmax_cross_entropy_with_logits và tôi không thể tìm ra sự khác biệt là gì so với tf.nn.softmax_cross_entropy_with_logits .

Sự khác biệt duy nhất mà các vectơ đào tạo yphải được mã hóa một nóng khi sử dụng sparse_softmax_cross_entropy_with_logits?

Đọc API, tôi không thể tìm thấy bất kỳ sự khác biệt nào khác so với softmax_cross_entropy_with_logits. Nhưng tại sao chúng ta cần chức năng bổ sung sau đó?

Sẽ không softmax_cross_entropy_with_logitstạo ra kết quả giống như sparse_softmax_cross_entropy_with_logits, nếu nó được cung cấp với dữ liệu / vectơ đào tạo được mã hóa một nóng?


1
Tôi muốn xem so sánh hiệu suất của chúng nếu cả hai đều có thể được sử dụng (ví dụ: với nhãn hình ảnh độc quyền); Tôi hy vọng phiên bản thưa thớt sẽ hiệu quả hơn, ít nhất là về bộ nhớ.
Yibo Yang

1
Xem thêm câu hỏi này , thảo luận về tất cả các hàm entropy chéo trong tensorflow (hóa ra có rất nhiều trong số chúng).
Maxim

Câu trả lời:


175

Có hai chức năng khác nhau là một sự tiện lợi , vì chúng tạo ra cùng một kết quả.

Sự khác biệt rất đơn giản:

  • Đối với sparse_softmax_cross_entropy_with_logits, nhãn phải có hình dạng [batch_size] và kiểu dtype int32 hoặc int64. Mỗi nhãn là một số nguyên trong phạm vi [0, num_classes-1].
  • Đối với softmax_cross_entropy_with_logits, các nhãn phải có dạng [batch_size, num_classes] và dtype float32 hoặc float64.

Nhãn được sử dụng trong softmax_cross_entropy_with_logitsmột phiên bản phổ biến của nhãn được sử dụng trong sparse_softmax_cross_entropy_with_logits.

Một sự khác biệt nhỏ khác là với sparse_softmax_cross_entropy_with_logits, bạn có thể cho -1 làm nhãn để có mất mát 0trên nhãn này.


15
-1 có đúng không? Như tài liệu có nội dung: "Mỗi mục nhập trong nhãn phải là một chỉ mục trong [0, num_classes). Các giá trị khác sẽ tạo ra một ngoại lệ khi op này được chạy trên CPU và trả về NaN cho các hàng mất mát và gradient tương ứng trên GPU."
user1761806

1
[0, num_classes) = [0, num_classes-1]
Karthik C

24

Tôi chỉ muốn thêm 2 điều vào câu trả lời được chấp nhận mà bạn cũng có thể tìm thấy trong tài liệu TF.

Đầu tiên:

tf.nn.softmax_cross_entropy_with_logits

LƯU Ý: Mặc dù các lớp loại trừ lẫn nhau, nhưng xác suất của chúng không cần thiết. Tất cả những gì được yêu cầu là mỗi hàng nhãn là một phân phối xác suất hợp lệ. Nếu không, việc tính toán gradient sẽ không chính xác.

Thứ hai:

tf.nn.sparse_softmax_cross_entropy_with_logits

LƯU Ý: Đối với thao tác này, xác suất của một nhãn nhất định được coi là độc quyền. Nghĩa là, các lớp mềm không được phép và vectơ nhãn phải cung cấp một chỉ mục cụ thể duy nhất cho lớp thực cho mỗi hàng nhật ký (mỗi mục nhập minibatch).


4
Chúng ta nên sử dụng gì nếu các lớp không loại trừ lẫn nhau. Ý tôi là nếu chúng ta đang kết hợp nhiều nhãn phân loại?
Hayro

Tôi cũng đã đọc cái này. Vì vậy, nó có nghĩa là chúng ta áp dụng xác suất lớp trên entropy chéo thay vì coi nó như một vectơ onehot.
Shamane Siriwardhana

@Hayro - Ý bạn là bạn không thể thực hiện một mã hóa nóng? Tôi nghĩ bạn sẽ phải nhìn vào một mô hình khác. Điều này đã đề cập đến một cái gì đó như "sẽ thích hợp hơn nếu xây dựng 4 bộ phân loại hồi quy logistic nhị phân" Để trước tiên đảm bảo rằng bạn có thể tách các lớp.
ashley

21

Cả hai hàm đều tính toán các kết quả giống nhau và precision_softmax_cross_entropy_with_logits tính toán entropy chéo trực tiếp trên các nhãn thưa thớt thay vì chuyển đổi chúng bằng mã hóa một lần .

Bạn có thể xác minh điều này bằng cách chạy chương trình sau:

import tensorflow as tf
from random import randint

dims = 8
pos  = randint(0, dims - 1)

logits = tf.random_uniform([dims], maxval=3, dtype=tf.float32)
labels = tf.one_hot(pos, dims)

res1 = tf.nn.softmax_cross_entropy_with_logits(       logits=logits, labels=labels)
res2 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=tf.constant(pos))

with tf.Session() as sess:
    a, b = sess.run([res1, res2])
    print a, b
    print a == b

Ở đây tôi tạo một logitsvectơ có độ dài ngẫu nhiên dimsvà tạo các nhãn được mã hóa một lần (trong đó phần tử trong poslà 1 và các phần tử khác là 0).

Sau đó, tôi tính toán softmax và softmax thưa thớt và so sánh đầu ra của chúng. Hãy thử chạy lại một vài lần để đảm bảo rằng nó luôn tạo ra cùng một đầu ra

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.