2015-12-12 42 views
54

Trong MNIST beginner tutorial, có accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))Sự khác nhau giữa np.mean và tf.reduce_mean trong Numpy và Tensorflow?

tf.cast về cơ bản thay đổi loại tensor đối tượng là, nhưng sự khác biệt giữa tf.reduce_meannp.mean là gì?

Đây là doc trên tf.reduce_mean:

reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None) 
input_tensor: The tensor to reduce. Should have numeric type. 
reduction_indices: The dimensions to reduce. If `None` (the defaut), 
    reduces all dimensions. 

# 'x' is [[1., 1. ]] 
#   [2., 2.]] 
tf.reduce_mean(x) ==> 1.5 
tf.reduce_mean(x, 0) ==> [1.5, 1.5] 
tf.reduce_mean(x, 1) ==> [1., 2.] 

Đối với một vector 1D, nó trông giống như np.mean == tf.reduce_mean nhưng tôi không hiểu những gì đang xảy ra trong tf.reduce_mean(x, 1) ==> [1., 2.]. tf.reduce_mean(x, 0) ==> [1.5, 1.5] loại có ý nghĩa, vì trung bình của [1,2] và [1,2] là [1,5,1,5] nhưng điều gì đang xảy ra với tf.reduce_mean(x,1)?

+0

