2016-07-20 19 views
5

Tôi đang làm việc với dữ liệu cực kỳ ồn ào đôi khi bị rải rác với các ngoại lệ, vì vậy tôi dựa chủ yếu vào sự tương quan như một thước đo độ chính xác trong NN của tôi.Có thể sử dụng Rank Correlation như chức năng chi phí trong TensorFlow không?

Có thể sử dụng một cái gì đó tương tự như xếp hạng tương quan (hệ số tương quan Spearman) làm chức năng chi phí của tôi không? Cho đến bây giờ, tôi đã dựa chủ yếu vào MSE như một proxy cho sự tương quan.

tôi có ba trở ngại lớn ngay bây giờ:

1) Khái niệm xếp hạng trở nên fuzzier nhiều với mini-lô.

2) Bạn tự động thực hiện xếp hạng như thế nào? Sẽ TensorFlow không có một lỗi gradient/không thể theo dõi như thế nào một sự thay đổi trong một trọng lượng/thiên vị ảnh hưởng đến chi phí?

3) Làm thế nào để bạn xác định kích thước của các tensors bạn đang xem trong thời gian chạy?

Ví dụ: mã bên dưới là điều tôi muốn làm nếu tôi chỉ sử dụng mối tương quan. Trong thực tế, chiều dài cần phải được thông qua thay vì được xác định trong thời gian chạy.

length = tf.shape(x)[1] ## Example code. This line not meant to work. 

original_loss = -1 * length * tf.reduce_sum(tf.mul(x, y)) - (tf.reduce_sum(x) * tf.reduce_sum(y)) 
divisor = tf.sqrt(
    (length * tf.reduce_sum(tf.square(x)) - tf.square(tf.reduce_sum(x))) * 
    (length * tf.reduce_sum(tf.square(y)) - tf.square(tf.reduce_sum(y))) 
) 
original_loss = tf.truediv(original_loss, divisor) 

Trả lời

1

Đây là mã cho mối tương quan Spearman:

predictions_rank = tf.nn.top_k(predictions_batch, k=samples, sorted=True, name='prediction_rank').indices 
real_rank = tf.nn.top_k(real_outputs_batch, k=samples, sorted=True, name='real_rank').indices 
rank_diffs = predictions_rank - real_rank 
rank_diffs_squared_sum = tf.reduce_sum(rank_diffs * rank_diffs) 
six = tf.constant(6) 
one = tf.constant(1.0) 
numerator = tf.cast(six * rank_diffs_squared_sum, dtype=tf.float32) 
divider = tf.cast(samples * samples * samples - samples, dtype=tf.float32) 
spearman_batch = one - numerator/divider 

Vấn đề với mối tương quan Spearman là bạn cần phải sử dụng một thuật toán sắp xếp (top_k trong mã của tôi). Và không có cách nào để dịch nó thành giá trị thua lỗ. Không có derivade của một thuật toán phân loại. Bạn có thể sử dụng một mối tương quan bình thường nhưng tôi nghĩ rằng không có sự khác biệt về mặt toán học để sử dụng sai số bình phương trung bình.

Tôi đang làm việc này ngay bây giờ cho hình ảnh. Những gì tôi đã đọc trong các giấy tờ mà họ sử dụng để thêm thứ hạng vào chức năng mất là so sánh 2 hoặc 3 hình ảnh (nơi tôi nói hình ảnh bạn có thể nói bất cứ điều gì bạn muốn xếp hạng).

So sánh hai yếu tố:

enter image description here

enter image description here

đâu N là tổng số của các yếu tố và alpha một giá trị lợi nhuận. Tôi nhận được phương trình này từ Photo Aesthetics Ranking Network with Attributes and Content Adaptation

Bạn cũng có thể sử dụng lỗ với 3 elemens nơi bạn so sánh hai trong số họ với thứ hạng tương tự với nhau với một khác nhau một:

enter image description here

Nhưng trong phương trình này bạn cũng có cần thêm hướng của bảng xếp hạng, chi tiết hơn trong Will People Like Your Image?. Trong trường hợp của bài báo này, họ sử dụng một mã hóa vectơ thay vì một giá trị thực nhưng bạn cũng có thể thực hiện nó chỉ với một số.

Trong trường hợp hình ảnh, sự so sánh giữa các hình ảnh có ý nghĩa hơn khi những hình ảnh đó có liên quan. Vì vậy, bạn nên chạy thuật toán phân cụm để tạo (có thể?) 10 cụm, vì vậy bạn có thể sử dụng các phần tử của cùng một cụm để so sánh thay vì những thứ rất khác nhau. Điều này sẽ giúp mạng như các yếu tố đầu vào có liên quan bằng cách nào đó và không hoàn toàn khác nhau.

Lưu ý rằng bạn nên biết điều gì quan trọng hơn đối với bạn, nếu đó là thứ tự xếp hạng cuối cùng hoặc giá trị xếp hạng. Nếu đó là giá trị bạn nên đi với sai số trung bình, nếu đó là thứ tự xếp hạng bạn có thể sử dụng các khoản lỗ tôi đã viết trước đây. Hoặc bạn thậm chí có thể kết hợp chúng.

Làm cách nào để xác định kích thước của các tensors bạn đang xem trong thời gian chạy?

tf.shape(tensor) trả về hình chữ nhật có hình dạng. Sau đó, bạn có thể sử dụng tf.gather(tensor,index) để nhận giá trị bạn muốn.

+0

Tôi đang cố gắng sao chép mạng đánh giá hình ảnh sử dụng Spearman Correlations làm chỉ số đánh giá. Nó có ý nghĩa để chạy Spearman Correlation đối với một mini-batch không? Nếu vậy, làm thế nào để bạn tổng hợp các kết quả để có được một con số cuối cùng? – michael

+0

@michael Tôi nhận được các kết quả rất khác nhau từ lô nhỏ đến tập dữ liệu hoàn chỉnh. Nó có thể cung cấp cho bạn một số thông tin chi tiết về xu hướng chứ không phải về giá trị cuối cùng. Bạn không thể tổng hợp kết quả của lô nhỏ để tính toán kết quả cuối cùng, bạn phải làm điều đó với toàn bộ tập dữ liệu (tôi sử dụng mã python bình thường cho điều này). – jorgemf

+0

đó là phỏng đoán của tôi, nhưng tôi không phải là chuyên gia về chủ đề này. cảm ơn. – michael

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