2016-11-29 24 views
11

Trước hết, tôi biết rằng một câu hỏi liên quan đã được hỏi here.Sự khác biệt thực hiện giữa TensorFlow Variable và TensorFlow Tensor

Tuy nhiên, câu hỏi này là về việc triển khai và nội bộ. Tôi đã đọc bài báo "A Tour of TensorFlow". Hai điểm sau đây được trích dẫn từ đó:

1.

Một tensor bản thân không giữ hoặc giá trị lưu trữ trong bộ nhớ, nhưng cung cấp chỉ một giao diện để lấy giá trị tham chiếu bởi tensor.

Điều này cho thấy rằng Tensor là một đối tượng đơn giản lưu trữ con trỏ đến kết quả của một thao tác và, khi truy xuất kết quả hoặc giá trị của tensor, nó chỉ đơn giản là dereferences con trỏ.

2.

Các biến có thể được mô tả như dai dẳng, tay cầm có thể thay đổi để bộ đệm trong bộ nhớ lưu trữ tensors. Như vậy, các biến được đặc trưng bởi một hình dạng nhất định và một loại cố định.

Tại đây tôi bị lẫn lộn vì tôi nghĩ, dựa trên điểm trước đó, Tensors chỉ lưu trữ một con trỏ. Nếu chúng chỉ đơn giản là con trỏ, chúng cũng có thể biến đổi được.

Để được chính xác đây là những câu hỏi của tôi:

  1. ý nghĩa của "bộ đệm trong bộ nhớ" là gì?
  2. Ý nghĩa của "xử lý" là gì?
  3. Giả thiết ban đầu của tôi về nội bộ của một tensor có đúng không?
  4. Sự khác biệt thực hiện nội bộ cần thiết giữa một tensor và một biến là gì? Tại sao họ lại tuyên bố khác biệt và tại sao sự khác biệt đó lại quan trọng đối với TensorFlow?

Trả lời

34

Trước khi giải thích sự khác biệt giữa tensors và các biến, chúng ta nên chính xác về những gì từ "tensor" có nghĩa là trong bối cảnh TensorFlow:

  • Trong API Python, một đối tượng tf.Tensor đại diện cho kết quả biểu tượng của một hoạt động TensorFlow. Ví dụ: trong biểu thức t = tf.matmul(x, y), t là đối tượng tf.Tensor thể hiện kết quả nhân xy (có thể là kết quả biểu tượng của các hoạt động khác, giá trị cụ thể như mảng NumPy hoặc biến).

    Trong ngữ cảnh này, "kết quả tượng trưng" phức tạp hơn con trỏ đến kết quả của một thao tác. Nó tương tự với đối tượng hàm, khi được gọi (tức là được chuyển đến tf.Session.run()) sẽ chạy tính toán cần thiết để tạo kết quả của hoạt động đó và trả lại cho bạn dưới dạng giá trị cụ thể (ví dụ: mảng NumPy).

  • Trong C++ API, đối tượng tensorflow::Tensor đại diện cho giá trị cụ thể của mảng đa chiều. Ví dụ: hạt nhân MatMul lấy hai đối tượng hai chiều tensorflow::Tensor làm đầu vào và tạo đối tượng tensorflow::Tensor hai chiều duy nhất làm đầu ra.

Sự khác biệt này là một chút bối rối, và chúng ta có thể chọn tên gọi khác nhau, nếu chúng ta bắt đầu trên (trong API ngôn ngữ khác, chúng tôi thích tên Output cho một kết quả mang tính biểu tượng và Tensor cho một giá trị cụ thể).

Sự khác biệt tương tự tồn tại đối với các biến. Trong API Python, một tf.Variable là biểu diễn tượng trưng của một biến, có các phương thức để tạo các phép toán đọc giá trị hiện tại của biến và gán các giá trị cho biến đó. Trong việc thực hiện C++, một đối tượng tensorflow::Var là một trình bao bọc xung quanh đối tượng chia sẻ, có thể biến đổi tensorflow::Tensor.

