Np.mean এবং tf.reduce_mean এর মধ্যে পার্থক্য কী?


90

ইন MNIST শিক্ষানবিস টিউটোরিয়াল , সেখানে বিবৃতি

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

tf.castমূলত টেনসরের ধরণের অবজেক্টটি পরিবর্তিত হয় তবে এর মধ্যে tf.reduce_meanএবং এর মধ্যে পার্থক্য কী np.mean?

এখানে ডকটি এখানে রয়েছে tf.reduce_mean:

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

input_tensor: টেনসর কমাতে। সংখ্যার ধরণের হওয়া উচিত।

reduction_indices: মাত্রা কমাতে। যদি None(খেলাপি), সমস্ত মাত্রা হ্রাস করে।

# '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.]

1 ডি ভেক্টরটির জন্য দেখতে এটি দেখতে দেখতে ভাল লাগছে np.mean == tf.reduce_meanতবে কী হচ্ছে তা আমি বুঝতে পারি না tf.reduce_mean(x, 1) ==> [1., 2.]tf.reduce_mean(x, 0) ==> [1.5, 1.5]ধরণের অর্থ বোঝায়, যেহেতু এর অর্থ [1, 2]এবং [1, 2]হ'ল [1.5, 1.5]তবে কী হচ্ছে tf.reduce_mean(x, 1)?



টেনসরফ্লো নতুনদের ক্ষেত্রে একটি গুরুত্বপূর্ণ পার্থক্য: tf.reduce_meanমাল্টি- থ্রেডযুক্ত , সাধারণত আপনার জিপিইউতে গণনা করা হয়, যেখানে np.meanএকক সিপিইউতে গণনা করা হয়। এছাড়াও, ডেটা ব্যাচtf প্রক্রিয়া করার জন্য ডিজাইন করা হয়েছে যেখানে একক ডেটা উদাহরণ হিসাবে কাজ করে। np
ড্রিভিকো

উত্তর:


110

এর কার্যকারিতা numpy.meanএবং tensorflow.reduce_meanএকই রকম। তারা একই জিনিস। নকল এবং টেনসরফ্লো জন্য ডকুমেন্টেশন থেকে , আপনি এটি দেখতে পারেন। একটি উদাহরণ তাকান আসুন,

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)

আউটপুট

[ 3.5  5.5  6.5]
[ 3.5  5.5  6.5]

এখানে আপনি দেখতে পাচ্ছেন যে যখন axis(নিম্পি) বা reduction_indices(টেনসরফ্লো) 1 হয়, এটি গণনাগুলি (3,4) এবং (5,6) এবং (6,7) 1জুড়ে বোঝায় , সুতরাং কোন অক্ষটি জুড়ে গড়টি গণনা করা হবে তা নির্ধারণ করে। যখন এটি 0 হয়, গড়টি (3,5,6) এবং (4,6,7) জুড়ে গণনা করা হয়, এবং আরও। আমি আপনি ধারণা পেতে আশা করি।

এখন তাদের মধ্যে পার্থক্য কী?

অজগরটির যে কোনও জায়গায় আপনি নমপি অপারেশনটি গণনা করতে পারেন। তবে একটি টেনসরফ্লো অপারেশন করতে, এটি অবশ্যই একটি টেনস্রোফ্লোয়ের ভিতরে করা উচিত Session। আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন । সুতরাং যখন আপনাকে আপনার টেনসরফ্লো গ্রাফের জন্য কোনও গণনা সম্পাদন করার প্রয়োজন হবে (বা কাঠামো যদি আপনি চান তবে) এটি অবশ্যই একটি সেন্সরফ্লোতে করা উচিত Session

আরেকটি উদাহরণ তাকান।

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)

