Sự khác biệt giữa np.mean và tf.reduce_mean là gì?


90

Trong hướng dẫn cho người mới bắt đầu MNIST , có câu

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

tf.castvề cơ bản thay đổi loại tensor của đối tượng, nhưng sự khác biệt giữa tf.reduce_meanvà là np.meangì?

Đây là tài liệu về tf.reduce_mean:

reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)

input_tensor: Tensor để giảm. Nên có kiểu số.

reduction_indices: Các kích thước cần giảm. Nếu None(giá trị mặc định), giảm tất cả các thứ nguyên.

# '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 vectơ 1D, nó trông giống như vậy np.mean == tf.reduce_mean, nhưng tôi không hiểu điều gì đang xảy ra tf.reduce_mean(x, 1) ==> [1., 2.]. tf.reduce_mean(x, 0) ==> [1.5, 1.5]loại có ý nghĩa, vì có nghĩa là [1, 2][1, 2]hiện tại [1.5, 1.5], nhưng điều gì đang xảy ra với tf.reduce_mean(x, 1)?


chúng tạo ra các kết quả khác nhau về các giá trị số nguyên do sự phân chia trong python
Salvador Dali

Một điểm khác biệt quan trọng đối với những người mới sử dụng tensorflow: tf.reduce_meanlà đa luồng, thường được tính trên GPU của bạn, trong khi np.meanđược tính trên một CPU. Ngoài ra, tfđược thiết kế để xử lý một loạt dữ liệu trong khi nphoạt động trên một cá thể dữ liệu duy nhất.
drevicko

Câu trả lời:


110

Chức năng của numpy.meantensorflow.reduce_meangiống nhau. Họ làm điều tương tự. Từ tài liệu, đối với numpytensorflow , bạn có thể thấy điều đó. Hãy xem 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)

Đầu ra

[ 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 giá trị trung bình trên (3,4) và (5,6) và (6,7), do đó 1xác định giá trị trung bình được tính trên trục nào. 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 biệt giữa chúng là gì?

Bạn có thể tính toán hoạt động numpy ở bất kỳ đâu trên python. 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ó ở đây . Vì vậy, khi bạn cần thực hiện bất kỳ tính toán nào cho đồ thị tensorflow của mình (hoặc cấu trúc nếu bạn muốn), nó phải được thực hiện bên trong tensorflow Session.

Hãy xem một 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 1trong numpykhi bạn sẽ 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 Sessionbạ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), thì tensorflow không tính toán nó. Nó chỉ tính toán điều đó trong a Session. Nhưng numpy tính toán điều đó ngay lập tức, khi bạn viết np.mean().

Tôi hy vọng nó có ý nghĩa.


21
nhưng giảm một phần có nghĩa là gì ở đây?
rsht

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

1
@rsht REDUCE = giảm các con số bằng cách cộng chúng thành 1 giá trị. MEAN = tính trung bình của tổng đó.
Meghna Natraj

1
@rsht Hãy tưởng tượng bạn có N phần tử và bạn muốn tính giá trị trung bình (M) của N số đó. Một cách để xem vấn đề này là chúng ta có một vector có kích thước (1, N) và trên trục = 0, chúng ta giảm các phần tử (ở đây chúng tôi có N phần tử). Giảm (hoặc tổng hợp) đi kèm với một chức năng, và trong ví dụ của chúng tôi, chức năng là hàm trung bình.
nhanh

22

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

Nếu bạn không quen với lập trình chức năng, điều này có vẻ bí ẩn. Vì vậy, trước tiên chúng ta hãy xem những gì giảm làm. Nếu bạn được cung cấp 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 cho np.mean và bạn nhận được giá trị trung bình. Tuy nhiên, điều gì sẽ xảy ra 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 sẽ phải tập hợ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ã.

Một giải pháp thay thế là sử dụng mô hình rút gọn. Như một ví dụ, hãy nhìn vào cách chúng tôi có thể sử dụng giảm trong python để tính toán 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ố trong 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 mà 2 chữ số được đọc ra 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, 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 từ danh sách - 4. Đánh giá lambda 8,4 (8 là kết quả của bước 2, giảm được lưu trữ). giảm cửa hàng kết quả 12
  4. Bước 4: Đọc chữ số tiếp theo từ danh sách - không có chữ số nào, vì vậy trả về kết quả được lưu trữ là 12.

Đọc thêm tại đây Lập trình chức năng trong Python

Để xem cách điều này áp dụng cho TensorFlow, hãy xem khối mã sau, xác định một biểu đồ đơn giản, lấy một số thực và tính giá trị trung bình. Tuy nhiên, đầu vào cho đồ thị không phải là một float đơn lẻ mà là một mảng float. Reduce_mean tính 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 rất hữu ích khi tính toán các giá trị trên các lô hình ảnh. Hãy xem Ví dụ về MNIST Deep nơi bạ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))

3

Tài liệu mới cho biết tf.reduce_mean()tạo ra kết quả tương tự như np.mean:

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

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

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 xóa chuyển đổi loại, bạn sẽ thấy các kết quả khác nhau


Trong thêm vào đó, nhiều người khác tf.reduce_chức năng như reduce_all, reduce_any, reduce_min, reduce_max, reduce_prodsản xuất các giá trị giống như có chất tương tự NumPy. Rõ ràng bởi vì chúng là các hoạt động, chúng chỉ có thể được thực thi từ bên trong phiên.


nó có thể hữu ích nếu bạn giải thích sự khác biệt là gì, ngoài ví dụ. Từ việc chạy ví dụ của bạn, tôi có ấn tượng rằng tf.reduce_meanđảm bảo rằng đầu ra dtypekhớp với đầu vào dtype. Đầu ra của np.mean()luôn là một phao. Đúng không?
craq

-1

1thường đề cập đến các hàng và 2thường đề cập đến các cột. Giảm chỉ số "over" 1có nghĩa là giảm rowwise.

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

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


1
Tôi tin rằng 0 đề cập đến cột, không phải 2
HFZ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.