họ sản xuất [kết quả khác nhau trên các giá trị số nguyên] (http://stackoverflow.com/a/43713062/1090562) do bộ phận trong python –

Trả lời

67

Chức năng của numpy.meantensorflow.reduce_mean đều giống nhau. Họ làm điều tương tự. Từ tài liệu, cho numpytensorflow, bạn có thể thấy điều đó. Cho phép xem xét một ví dụ,

c = np.array([[3.,4], [5.,6], [6.,7]]) 
print(np.mean(c,1)) 

Mean = tf.reduce_mean(c,1) 
with tf.Session() as sess: 
    result = sess.run(Mean) 
    print(result) 

Output

[ 3.5 5.5 6.5] 
[ 3.5 5.5 6.5] 

Ở đây bạn có thể thấy rằng khi axis (NumPy) hoặc reduction_indices (tensorflow) là 1, nó tính có nghĩa là trên (3,4) và (5,6) và (6,7), do đó, 1 xác định trên trục nào được tính trung bình. Khi nó bằng 0, giá trị trung bình được tính trên (3,5,6) và (4,6,7), v.v. Tôi hy vọng bạn có được ý tưởng.

Bây giờ sự khác nhau giữa chúng là gì?

Bạn có thể tính toán thao tác gọn gàng ở bất kỳ đâu trên trăn. Nhưng để thực hiện một hoạt động tensorflow, nó phải được thực hiện bên trong một tensorflow Session. Bạn có thể đọc thêm về nó here. Vì vậy, khi bạn cần phải thực hiện bất kỳ tính toán cho đồ thị tensorflow của bạn (hoặc cấu trúc nếu bạn sẽ), nó phải được thực hiện bên trong một tensorflow Session.

Hãy xem ví dụ khác.

npMean = np.mean(c) 
print(npMean+1) 

tfMean = tf.reduce_mean(c) 
Add = tfMean + 1 
with tf.Session() as sess: 
    result = sess.run(Add) 
    print(result) 

Chúng ta có thể tăng trung bình bởi 1 trong numpy như bạn làm một cách tự nhiên, nhưng để làm điều đó trong tensorflow, bạn cần phải thực hiện điều đó trong Session, mà không sử dụng Session bạn không thể làm điều đó. Nói cách khác, khi bạn đang tính toán tfMean = tf.reduce_mean(c), sau đó lưu lượng sẽ không tính toán được. Nó chỉ tính toán trong một số Session. Nhưng tính toán gumpy ngay lập tức, khi bạn viết np.mean().

Tôi hy vọng điều đó có ý nghĩa.

+3

nhưng ** ** ** có nghĩa là gì ** ở đây? – rsht

+9

@Roman nó là một thuật ngữ từ lập trình hàm. bạn có thể đọc về nó ở đây: http://www.python-course.eu/lambda.php – Daniyar

0

1 thường đề cập đến các hàng và 2 thường đề cập đến các cột. Việc giảm chỉ số "trên" 1 có nghĩa là giảm hàng rào.

[1., 2.] chỉ là [ <row 1 mean> , <row 2 mean> ].

Chỉ số này ước đánh số là điển hình trong phần mềm thống kê, đặc biệt là R.

+0

Tôi tin 0 đề cập vào cột, không phải 2 – hfz

1

Tài liệu mới nêu rõ rằng tf.reduce_mean() sẽ tạo ra kết quả tương tự như np.có nghĩa là:

Tương đương với np.mean

Nó cũng có hoàn toàn các thông số tương tự như np.mean. Nhưng đây là một sự khác biệt quan trọng: họ tạo ra kết quả tương tự chỉ trên phao các giá trị:

import tensorflow as tf 
import numpy as np 
from random import randint 

num_dims = 10 
rand_dim = randint(0, num_dims - 1) 
c = np.random.randint(50, size=tuple([5] * num_dims)).astype(float) 

with tf.Session() as sess: 
    r1 = sess.run(tf.reduce_mean(c, rand_dim)) 
    r2 = np.mean(c, rand_dim) 
    is_equal = np.array_equal(r1, r2) 
    print is_equal 
    if not is_equal: 
     print r1 
     print r2 

Nếu bạn sẽ loại bỏ loại chuyển đổi, bạn sẽ thấy kết quả khác nhau


Trong bổ sung này, nhiều chức năng khác của tf.reduce_ chẳng hạn như reduce_all, reduce_any, reduce_min, reduce_max, reduce_prod sản xuất các giá trị giống như có các thông số tương tự. Rõ ràng vì chúng là các hoạt động, chúng có thể được thực hiện chỉ từ bên trong phiên.

3

Chìa khóa ở đây là từ giảm, một khái niệm từ lập trình chức năng, làm cho nó có thể cho reduce_mean trong TensorFlow để duy trì mức trung bình của các kết quả tính toán từ một loạt các đầu vào.

Nếu bạn không quen với lập trình hàm, điều này có vẻ bí ẩn. Vì vậy, trước tiên chúng ta hãy xem những gì làm giảm. Nếu bạn được đưa ra một danh sách như [1,2,5,4] và được yêu cầu tính giá trị trung bình, điều đó thật dễ dàng - chỉ cần chuyển toàn bộ mảng tới np.mean và bạn nhận được giá trị trung bình. Tuy nhiên, nếu bạn phải tính giá trị trung bình của một dòng số? Trong trường hợp đó, trước tiên bạn phải lắp ráp mảng bằng cách đọc từ luồng và sau đó gọi np.mean trên mảng kết quả - bạn sẽ phải viết thêm một số mã.

Cách khác là sử dụng mô hình giảm. Ví dụ, hãy xem cách chúng ta có thể sử dụng giảm trong python để tính tổng số: reduce(lambda x,y: x+y, [1,2,5,4]).

Nó hoạt động như thế này:

  1. Bước 1: Đọc 2 chữ số từ danh sách - 1,2. Đánh giá lambda 1,2. giảm lưu trữ kết quả 3. Lưu ý - đây là bước duy nhất có 2 chữ số được đọc khỏi danh sách
  2. Bước 2: Đọc chữ số tiếp theo từ danh sách - 5. Đánh giá lambda 5, 3 (3 là kết quả từ bước 1 , mà giảm được lưu trữ). giảm các cửa hàng kết quả 8.
  3. Bước 3: Đọc chữ số tiếp theo trong danh sách - 4. Đánh giá lambda 8,4 (8 là kết quả của bước 2, giúp giảm lưu trữ). giảm lưu trữ kết quả 12
  4. Bước 4: Đọc các chữ số tiếp theo trong danh sách - không có, nên trả lại kết quả lưu trữ của 12.

đọc thêm ở đây Functional Programming in Python

Để xem cách này áp dụng đến TensorFlow, hãy nhìn vào khối mã sau đây, xác định một biểu đồ đơn giản, lấy một phao và tính giá trị trung bình. Tuy nhiên, đầu vào cho đồ thị không phải là một phao đơn lẻ mà là một mảng nổi. Hàm reduce_mean tính toán giá trị trung bình trên tất cả các float đó.

import tensorflow as tf 


inp = tf.placeholder(tf.float32) 
mean = tf.reduce_mean(inp) 

x = [1,2,3,4,5] 

with tf.Session() as sess: 
    print(mean.eval(feed_dict={inp : x})) 

Mẫu này có ích khi tính giá trị qua nhiều đợt hình ảnh.Nhìn vào The Deep MNIST Example nơi bạn nhìn thấy mã như:

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
Các vấn đề liên quan