Với bối cảnh đó ra đường đi, chúng ta có thể giải quyết những câu hỏi cụ thể của bạn:

  1. ý nghĩa của "bộ đệm trong bộ nhớ" là gì?

    Bộ đệm trong bộ nhớ đơn giản là vùng tiếp giáp của bộ nhớ đã được cấp phát bằng bộ phân bổ TensorFlow. Các đối tượng tensorflow::Tensor chứa một con trỏ tới bộ đệm trong bộ nhớ, giữ các giá trị của bộ tensor đó. Bộ đệm có thể nằm trong bộ nhớ máy chủ (ví dụ: có thể truy cập từ CPU) hoặc bộ nhớ thiết bị (ví dụ: chỉ có thể truy cập từ GPU) và TensorFlow có các hoạt động để di chuyển dữ liệu giữa các không gian bộ nhớ này.

  2. Ý nghĩa của "xử lý" là gì?

    Trong phần giải thích trong the paper, từ "xử lý" được sử dụng theo một vài cách khác nhau, hơi khác so với cách TensorFlow sử dụng cụm từ. Bài báo sử dụng "xử lý tượng trưng" để chỉ đối tượng tf.Tensor và "xử lý có thể thay đổi liên tục" để tham chiếu đến đối tượng tf.Variable. Các codebase TensorFlow sử dụng "handle" để chỉ một tên cho một đối tượng stateful (như tf.FIFOQueue hoặc tf.TensorArray) có thể được truyền xung quanh mà không cần sao chép tất cả các giá trị (ví dụ:).

  3. Giả thiết ban đầu của tôi về nội bộ của một tensor có đúng không?

    Giả định của bạn phù hợp nhất với định nghĩa của đối tượng (C++) tensorflow::Tensor. Đối tượng (Python) tf.Tensor phức tạp hơn vì nó đề cập đến một hàm để tính toán một giá trị, chứ không phải là giá trị của chính nó.

  4. Sự khác nhau giữa việc thực hiện nội bộ giữa một tensor và một biến là gì?

    Trong C++, tensorflow::Tensortensorflow::Var rất giống nhau; khác nhau duy nhất là tensorflow::Var cũng có một mutex có thể được sử dụng để khóa biến khi nó đang được cập nhật.

    Trong Python, sự khác biệt cơ bản là tf.Tensor được triển khai dưới dạng biểu đồ dữ liệu và chỉ đọc (tức là bằng cách gọi tf.Session.run()). Một tf.Variable có thể được đọc cả hai (tức là bằng cách đánh giá hoạt động đọc của nó) và được viết (ví dụ: bằng cách chạy một phép gán).

    Tại sao chúng được khai báo khác nhau và tại sao sự khác biệt đó lại quan trọng đối với TensorFlow?

    Vòng đệm và biến phục vụ các mục đích khác nhau. Tensors (tf.Tensor đối tượng) có thể đại diện cho các tác phẩm phức tạp của các biểu thức toán học, như các hàm mất trong mạng nơron hoặc các gradient biểu tượng. Các biến đại diện cho trạng thái được cập nhật theo thời gian, như ma trận trọng lượng và bộ lọc chập trong quá trình đào tạo. Mặc dù về nguyên tắc, bạn có thể đại diện cho trạng thái phát triển của mô hình không có biến, bạn sẽ kết thúc với biểu thức toán học rất lớn (và lặp lại), do đó các biến cung cấp cách thuận tiện để mô tả trạng thái của mô hình và — ví dụ: — nó với các máy khác để đào tạo song song.

+0

Đó là một lời giải thích rất thông tin và cảm ơn vì điều đó. Nếu tôi hiểu chính xác, trạng thái chỉ đọc của tensors rất hữu ích vì chúng được sử dụng để biểu diễn các phép toán trung gian mà không quan tâm đến trạng thái cuối cùng của mô hình. Đó là lý do tương tự, tại sao chúng tôi lưu trữ hạt nhân của các tham số convolution như tf.Variable để nó có thể được viết sau này trong các bản cập nhật và được lưu trữ sau này? – Ujjwal

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