আমরা বলতে বাড়তে পারে 1মধ্যে numpyআপনি স্বাভাবিকভাবেই would হিসাবে কিন্তু অর্ডার tensorflow এটা কাজ করার জন্য, আপনি যে সঞ্চালন করতে প্রয়োজন Session, ব্যবহার না করেই Sessionআপনি যে করতে পারবেন না। অন্য কথায়, আপনি যখন কম্পিউটিং করছেন tfMean = tf.reduce_mean(c), তখন টেনস্রোফ্লো এটি গণনা করে না। এটি কেবল একটিতে গণনা করে Session। আপনি যখন লিখবেন তবে তত্ক্ষণাত্ অদ্ভুত গণনাগুলি np.mean()

আমি এটা জ্ঞান করে তোলে আশা করি।


21
কিন্তু এখানে অংশ মানে কি হ্রাস করতে পারে ?
rshrt

20
@ রোমান এটি কার্যকরী প্রোগ্রামিংয়ের একটি শব্দ। : আপনি এখানে এটি সম্পর্কে পড়তে পারেন python-course.eu/lambda.php
Daniyar

4
@rst REDUCE = সংখ্যার কম করে 1 টি মান যোগ করে reducing অর্থ = যোগফলের গড়।
মেঘনা নাটরাজ

4
@rst কল্পনা করুন আপনার কাছে এন উপাদান রয়েছে এবং আপনি সেই এন সংখ্যাগুলির গড় মান (এম) গণনা করতে চান। এই সমস্যাটি দেখার একটি উপায় হ'ল আমাদের আকারের ভেক্টর রয়েছে (1, এন) এবং অক্ষ = 0 এর উপরে, আমরা উপাদানগুলি হ্রাস করি (এখানে আমাদের এন উপাদান রয়েছে)। হ্রাস (বা সমষ্টি) একটি কার্যকারিতা সহ আসে এবং আমাদের উদাহরণস্বরূপ, ফাংশনটি গড় কার্যকারিতা।
alift

23

এখানে মূল শব্দটি হ্রাস শব্দটি, কার্যকরী প্রোগ্রামিংয়ের একটি ধারণা, যা টেনসরফ্লোতে কম_মেনের পক্ষে ইনপুটগুলির একটি ব্যাচ থেকে গণনার ফলাফলের চলমান গড় রাখা সম্ভব করে তোলে।

আপনি যদি ক্রিয়ামূলক প্রোগ্রামিংয়ের সাথে পরিচিত না হন তবে এটি রহস্যজনক বলে মনে হতে পারে। সুতরাং প্রথমে আসুন আমরা কি হ্রাস করে তা দেখুন। যদি আপনাকে [1,2,5,4] এর মতো একটি তালিকা দেওয়া হয় এবং তার গড় গণনা করতে বলা হয়েছিল, এটি সহজ - কেবল এনপি.মিয়ানে পুরো অ্যারেটি পাস করুন এবং আপনি গড়টি পাবেন। তবে আপনি যদি সংখ্যার স্ট্রিমের গড় গণনা করতে চান? সেক্ষেত্রে আপনাকে প্রথমে প্রবাহটি পড়ে অ্যারেটি একত্র করতে হবে এবং তারপরে ফলাফলের অ্যারেতে এনপি.মিন কল করতে হবে - আপনাকে আরও কিছু কোড লিখতে হবে।

একটি বিকল্প হ্রাস দৃষ্টান্ত ব্যবহার করা হয়। উদাহরণস্বরূপ, কিভাবে আমরা পাইথন কমাতে সংখ্যার যোগফল গণনা করতে ব্যবহার করতে পারেন তাকান: reduce(lambda x,y: x+y, [1,2,5,4])

