2015-12-29 40 views
7

Tôi có một mạng nơron sâu nơi trọng số giữa các lớp được lưu trữ trong một danh sách.tổng hợp trên một danh sách các tensors trong tensorflow

layers[j].weights Tôi muốn bao gồm hình phạt sườn núi trong hàm chi phí của mình. Sau đó, tôi cần sử dụng một cái gì đó như tf.nn.l2_loss(layers[j].weights**2 for j in range(self.n_layers)) tức là tổng bình phương của tất cả các trọng số.

Đặc biệt các trọng số được định nghĩa là:

>>> avs.layers 
[<neural_network.Layer object at 0x10a4b2a90>, <neural_network.Layer object at 0x10ac85080>, <neural_network.Layer object at 0x10b0f3278>, <neural_network.Layer object at 0x10b0eacf8>, <neural_network.Layer object at 0x10b145588>, <neural_network.Layer object at 0x10b165048>, <neural_network.Layer object at 0x10b155ba8>] 
>>> 
>>> avs.layers[0].weights 
<tensorflow.python.ops.variables.Variable object at 0x10b026748> 
>>> 

Làm thế nào tôi có thể làm điều đó trong tensorflow?

+0

Tôi nghĩ bạn cần tạo ra một tensor mới trong số những trọng số đó và sử dụng nó trong phương trình chi phí. – fabrizioM

Trả lời

16

Cách tiêu chuẩn để tổng hợp danh sách các tensors là sử dụng thao tác tf.add_n(), lấy danh sách các tensors (mỗi có cùng kích thước và hình dạng) và tạo ra một tensor đơn chứa tổng.

Đối với vấn đề cụ thể mà bạn có, tôi giả định rằng mỗi layers[j].weights có thể có kích thước khác. Do đó, bạn sẽ cần giảm từng phần tử xuống một vô hướng trước khi tổng hợp, ví dụ: sử dụng tf.nn.l2_loss() chức năng chính:

weights = [layers[j].weights for j in range(self.n_layers)] 
losses = [tf.nn.l2_loss(w) for w in weights] 
total_loss = tf.add_n(losses) 

(Tuy nhiên lưu ý rằng khi các giá trị được bổ sung lớn, bạn có thể tìm thấy nó hiệu quả hơn để tính toán một chuỗi các tf.add() hoạt động, kể từ TensorFlow giữ các giá trị của mỗi add_n đối số trong bộ nhớ cho đến khi tất cả trong số họ đã được tính toán. một chuỗi các add ops cho phép một số các tính toán để xảy ra trước đó.)

0

chức năng tf.nn.l2_loss() trả về một tensor với 0 chiều. Nhưng nó là tốt đẹp để không cần phải tự áp dụng cho mỗi trọng lượng tensor, do đó, lưu trữ trọng lượng tensors trong một danh sách là một cách để giải quyết vấn đề (như @ mrry lưu ý).

Nhưng thay vì cần phải viết rằng ra mọi thời gian, những gì bạn có thể làm là sử dụng chức năng sau

def l2_loss_sum(list_o_tensors): 
    return tf.add_n([tf.nn.l2_loss(t) for t in list_o_tensors]) 

Trong trường hợp của bạn này sẽ như thế nào:

total_loss = l2_loss_sum([layers[j].weights for j in range(self.n_layers)]) 

Ngoài ra, tf.nn.l2_loss() ngầm áp dụng các hoạt động bình phương với các giá trị cũng như nhân tất cả các giá trị bình phương bằng 1/2, do đó, bạn đã sử dụng một cái gì đó như tf.nn.l2_loss(layers[j].weights**2 for j in range(self.n_layers)) bạn thực sự sẽ nâng trọng số lên sức mạnh thứ tư. Kết quả là đạo hàm của thuật ngữ thua lỗ này sẽ là lạ: nó sẽ không hủy bỏ 1/2 đến 1 (nhưng hoàn toàn sẽ tăng gấp đôi β của bạn) và trọng số sẽ được lập phương.

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