2016-04-10 18 views
26

Tôi có một số biến được tạo ra trong một phạm vi nhất định như thế này:Tensorflow nhận được tất cả các biến trong phạm vi

with tf.variable_scope("my_scope"): 
    createSomeVariables() 
    ... 

sau đó tôi muốn có được danh sách của tất cả các biến trong "my_scope" để tôi có thể vượt qua nó để một trình tối ưu hóa. Cách đúng để làm điều này là gì?

Trả lời

54

Tôi nghĩ bạn muốn tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='my_scope'). Điều này sẽ nhận được tất cả các biến trong một phạm vi.

Để chuyển đến trình tối ưu hóa, bạn không muốn tất cả các biến số bạn sẽ chỉ muốn các biến có thể đào tạo. Chúng cũng được lưu giữ trong bộ sưu tập mặc định, là tf.GraphKeys.TRAINABLE_VARIABLES.

+17

'tf.GraphKeys.VARIABLES' không được dùng nữa trong v0.12 (như tôi đã học được từ câu trả lời này: http://stackoverflow.com/a/40918792/1827383). Thay vào đó, hãy sử dụng 'tf.GraphKeys.GLOBAL_VARIABLES'. –

+0

bạn có phải tạo ra một op ra khỏi đó và sau đó chạy nó trong một phiên? Có vẻ như mã không đầy đủ, bạn có nghĩ là nó tự chứa nó không? –

+0

Cảm ơn câu trả lời của bạn! Làm thế nào về tình trạng này: có hai phạm vi phụ 'tf.variable_scope (1)' và 'tf.variable_scope (2nd)' bên trong một phạm vi 'tf.variable_scope (chính)' và tôi muốn nhận được hai danh sách các phạm vi '1' và '2' để tối ưu hóa riêng biệt. – ytutow

8

Người dùng đã chỉ ra chính xác rằng bạn cần tf.get_collection(). Tôi sẽ chỉ đưa ra một ví dụ đơn giản như thế nào để làm điều này:

import tensorflow as tf 

with tf.name_scope('some_scope1'): 
    a = tf.Variable(1, 'a') 
    b = tf.Variable(2, 'b') 
    c = tf.Variable(3, 'c') 

with tf.name_scope('some_scope2'): 
    d = tf.Variable(4, 'd') 
    e = tf.Variable(5, 'e') 
    f = tf.Variable(6, 'f') 

h = tf.Variable(8, 'h') 

for i in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='some_scope'): 
    print i # i.name if you want just a name 

Chú ý rằng bạn có thể cung cấp bất kỳ graphKeys và phạm vi là một biểu thức chính quy:

phạm vi: (. Tùy chọn) Nếu được cung cấp, danh sách kết quả được lọc thành chỉ bao gồm các mục có thuộc tính tên khớp với re.match. Các mặt hàng không có thuộc tính tên sẽ không bao giờ được trả về nếu phạm vi được cung cấp và lựa chọn hoặc sắp xếp lại có nghĩa là phạm vi không có mã đặc biệt bộ lọc theo tiền tố.

Vì vậy, nếu bạn sẽ vượt qua 'some_scope', bạn sẽ nhận được 6 biến.

+0

nếu tôi muốn đặt tất cả các biến khác trong một bộ sưu tập riêng biệt. Ví dụ, GLOBAL_VARIABLES chứa một thông qua h, và 'some_scope' kết thúc bằng một f, nhưng sau đó tôi muốn có một thao tác thứ hai mà chỉ nhận được bất cứ thứ gì không có trong bộ sưu tập khác của tôi (không sử dụng regex) – reese0106

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