এটি এর মতো কাজ করে:

  1. পদক্ষেপ 1: তালিকা থেকে 2 সংখ্যা পড়ুন - 1,2। ল্যাম্বদা 1,2 মূল্যায়ন করুন। স্টোরগুলিকে ফলাফল হ্রাস করুন Note. দ্রষ্টব্য - এই একমাত্র পদক্ষেপ যেখানে 2 অঙ্ক তালিকা থেকে পড়া হয়
  2. পদক্ষেপ 2: তালিকা থেকে পরবর্তী অঙ্কটি পড়ুন - ৫. ল্যাবদা 5, 3 (3 ধাপ 1 এর ফলস্বরূপ, যেটি সঞ্চিত হ্রাস করে) মূল্যায়ন করুন। দোকান 8 ফলাফল হ্রাস।
  3. পদক্ষেপ 3: তালিকা থেকে পরবর্তী অঙ্কটি পড়ুন - 4. ল্যাম্বদা 8,4 মূল্যায়ন করুন (8 টি ধাপের ফলে 2, এটি সঞ্চিত হ্রাস করে)। স্টোর 12 কমিয়ে দিন
  4. পদক্ষেপ 4: তালিকা থেকে পরবর্তী অঙ্কটি পড়ুন - কোনওটি নেই, সুতরাং 12 এর সঞ্চিত ফলাফলটি ফিরিয়ে দিন।

পাইথনে ফাংশনাল প্রোগ্রামিং এখানে আরও পড়ুন

এটি টেনসরফ্লোতে কীভাবে প্রযোজ্য তা দেখতে, নীচের কোডের ব্লকটি দেখুন, যা একটি সাধারণ গ্রাফকে সংজ্ঞায়িত করে, যা একটি ভাসা লাগে এবং গড় গণনা করে। গ্রাফের ইনপুটটি কোনও একক ভাসা নয়, তবে একটি ফ্লোটের অ্যারে। কমানো_মিয়ান সেই সমস্ত ভাসমানের তুলনায় গড় মান গণনা করে।

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}))

চিত্রগুলির ব্যাচগুলির উপর মানগুলি গণনা করার সময় এই প্যাটার্নটি কাজে আসবে। এ ডীপ MNIST উদাহরণ যেখানে আপনি মত কোড দেখুন:

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

3

নতুন ডকুমেন্টেশন tf.reduce_mean()np.mean হিসাবে একই ফলাফল উত্পাদন করে:

সমান np.mean

এটিতেও np.mean এর মতো একই পরামিতি রয়েছে । তবে এখানে একটি গুরুত্বপূর্ণ পার্থক্য: তারা কেবলমাত্র ভাসমান মানগুলিতে একই ফলাফল দেয় :

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

আপনি যদি ধরণের রূপান্তর অপসারণ করেন, আপনি বিভিন্ন ফলাফল দেখতে পাবেন


এই অতিরিক্ত অনেক অন্যান্য tf.reduce_ফাংশন যেমন reduce_all, reduce_any, reduce_min, reduce_max, reduce_prodএকই মান সেখানে numpy সহধর্মীদের যেমন উত্পাদন। স্পষ্টতই যেহেতু তারা অপারেশন, সেগুলি কেবলমাত্র সেশনের অভ্যন্তর থেকেই কার্যকর করা যায়।


উদাহরণস্বরূপ আপনি পার্থক্যটি কী তা ব্যাখ্যা করলে এটি সহায়ক হতে পারে। আপনার উদাহরণটি চালানো থেকে, আমার এমন ধারণা রয়েছে যা tf.reduce_meanনিশ্চিত করে যে আউটপুট ইনপুটটির সাথে dtypeমেলে dtype। এর আউটপুট np.mean()সর্বদা একটি ভাসা। এটা কি ঠিক?
ক্র্যাক

-1

1সাধারণত সারি বোঝায় এবং 2সাধারণত কলামগুলি বোঝায়। "ওভার" সূচক 1হ্রাস করার অর্থ সারিদিকে হ্রাস করা।

[1., 2.]ঠিক হয় [ <row 1 mean> , <row 2 mean> ]

এই সূচী নম্বর কনভেনশনটি পরিসংখ্যান সফ্টওয়্যারগুলিতে বিশেষত আর।


4
আমি বিশ্বাস করি 0 টি কলামকে বোঝায়, 2
এইচএফজেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.