ধরুন আমরা np.dot
দুটি 'float32'
2 ডি অ্যারে গ্রহণ করি:
res = np.dot(a, b) # see CASE 1
print(list(res[0])) # list shows more digits
[-0.90448684, -1.1708503, 0.907136, 3.5594249, 1.1374011, -1.3826287]
নাম্বার। বাদে তারা পরিবর্তন করতে পারে:
ক্যাসি 1 : টুকরাa
np.random.seed(1)
a = np.random.randn(9, 6).astype('float32')
b = np.random.randn(6, 6).astype('float32')
for i in range(1, len(a)):
print(list(np.dot(a[:i], b)[0])) # full shape: (i, 6)
[-0.9044868, -1.1708502, 0.90713596, 3.5594249, 1.1374012, -1.3826287]
[-0.90448684, -1.1708503, 0.9071359, 3.5594249, 1.1374011, -1.3826288]
[-0.90448684, -1.1708503, 0.9071359, 3.5594249, 1.1374011, -1.3826288]
[-0.90448684, -1.1708503, 0.907136, 3.5594249, 1.1374011, -1.3826287]
[-0.90448684, -1.1708503, 0.907136, 3.5594249, 1.1374011, -1.3826287]
[-0.90448684, -1.1708503, 0.907136, 3.5594249, 1.1374011, -1.3826287]
[-0.90448684, -1.1708503, 0.907136, 3.5594249, 1.1374011, -1.3826287]
[-0.90448684, -1.1708503, 0.907136, 3.5594249, 1.1374011, -1.3826287]
ফলাফলগুলি পৃথক, যদিও মুদ্রিত স্লাইসটি একই একই সংখ্যাগুলি দ্বারা গুণিত হয়েছে।
CASE 2 : সমতল করুন
a
, এর 1D সংস্করণ নিন b
, তারপরে টুকরো a
:
np.random.seed(1)
a = np.random.randn(9, 6).astype('float32')
b = np.random.randn(1, 6).astype('float32')
for i in range(1, len(a)):
a_flat = np.expand_dims(a[:i].flatten(), -1) # keep 2D
print(list(np.dot(a_flat, b)[0])) # full shape: (i*6, 6)
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
CASE 3 : শক্তিশালী নিয়ন্ত্রণ; সমস্ত অ-জড়িত তালিকা শূন্যে সেট করুন: a[1:] = 0
সিএসই 1 কোড যুক্ত করুন SE ফলাফল: তাত্পর্য বজায় রয়েছে।
সিএসই 4 : সূচকগুলি বাদে চেক করুন [0]
; এর মত [0]
, ফলাফলগুলি তাদের সৃষ্টির দিক থেকে অ্যারে বৃদ্ধিগুলির একটি নির্দিষ্ট # স্থির করতে শুরু করে। আউটপুট
np.random.seed(1)
a = np.random.randn(9, 6).astype('float32')
b = np.random.randn(6, 6).astype('float32')
for j in range(len(a) - 2):
for i in range(1, len(a)):
res = np.dot(a[:i], b)
try: print(list(res[j]))
except: pass
print()
সুতরাং, 2D * 2D কেসের ক্ষেত্রে ফলাফল পৃথক হয় - তবে 1D * 1D এর সাথে সামঞ্জস্যপূর্ণ। আমার কিছু পড়া থেকে, এটি সাধারণ সংযোজন ব্যবহার করে 1D-1D থেকে শুরু হয়েছে, যেখানে 2D-2D 'ফ্যানসিয়ার' ব্যবহার করে, পারফরম্যান্স-বুস্টিং সংযোজন যা কম সুনির্দিষ্ট হতে পারে (উদাহরণস্বরূপ পেয়ারওয়াইস সংযোজনটি বিপরীতে করে)। তা সত্ত্বেও, আমি বুঝতে পারি না যে 1 ক্ষেত্রে একবার a
'সেট' দোরগোড়ায় কাটলে কেন এই বৈষম্যগুলি বিলুপ্ত হয় ; বৃহত্তর a
এবং b
, পরে এই প্রান্তিকতা মিথ্যা বলে মনে হয়, তবে এটি সর্বদা বিদ্যমান exists
সকলে বলেছিল: np.dot
এনডি-এনডি অ্যারেগুলির জন্য কেন অনর্থক (এবং বেমানান)? প্রাসঙ্গিক গিট
অতিরিক্ত তথ্য :
- পরিবেশ : উইন -10 ওএস, পাইথন 3.7.4, স্পাইডার 3.3.6 আইডিই, অ্যানাকোন্ডা 3.0 2019/10
- সিপিইউ : i7-7700HQ 2.8 GHz
- নম্পি v1.16.5
সম্ভাব্য অভিযুক্ত ব্যক্তি গ্রন্থাগার : Numpy MKL - এছাড়াও BLASS লাইব্রেরি; লক্ষ করার জন্য দ্বি রিকোকে ধন্যবাদ
স্ট্রেস-টেস্ট কোড : যেমনটি উল্লিখিত হয়েছে, ফ্রিকোয়েন্সি ডাব্লু / বড় অ্যারেগুলিতে তফাত বাড়িয়ে তোলে; উপরেরটি যদি পুনরুত্পাদনযোগ্য না হয় তবে নীচে হওয়া উচিত (যদি না হয় তবে আরও বৃহত্তর ডিমগুলি চেষ্টা করুন)। আমার আউটপুট
np.random.seed(1)
a = (0.01*np.random.randn(9, 9999)).astype('float32') # first multiply then type-cast
b = (0.01*np.random.randn(9999, 6)).astype('float32') # *0.01 to bound mults to < 1
for i in range(1, len(a)):
print(list(np.dot(a[:i], b)[0]))
সমস্যার তীব্রতা : দেখানো তাত্পর্যগুলি 'ছোট', তবে আর কয়েক মিলিয়ন সংখ্যক নিউরাল নেটওয়ার্কে কাজ করার সময় কয়েক সেকেন্ডে গুণিত হয় এবং পুরো রানটাইম জুড়ে ট্রিলিয়ন হয়; উল্লিখিত মডেল যথার্থতা এই থ্রেড অনুযায়ী পুরো 10 এর পার্সেন্টের দ্বারা পৃথক ।
নীচে এমন একটি জিএফ দেওয়া আছে যা মূলত কোনও মডেলকে খাওয়ানো থেকে a[0]
ডাব্লু / len(a)==1
বনাম len(a)==32
:
অন্যান্য প্ল্যাটফর্মগুলি ফলাফল হিসাবে, এবং পলের পরীক্ষার জন্য ধন্যবাদ সহ :
কেস 1 পুনরুত্পাদন (আংশিক) :
- গুগল কোলাব ভিএম - ইনটেল শিওন ২.৩ জি-হার্জ - জুপিটার - পাইথন ৩.6.৮
- উইন -10 প্রো ডকার ডেস্কটপ - ইনটেল আই 7-8700 কে - জ্যুইটার / স্কিপি-নোটবুক - পাইথন 3.7.3
- উবুন্টু 18.04.2 এলটিএস + ডকার - এএমডি এফএক্স-8150 - জুপিটার / স্কিপি-নোটবুক - পাইথন 3.7.3
দ্রষ্টব্য : এই ফলন উপরে প্রদর্শিত চেয়ে অনেক কম ত্রুটি; প্রথম সারিতে দুটি এন্ট্রি অন্য সারিতে সংশ্লিষ্ট এন্ট্রি থেকে কমপক্ষে উল্লেখযোগ্য অঙ্কে 1 দ্বারা বন্ধ রয়েছে।
কেস 1 পুনরুত্পাদন করা হয়নি :
- উবুন্টু 18.04.3 এলটিএস - ইন্টেল আই 7-8700 কে - আইপিথন 5.5.0 - পাইথন 2.7.15+ এবং 3.6.8 (2 পরীক্ষা)
- উবুন্টু 18.04.3 এলটিএস - ইন্টেল i5-3320M - আইপথিয়ন 5.5.0 - পাইথন 2.7.15+
- উবুন্টু 18.04.2 এলটিএস - এএমডি এফএক্স-8150 - আইপিথন 5.5.0 - পাইথন 2.7.15rc1
দ্রষ্টব্য :
- লিঙ্ক Colab নোটবুক এবং jupyter পরিবেশের অনেক ক্ষুদ্রতর অমিল দেন (এবং শুধুমাত্র প্রথম দুই সারি জন্য) চেয়ে আমার সিস্টেমে পালন করা হয়। এছাড়াও, কেস 2 কখনও (এখনও) অসম্পূর্ণতা দেখায় নি।
- এই অত্যন্ত সীমাবদ্ধ নমুনার মধ্যে, বর্তমান (ডকারাইজড) জুপিটার পরিবেশ আইপিথন পরিবেশের চেয়ে বেশি সংবেদনশীল।
np.show_config()
পোস্ট করতে খুব দীর্ঘ, তবে সংক্ষেপে: আইপিথন এনভিওরা হলেন বিএলএএস / ল্যাপাক ভিত্তিক; কলাব ওপেনবিএলএস-ভিত্তিক। আইপিথন লিনাক্স এনভিএস-এ, বিএলএএস লাইব্রেরিগুলি সিস্টেম-ইনস্টলড - জুপিটার এবং কোলাবে, তারা / অপ্ট / কনডা / লিবিব থেকে আসে
আপডেট : গৃহীত উত্তর সঠিক, তবে বিস্তৃত এবং অসম্পূর্ণ। যে কেউ কোড স্তরে আচরণটি ব্যাখ্যা করতে পারে - যথা, একটি সঠিক অ্যালগরিদম ব্যবহার np.dot
করেছেন এবং উপরের ফলাফলগুলিতে পর্যবেক্ষণ করা 'ধারাবাহিক অসঙ্গতিগুলি' কীভাবে ব্যাখ্যা করে (মন্তব্যগুলিও দেখুন) এই প্রশ্নটি সবার জন্য উন্মুক্ত থাকে । এখানে আমার ডিসিফেরিংয়ের বাইরে কিছু সরাসরি বাস্তবায়ন রয়েছে: sdot.c - arraytyype.c.src
ndarrays
সাধারণত সংখ্যার যথার্থ ক্ষতি হ্রাস করার জন্য সাধারণ অ্যালগরিদমগুলি । কারণ সরলতার জন্য তারা reduce-sum
প্রতিটি অক্ষ বরাবর, অপারেশন ক্রমটি সর্বোত্তম হতে পারে না ... নোট করুন আপনি যদি যথার্থ ত্রুটি মনে করেন তবে আপনি ভালভাবে ব্যবহার করতে পারেনfloat64