2016-05-08 26 views
58

Theo như tôi biết, Variable là hoạt động mặc định để tạo biến và get_variable được sử dụng chủ yếu để chia sẻ trọng lượng.Sự khác biệt giữa Biến và get_variable trong TensorFlow

Một mặt, có một số người đề xuất sử dụng get_variable thay vì hoạt động nguyên thủy Variable bất cứ khi nào bạn cần một biến. Mặt khác, tôi chỉ thấy bất kỳ việc sử dụng get_variable trong các tài liệu và bản trình diễn chính thức của TensorFlow.

Vì vậy, tôi muốn biết một số quy tắc về cách sử dụng chính xác hai cơ chế này. Có bất kỳ nguyên tắc "chuẩn" nào không?

+4

get_variable là phương pháp mới, biến là cách cũ (mà có thể được hỗ trợ mãi mãi) như Lukasz nói (PS : ông đã viết nhiều về phạm vi tên biến trong TF) –

Trả lời

56

Tôi khuyên bạn nên luôn sử dụng tf.get_variable(...) - nó sẽ giúp bạn dễ dàng tái cấu trúc mã của mình hơn nếu bạn cần chia sẻ các biến bất kỳ lúc nào, ví dụ: trong cài đặt đa CPU (xem ví dụ CIFAR đa CPU). Không có nhược điểm với nó.

Tinh khiết tf.Variable là cấp thấp hơn; tại một số điểm tf.get_variable() không tồn tại nên một số mã vẫn sử dụng cách cấp thấp.

+3

Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Nhưng tôi vẫn có một câu hỏi về cách thay thế 'tf.Variable' bằng' tf.get_variable' ở mọi nơi. Đó là khi tôi muốn khởi tạo một biến với một mảng numpy, tôi không thể tìm thấy một cách sạch sẽ và hiệu quả làm nó như tôi làm với 'tf.Variable'. Làm thế nào để bạn giải quyết nó? Cảm ơn. –

38

tf.Variable là một lớp và có một số cách để tạo tf.Variable bao gồm tf.Variable .__ init__ và tf.get_variable.

tf.Variable .__ init__: Tạo biến mới với initial_value.

W = tf.Variable(<initial-value>, name=<optional-name>) 

tf.get_variable: Nhận biến hiện tại với các thông số này hoặc tạo một biến mới. Bạn cũng có thể sử dụng bộ khởi tạo.

W = tf.get_variable(name, shape=None, dtype=tf.float32, initializer=None, 
     regularizer=None, trainable=True, collections=None) 

Nó rất hữu ích để sử dụng initializers như xavier_initializer:

W = tf.get_variable("W", shape=[784, 256], 
     initializer=tf.contrib.layers.xavier_initializer()) 

Thông tin chi tiết tại https://www.tensorflow.org/versions/r0.8/api_docs/python/state_ops.html#Variable.

+0

Có, bằng 'Biến 'thực sự tôi có nghĩa là sử dụng' __init__' của nó. Vì 'get_variable' rất tiện lợi, tôi tự hỏi tại sao hầu hết mã TensorFlow tôi thấy sử dụng' Biến' thay vì 'get_variable'. Có bất kỳ quy ước hoặc yếu tố nào cần xem xét khi lựa chọn giữa chúng hay không. Cảm ơn bạn! –

+0

Nếu bạn muốn có một giá trị nhất định, sử dụng Biến là đơn giản: x = tf.Variable (3). –

+0

@SungKim bình thường khi chúng ta sử dụng 'tf.Variable()', chúng ta có thể khởi tạo nó như một giá trị ngẫu nhiên từ một phân phối chuẩn bị cắt ngắn. Đây là ví dụ của tôi 'w1 = tf.Variable (tf.truncated_normal ([5, 50], stddev = 0,01), name = 'w1')'. Điều gì tương đương với điều này? làm thế nào để tôi nói với tôi rằng tôi muốn cắt ngắn bình thường? Tôi chỉ nên làm 'w1 = tf.get_variable (tên = 'w1', hình dạng = [5,50], initializer = tf.truncated_normal, regularizer = tf.nn.l2_loss)'? –

18

tôi có thể tìm thấy hai khác biệt chính giữa một và khác:

  1. Đầu tiên là tf.Variable sẽ luôn tạo một biến mới, cho dù tf.get_variable nhận được từ đồ thị một biến đang tồn tại với những thông số, và nếu nó không tồn tại, nó tạo ra một cái mới.

  2. tf.Variable yêu cầu chỉ định giá trị ban đầu.

Điều quan trọng là phải làm rõ rằng hàm tf.get_variable tiền tố tên với phạm vi biến hiện tại để thực hiện kiểm tra tái sử dụng. Ví dụ:

with tf.variable_scope("one"): 
    a = tf.get_variable("v", [1]) #a.name == "one/v:0" 
with tf.variable_scope("one"): 
    b = tf.get_variable("v", [1]) #ValueError: Variable one/v already exists 
with tf.variable_scope("one", reuse = True): 
    c = tf.get_variable("v", [1]) #c.name == "one/v:0" 

with tf.variable_scope("two"): 
    d = tf.get_variable("v", [1]) #d.name == "two/v:0" 
    e = tf.Variable(1, name = "v", expected_shape = [1]) #e.name == "two/v_1:0" 

assert(a is c) #Assertion is true, they refer to the same object. 
assert(a is d) #AssertionError: they are different objects 
assert(d is e) #AssertionError: they are different objects 

Lỗi xác nhận cuối cùng thú vị: Hai biến có cùng tên trong cùng phạm vi được cho là cùng một biến.Nhưng nếu bạn thử nghiệm những cái tên của các biến de bạn sẽ nhận ra rằng Tensorflow thay đổi tên của biến e:

d.name #d.name == "two/v:0" 
e.name #e.name == "two/v_1:0" 
+0

Ví dụ tuyệt vời! Về 'd.name' và' e.name', tôi vừa xem qua [tài liệu TensorFlow này về hoạt động đặt tên biểu đồ tensor] (https://www.tensorflow.org/programmers_guide/graphs#naming_operations) giải thích nó : 'Nếu biểu đồ mặc định đã chứa một hoạt động có tên là" câu trả lời ", TensorFlow sẽ thêm" _1 "," _2 ", v.v. vào tên, để làm cho nó độc đáo.' – Atlas7

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