2016-09-15 24 views
10

Tôi không chắc chắn về sự khác biệt thực tế giữa 4 biến thể dưới đây (tất cả đều đánh giá cùng một giá trị). Sự hiểu biết của tôi là nếu tôi gọi tf, nó sẽ tạo một thao tác trên biểu đồ và nếu không thì có thể. Nếu tôi không tạo ra các tf.constant() lúc đầu, tôi tin rằng các hằng số sẽ được tạo ra ngầm khi thực hiện việc bổ sung; nhưng đối với tf.add(a,b)a + b trong đó ab là cả Tensors (# 1 và # 3), tôi không thấy sự khác biệt ngoài đặt tên mặc định (trước đây là Add và cái sau là add). Bất cứ ai cũng có thể làm sáng tỏ sự khác biệt giữa những điều đó và khi nào thì ai nên sử dụng chúng?TensorFlow hoạt động đơn giản: tensors vs biến Python

## 1 
a = tf.constant(1) 
b = tf.constant(1) 
x = tf.add(a, b) 
with tf.Session() as sess: 
    x.eval() 

## 2 
a = 1 
b = 1 
x = tf.add(a, b) 
with tf.Session() as sess: 
    x.eval() 

## 3 
a = tf.constant(1) 
b = tf.constant(1) 
x = a + b 
with tf.Session() as sess: 
    x.eval() 

## 4 
a = 1 
b = tf.constant(1) 
x = a + b 
with tf.Session() as sess: 
    x.eval() 

Trả lời

11

Bốn ví dụ bạn đưa ra sẽ cho kết quả tương tự và tạo cùng một biểu đồ (nếu bạn bỏ qua một số tên hoạt động trong biểu đồ khác nhau). TensorFlow sẽ chuyển đổi nhiều đối tượng Python khác thành các đối tượng tf.Tensor khi chúng được chuyển làm đối số cho các toán tử TensorFlow, chẳng hạn như tf.add() tại đây. Toán tử + chỉ là một trình bao bọc đơn giản trên tf.add() và quá tải được sử dụng khi đối số bên trái hoặc bên phải là tf.Tensor (hoặc tf.Variable).

Cho rằng bạn chỉ có thể chuyển nhiều đối tượng Python cho các toán tử TensorFlow, tại sao bạn lại sử dụng tf.constant()? Có một vài lý do:

  • Nếu bạn sử dụng các đối tượng Python giống như tranh luận với nhiều hoạt động khác nhau, TensorFlow sẽ chuyển nó sang một tensor nhiều lần, và đại diện cho mỗi người trong số những tensors trong đồ thị. Vì vậy, nếu đối tượng Python của bạn là một mảng NumPy lớn, bạn có thể hết bộ nhớ nếu bạn tạo quá nhiều bản sao của dữ liệu của mảng đó.Trong trường hợp đó, bạn có thể muốn chuyển đổi mảng đến một tf.Tensor lần

  • Tạo một tf.constant() một cách rõ ràng cho phép bạn thiết lập thuộc tính name của nó, mà có thể hữu ích để gỡ lỗi TensorBoard và biểu đồ trực quan. (Lưu ý rằng mặc định các biến TensorFlow mặc định sẽ cố gắng đặt tên có ý nghĩa cho mỗi tensor được chuyển đổi tự động, dựa trên tên của đối số của op.)

  • rõ ràng cho phép bạn đặt loại phần tử chính xác của tensor. TensorFlow sẽ chuyển đổi các đối tượng Python int thành tf.int32float đối tượng thành tf.float32. Nếu bạn muốn tf.int64 hoặc tf.float64, bạn có thể nhận được điều này bằng cách chuyển cùng một giá trị cho tf.constant() và chuyển đối số dtype rõ ràng.

  • Chức năng tf.constant() cũng cung cấp một tính năng hữu ích khi tạo tensors lớn với một giá trị lặp đi lặp lại:

    c = tf.constant(17.0, shape=[1024, 1024], dtype=tf.float32) 
    

    Các tensor c trên đại diện cho 4 * 1024 * 1024 byte dữ liệu, nhưng TensorFlow sẽ đại diện cho nó gọn trong biểu đồ dưới dạng một phao đơn 17.0 thông tin hình dạng cộng thêm cho biết cách diễn giải nó. Nếu bạn có nhiều hằng số lớn, được lấp đầy trong biểu đồ của mình, có thể hiệu quả hơn khi tạo chúng theo cách này.

2

Chúng đều giống nhau.

Con trăn - '+' trong dấu + được chụp bởi lưu lượng và thực sự tạo ra cùng một op như tf.add (a, b).

Tf.conctant cho phép bạn biết thêm chi tiết cụ thể, chẳng hạn như xác định hình dạng, loại và tên của tensor đã tạo. Nhưng một lần nữa, dòng tensorflow sở hữu "a" trong ví dụ của bạn a = 1 và nó tương đương với tf.constant (1) (xử lý hằng số dưới dạng giá trị int trong trường hợp này)

2

Kết quả là giống nhau bởi vì mọi toán tử (add hoặc __add__ đó là tình trạng quá tải của +) gọi tf.convert_to_tensor trên các toán hạng của nó.

Sự khác biệt giữa tf.add(a + b)a + b là tên cũ cung cấp cho bạn khả năng đặt tên cho hoạt động với thông số name. Cái thứ hai, thay vào đó, không cung cấp cho bạn khả năng này và cũng làm cho nó có khả năng tính toán được thực hiện bởi trình thông dịch Python và không nằm ngoài nó, trong môi trường Tensorflow.

Điều này xảy ra nếu (và chỉ nếu) cả hai ab không phải là Tensor đối tượng và do đó Tensorflow sẽ không được tham gia vào tính toán.

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