• نحوه ایجاد یک شبکه عصبی با کتابخانه Keras در پایتون: یک مثال. پایتون و شبکه های عصبی

  • برنامه نويسي
    • ترجمه

    مقاله در مورد چیه

    من شخصاً با یک کد کاری کوچک که می توانم با آن بازی کنم، بهتر یاد می گیرم. در این آموزش الگوریتم را یاد می گیریم پس انتشارخطاها در مثال یک شبکه عصبی کوچک پیاده سازی شده در پایتون.

    کد را به من بدهید!

    X = np.array([ ,,, ]) y = np.array([]).T syn0 = 2*np.random.random((3,4)) - 1 syn1 = 2*np.random.random ((4،1)) - 1 برای j در xrange(60000): l1 = 1/(1+np.exp(-(np.dot(X,syn0)))) l2 = 1/(1+np. exp(-(np.dot(l1,syn1)))) l2_delta = (y - l2)*(l2*(1-l2)) l1_delta = l2_delta.dot(syn1.T) * (l1 * (1-l1) )) syn1 += l1.T.dot(l2_delta) syn0 += X.T.dot(l1_delta)

    خیلی مختصر؟ بیایید آن را به بخش های ساده تر تقسیم کنیم.

    بخش 1: یک شبکه عصبی اسباب بازی کوچک

    یک شبکه عصبی آموزش دیده از طریق پس انتشار سعی می کند از ورودی برای پیش بینی خروجی استفاده کند.

    فرض کنید باید پیش‌بینی کنیم که ستون «خروجی» بر اساس داده‌های ورودی چگونه خواهد بود. این مشکل را می توان با محاسبه تناظر آماری بین آنها حل کرد. و خواهیم دید که ستون سمت چپ 100% با خروجی همبستگی دارد.

    پس انتشار، در ساده ترین حالت، آمارهای مشابهی را برای ایجاد یک مدل محاسبه می کند. بیایید تلاش کنیم.

    شبکه عصبی در دو لایه

    وارد کردن numpy به عنوان np # Sigmoid def nonlin(x,deriv=False): if(deriv==True): return f(x)*(1-f(x)) return 1/(1+np.exp(-x) )) # مجموعه داده ورودی X = np.array([ , , , ]) # داده خروجی y = np.array([]).T # do اعداد تصادفیتعریف‌تر np.random.seed(1) # مقدار اولیه وزن‌ها به‌طور تصادفی با میانگین 0 syn0 = 2*np.random.random((3,1)) - 1 برای iter در xrange (10000): # انتشار به جلو l0 = X l1 = nonlin(np.dot(l0,syn0)) # چقدر اشتباه می کنیم؟ l1_error = y - l1 # این را با شیب سیگموئید # بر اساس مقادیر موجود در l1 ضرب کنید l1_delta = l1_error * nonlin(l1,True) # !!! # به روز رسانی وزن syn0 += np.dot(l0.T,l1_delta) # !!! چاپ "خروجی پس از آموزش:" چاپ l1

    خروجی پس از آموزش: [[ 0.00966449] [ 0.00786506] [ 0.99358898] [ 0.99211957]]

    متغیرها و توضیحات آنها






    "*" - ضرب بر حسب عنصر - دو بردار هم اندازه مقادیر مربوطه را ضرب می کنند و خروجی یک بردار با همان اندازه است.
    "-" - تفریق عنصر به عنصر بردارها
    x.dot(y) - اگر x و y بردار باشند، خروجی حاصل ضرب نقطه ای خواهد بود. اگر اینها ماتریس هستند، ضرب ماتریس را بدست می آوریم. اگر ماتریس فقط یکی از آنها باشد، این ضرب یک بردار و یک ماتریس است.

    • l1 را بعد از اولین تکرار و بعد از آخرین تکرار مقایسه کنید
    • به تابع nonlin نگاه کنید.
    • ببینید l1_error چگونه تغییر می کند
    • تجزیه خط 36 - مواد اصلی مخفی در اینجا جمع آوری شده است (علامت گذاری شده!!!)
    • تجزیه خط 39 - کل شبکه در حال آماده سازی برای این عملیات خاص است (علامت گذاری شده با !!!)

    بیایید کد را خط به خط تجزیه کنیم

    numpy را به عنوان np وارد کنید

    واردات numpy، یک کتابخانه جبر خطی. تنها اعتیاد ما

    Def nonlin (x,deriv=False):

    غیر خطی بودن ما این تابع خاص یک "سیگموئید" ایجاد می کند. هر عددی را به مقداری بین 0 و 1 نگاشت می کند و اعداد را به احتمالات تبدیل می کند و چندین ویژگی مفید دیگر برای آموزش شبکه های عصبی دارد.

    If(deriv==True):

    این تابع همچنین می تواند مشتق سیگموئید (deriv=True) را برگرداند. این یکی از خواص مفید آن است. اگر خروجی تابع متغیر out باشد، مشتق خارج از * (1-out) خواهد بود. تاثير گذار.

    X = np.array([، ...

    راه اندازی آرایه داده های ورودی به عنوان یک ماتریس numpy. هر خط یک نمونه آموزشی است. ستون ها گره های ورودی هستند. ما 3 گره ورودی در شبکه و 4 نمونه آموزشی دریافت می کنیم.

    Y = np.array([]).T

    خروجی را مقدار دهی اولیه می کند. ".T" - تابع انتقال. پس از ترجمه، ماتریس y دارای 4 ردیف با یک ستون است. مانند داده های ورودی، هر ردیف یک مثال آموزشی است و هر ستون (در مورد ما یکی) یک گره خروجی است. به نظر می رسد شبکه 3 ورودی و 1 خروجی دارد.

    np.random.seed(1)

    در نتیجه توزیع تصادفیهر بار یکسان خواهد بود این به ما این امکان را می دهد که پس از ایجاد تغییرات در کد، عملکرد شبکه را به راحتی نظارت کنیم.

    Syn0 = 2*np.random.random((3،1)) - 1

    ماتریس وزن شبکه syn0 به معنای سیناپس صفر است. از آنجایی که ما فقط دو لایه ورودی و خروجی داریم، به یک ماتریس وزن نیاز داریم که آنها را به هم متصل کند. بعد آن (3، 1) است زیرا ما 3 ورودی و 1 خروجی داریم. به عبارت دیگر، l0 دارای اندازه 3 و l1 دارای اندازه 1 است. از آنجایی که ما همه گره های l0 را به همه گره های l1 پیوند می دهیم، به یک ماتریس از ابعاد (3، 1) نیاز داریم.

    توجه داشته باشید که به صورت تصادفی مقداردهی اولیه می شود و میانگین آن صفر است. یک نظریه نسبتا پیچیده پشت این وجود دارد. در حال حاضر، ما آن را فقط به عنوان یک توصیه در نظر می گیریم. همچنین توجه داشته باشید که شبکه عصبی ما دقیقاً همین ماتریس است. ما "لایه" l0 و l1 داریم، اما آنها مقادیر موقتی بر اساس مجموعه داده هستند. ما آنها را ذخیره نمی کنیم. تمام آموزش ها در syn0 ذخیره می شوند.

    برای iter در xrange (10000):

    اینجاست که کد آموزش شبکه اصلی شروع می شود. چرخه با کد بارها تکرار می شود و شبکه را برای مجموعه داده بهینه می کند.

    اولین لایه، l0، فقط داده است. X شامل 4 مثال آموزشی است. ما همه آنها را به یکباره پردازش می کنیم - به این آموزش گروهی می گویند. در کل ما 4 تا داریم رشته های مختلف l0، اما می توانید آنها را به عنوان یک مثال آموزشی در نظر بگیرید - در این مرحله مهم نیست (شما می توانید 1000 یا 10000 مورد از آنها را بدون هیچ تغییری در کد بارگذاری کنید).

    L1 = nonlin(np.dot(l0,syn0))

    این مرحله پیش بینی است. به شبکه اجازه می‌دهیم تا خروجی را بر اساس ورودی پیش‌بینی کند. سپس خواهیم دید که او چگونه این کار را انجام می دهد تا بتوانیم آن را در جهت بهبود تغییر دهیم.

    خط شامل دو مرحله است. اولی ضرب ماتریس l0 و syn0 را انجام می دهد. دومی خروجی را از سیگموئید عبور می دهد. ابعاد آنها به شرح زیر است:

    (4×3) نقطه (3×1) = (4×1)

    ضرب ماتریسی نیاز به مطابقت ابعاد در وسط معادله دارد. ماتریس به‌دست‌آمده دارای همان تعداد ردیف اول و همان تعداد ستون دوم است.

    ما 4 مثال آموزشی بارگذاری کردیم و 4 حدس زدیم (ماتریس 4x1). هر خروجی مربوط به حدس شبکه برای ورودی داده شده است.

    L1_error = y - l1

    از آنجایی که l1 حاوی حدسیات است، می توانیم تفاوت آنها را با واقعیت با کم کردن l1 از پاسخ صحیح y مقایسه کنیم. l1_error بردار مثبت و است اعداد منفی، که مشخصه «دخت» شبکه است.

    و این ماده مخفی است. این خط باید به صورت قسمتی تجزیه شود.

    قسمت اول: مشتق

    غیرخط (l1، True)

    L1 این سه نقطه را نشان می دهد و کد شیب خطوط نشان داده شده در زیر را خروجی می دهد. توجه داشته باشید که در مقادیر بزرگ مانند x=2.0 (نقطه سبز) و مقادیر بسیار کوچک مانند x=-1.0 (بنفش) خطوط شیب کمی دارند. بزرگترین زاویه در نقطه x=0 (آبی) است. این دارد پراهمیت. همچنین توجه داشته باشید که تمام مشتقات بین 0 و 1 هستند.

    بیان کامل: مشتق دارای وزن خطا

    L1_delta = l1_error * nonlin(l1, True)

    از نظر ریاضی، موارد بیشتری وجود دارد راه های دقیق، اما در مورد ما این یکی نیز مناسب است. l1_error یک ماتریس (4،1) است. nonlin(l1,True) ماتریس (4,1) را برمی گرداند. در اینجا آنها را عنصر به عنصر ضرب می کنیم و در خروجی نیز ماتریس (4,1) l1_delta را بدست می آوریم.

    با ضرب مشتقات در خطاها، خطاهای پیش بینی های انجام شده با اطمینان بالا را کاهش می دهیم. اگر شیب خط کوچک بود، شبکه دارای مقدار بسیار بزرگ یا بسیار کوچک است. اگر حدس در شبکه نزدیک به صفر باشد (x=0، y=0.5)، آنگاه مطمئن نیستید. ما این پیش‌بینی‌های نامشخص را به‌روزرسانی می‌کنیم و با ضرب کردن آن‌ها در مقادیر نزدیک به صفر، پیش‌بینی‌های با اطمینان بالا را به حال خود رها می‌کنیم.

    Syn0 += np.dot(l0.T، l1_delta)

    ما آماده ارتقای شبکه هستیم. بیایید یک مثال آموزشی را در نظر بگیریم. در آن وزن ها را به روز می کنیم. به روز رسانی وزن سمت چپ (9.5)

    weight_update = input_value * l1_delta

    برای سمت چپ ترین وزن، این 1.0 * l1_delta خواهد بود. احتمالاً این مقدار فقط به میزان 9.5 افزایش می یابد. چرا؟ زیرا پیش‌بینی از قبل به اندازه کافی مطمئن بود و پیش‌بینی‌ها عملاً درست بودند. یک خطای کوچک و یک شیب جزئی خط به معنای بروز رسانی بسیار کوچک است.

    اما از آنجایی که در حال انجام تمرینات گروهی هستیم، مرحله بالا را برای هر چهار مثال آموزشی تکرار می کنیم. بنابراین بسیار شبیه به تصویر بالا است. پس خط ما چه کار می کند؟ به روز رسانی وزن برای هر وزن، برای هر مثال تمرینی، آنها را خلاصه می کند، و همه وزنه ها را در یک خط به روز می کند.

    پس از مشاهده به روز رسانی شبکه، به داده های آموزشی خود بازگردیم. وقتی هر دو ورودی و خروجی 1 باشند، وزن بین آنها را افزایش می دهیم. وقتی ورودی 1 و خروجی 0 است وزن را کم می کنیم.

    خروجی ورودی 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0

    بنابراین، در چهار مثال آموزشی زیر، وزن اولین ورودی نسبت به خروجی دائماً افزایش یا ثابت می‌ماند و دو وزن دیگر بسته به مثال‌ها کم و زیاد می‌شوند. این اثر به یادگیری شبکه بر اساس همبستگی داده های ورودی و خروجی کمک می کند.

    بخش 2: کار دشوارتر است

    خروجی ورودی 0 0 1 0 0 1 1 1 1 0 1 1 1 1 1 0

    بیایید سعی کنیم داده های خروجی را بر اساس سه ستون ورودی داده پیش بینی کنیم. هیچ یک از ستون های ورودی 100% با خروجی همبستگی ندارند. ستون سوم اصلاً به هیچ چیز مربوط نمی شود، زیرا تماماً شامل مواردی است. با این حال، در اینجا می توانید این طرح را نیز مشاهده کنید - اگر یکی از دو ستون اول (اما نه هر دو به طور همزمان) شامل 1 باشد، نتیجه نیز 1 خواهد بود.

    این یک مدار غیر خطی است زیرا مسابقه مستقیمهیچ ستون یک به یک وجود ندارد. مطابقت بر اساس ترکیبی از داده های ورودی، ستون های 1 و 2 است.

    جالب اینجاست که تشخیص الگو کار بسیار مشابهی است. اگر 100 تصویر با اندازه مساوی از دوچرخه و پیپ دودی دارید، وجود پیکسل های خاص در مکان های خاص ارتباط مستقیمی با حضور دوچرخه یا پیپ در تصویر ندارد. از نظر آماری، رنگ آنها ممکن است تصادفی به نظر برسد. اما برخی از ترکیبات پیکسل ها تصادفی نیستند - آنهایی که تصویر یک دوچرخه (یا لوله) را تشکیل می دهند.


    استراتژی

    برای ترکیب پیکسل ها در چیزی که می تواند مطابقت یک به یک با خروجی داشته باشد، باید یک لایه دیگر اضافه کنید. لایه اول ورودی را ترکیب می کند، لایه دوم با استفاده از خروجی لایه اول به عنوان ورودی، مطابقت را به خروجی اختصاص می دهد. به جدول توجه کنید.

    ورودی (l0) وزن های پنهان (l1) خروجی (l2) 0 0 1 0.1 0.2 0.5 0.2 0 0 1 1 0.2 0.6 0.7 0.1 1 1 0 1 0.3 0.2 0.3 0.9 110.2 0.9 1 0.2 0.1

    با تخصیص تصادفی وزن ها، مقادیر پنهانی برای لایه شماره 1 به دست می آوریم. جالب اینجاست که ستون دوم وزن های پنهان از قبل همبستگی کمی با خروجی دارد. ایده آل نیست، اما وجود دارد. و این نیز بخش مهمی از فرآیند آموزش شبکه است. آموزش فقط این همبستگی را تقویت می کند. syn1 را به روز می کند تا با خروجی مطابقت داشته باشد و syn0 را برای دریافت بهتر ورودی به روز می کند.

    شبکه عصبی در سه لایه

    وارد کردن numpy به عنوان np def nonlin(x,deriv=False): if(deriv==True): بازگشت f(x)*(1-f(x)) بازگشت 1/(1+np.exp(-x)) X = np.array([, , , ]) y = np.array([, , , ]) np.random.seed(1) # وزن های تصادفی، میانگین 0 syn0 = 2*np.random.random ((3 ,4)) - 1 syn1 = 2*np.random.random((4,1)) - 1 برای j در xrange(60000): # از لایه های 0، 1 و 2 به جلو بروید l0 = X l1 = nonlin(np .dot(l0,syn0)) l2 = nonlin(np.dot(l1,syn1)) # چقدر در مورد مقدار مورد نظر اشتباه می کنیم؟ l2_error = y - l2 if (j% 10000) == 0: print "Error:" + str(np.mean(np.abs(l2_error))) # به کدام سمت حرکت کنیم؟ # اگر به پیش بینی اطمینان داشتیم، پس نیازی به تغییر آن نداریم l2_delta = l2_error*nonlin(l2,deriv=True) # مقادیر l1 چقدر بر خطاهای l2 تأثیر می گذارد؟ l1_error = l2_delta.dot(syn1.T) # در کدام جهت حرکت کنیم تا به l1 برسیم؟ # اگر به پیش بینی اطمینان داشتیم، دیگر نیازی به تغییر آن نیست l1_delta = l1_error * nonlin(l1,deriv=True) syn1 += l1.T.dot(l2_delta) syn0 += l0.T.dot( l1_delta)

    خطا:0.496410031903 خطا:0.00858452565325 خطا:0.00578945986251 خطا:0.00462917677677

    متغیرها و توضیحات آنها

    X ماتریس مجموعه داده های ورودی است. رشته ها - نمونه های آموزشی
    y ماتریس مجموعه داده های خروجی است. رشته ها - نمونه های آموزشی
    l0 اولین لایه شبکه است که توسط داده های ورودی تعریف شده است
    l1 - لایه دوم شبکه یا لایه پنهان
    l2 لایه نهایی است، این فرضیه ما است. همانطور که تمرین می کنید، باید به پاسخ صحیح نزدیکتر شوید.
    syn0 - اولین لایه وزن، Synapse 0، l0 را با l1 ترکیب می کند.
    syn1 - دومین لایه وزن، Synapse 1، l1 را با l2 ترکیب می کند.
    l2_error - اشتباه شبکه از نظر کمی
    l2_delta خطای شبکه است، بسته به قطعیت پیش بینی. تقریباً با خطا یکسان است، به جز پیش‌بینی‌های قوی
    l1_error - با وزن کردن l2_delta با وزن های syn1، خطای لایه میانی/مخفی را محاسبه می کنیم.
    l1_delta - خطاهای شبکه از l1، مقیاس بندی شده توسط اطمینان پیش بینی. تقریباً مشابه l1_error، به جز پیش بینی های مطمئن

    کد باید کاملاً واضح باشد - این فقط اجرای قبلی شبکه است که در دو لایه، یکی روی دیگری انباشته شده است. خروجی لایه اول l1 ورودی لایه دوم است. فقط در خط بعدی چیز جدیدی وجود دارد.

    L1_error = l2_delta.dot(syn1.T)

    از خطاهای وزن شده با اطمینان پیش بینی های l2 برای محاسبه خطای l1 استفاده می کند. شاید بتوان گفت، یک خطای وزن شده با مشارکت دریافت می کنیم - ما محاسبه می کنیم که چه سهمی در خطاهای l2 توسط مقادیر در گره های l1 ایجاد می شود. این مرحله پس انتشار نامیده می شود. سپس با استفاده از الگوریتم مشابه در شبکه عصبی دو لایه، syn0 را به روز می کنیم.

    جیمز لوی، دانشگاه فناوری جورجیا. یک راهنمای برای مبتدیان که پس از آن می توانید شبکه عصبی خود را در پایتون ایجاد کنید.

    انگیزه:تمرکز بر تجربه شخصیدر یادگیری عمیق، تصمیم گرفتم یک شبکه عصبی از ابتدا و بدون پیچیدگی ایجاد کنم کتابخانه آموزشی، مانند، برای مثال، . من معتقدم که برای یک دانشمند داده مبتدی مهم است که ساختار داخلی .

    این مقاله حاوی مطالبی است که من آموخته ام و امیدوارم برای شما نیز مفید باشد! سایر مقالات مفید مرتبط:

    شبکه عصبی چیست؟

    اکثر مقالات در مورد شبکه های عصبی هنگام توصیف آنها با مغز شباهت دارند. به نظر من توصیف شبکه های عصبی به عنوان ساده تر است تابع ریاضی، که ورودی داده شده را بدون پرداختن به جزئیات به خروجی مورد نظر نگاشت می کند.

    شبکه های عصبی از اجزای زیر تشکیل شده اند:

    • لایه ورودی، x
    • مقدار دلخواه لایه های پنهان
    • لایه خروجی، ŷ
    • کیت ترازوو جبران می کندبین هر لایه دبلیو و ب
    • انتخاب برای هر لایه پنهان σ ; در این کار از تابع فعال سازی Sigmoid استفاده خواهیم کرد

    نمودار زیر معماری یک شبکه عصبی دو لایه را نشان می دهد (توجه داشته باشید که سطح ورودیمعمولاً هنگام شمارش تعداد لایه ها در یک شبکه عصبی حذف می شود).

    ایجاد یک کلاس شبکه عصبی در پایتون ساده به نظر می رسد:

    آموزش شبکه های عصبی

    خارج شوید ŷ شبکه عصبی دو لایه ساده:

    در معادله بالا، وزن‌های W و بایاس‌های b تنها متغیرهایی هستند که بر خروجی ŷ تأثیر می‌گذارند.

    به طور طبیعی، مقادیر صحیح برای وزن ها و سوگیری ها، دقت پیش بینی ها را تعیین می کند. روند تنظیم دقیقوزن ها و بایاس ها از ورودی به عنوان .

    هر تکرار فرآیند یادگیری شامل مراحل زیر است

    • محاسبه خروجی پیش بینی شده ŷ، به نام انتشار رو به جلو
    • به روز رسانی وزن ها و سوگیری ها، نامیده می شود

    نمودار توالی زیر روند را نشان می دهد:

    انتشار مستقیم

    همانطور که در نمودار بالا دیدیم، انتشار رو به جلو -  فقط یک محاسبه ساده است، و برای یک شبکه عصبی 2 لایه پایه، خروجی شبکه عصبی با:

    بیایید برای انجام این کار یک تابع انتشار رو به جلو به کد پایتون خود اضافه کنیم. توجه داشته باشید که برای سادگی، آفست ها را 0 فرض کرده ایم.

    با این حال، ما به روشی برای ارزیابی «عامل کیفیت» پیش‌بینی‌هایمان نیاز داریم، یعنی اینکه پیش‌بینی‌های ما تا چه حد است.) عملکرد از دست دادنفقط به ما اجازه می دهد این کار را انجام دهیم.

    عملکرد از دست دادن

    توابع زیان زیادی در دسترس هستند و ماهیت مشکل ما باید انتخاب تابع ضرر را تعیین کند. در این کار استفاده خواهیم کرد مجموع مربعات خطاهابه عنوان یک تابع ضرر.

    مجموع مجذور خطاها - میانگین اختلاف بین هر مقدار پیش بینی شده و واقعی است.

    هدف یادگیری یافتن مجموعه ای از وزن ها و سوگیری هاست که عملکرد از دست دادن را به حداقل می رساند.

    پس انتشار

    اکنون که خطای پیش‌بینی (زیان) خود را اندازه‌گیری کرده‌ایم، باید راهی پیدا کنیم انتشار مجدد خطاو وزن و تعصبات خود را به روز کنیم.

    برای دانستن مجموع مناسب برای تنظیم وزن ها و بایاس ها، باید مشتق تابع ضرر را با توجه به وزن ها و بایاس ها بدانیم.

    از تحلیل به یاد بیاورید که مشتق تابع  -  مماس شیب تابع است.

    اگر مشتق داریم، می‌توانیم به سادگی وزن‌ها و بایاس‌ها را با افزایش/کاهش آنها به‌روزرسانی کنیم (نمودار بالا را ببینید). نامیده می شود.

    با این حال، ما نمی‌توانیم مستقیماً مشتق تابع ضرر را با توجه به وزن‌ها و بایاس‌ها محاسبه کنیم، زیرا معادله تابع ضرر حاوی وزن و بایاس نیست. بنابراین ما به یک قانون زنجیره ای برای کمک به محاسبه نیاز داریم.

    اوه! این دست و پا گیر بود، اما به ما این امکان را داد که به آنچه نیاز داریم - مشتق (شیب) تابع از دست دادن با توجه به وزن ها، دست پیدا کنیم. اکنون می توانیم وزنه ها را بر اساس آن تنظیم کنیم.

    بیایید تابع backpropagation (backpropagation) را به کد پایتون خود اضافه کنیم:

    بررسی عملکرد شبکه عصبی

    اکنون که کد پایتون کامل خود را برای انتشار به جلو و عقب داریم، بیایید شبکه عصبی خود را به عنوان مثال در نظر بگیریم و ببینیم چگونه کار می کند.


    مجموعه ای ایده آل از ترازو

    شبکه عصبی ما باید مجموعه وزن‌های ایده‌آل را برای نشان دادن این ویژگی یاد بگیرد.

    بیایید یک شبکه عصبی را برای 1500 تکرار آموزش دهیم و ببینیم چه اتفاقی می افتد. با نگاهی به نمودار تلفات تکراری زیر، به وضوح می‌بینیم که ضرر به صورت یکنواخت به حداقل کاهش می‌یابد. این با الگوریتم نزول گرادیان که قبلاً در مورد آن صحبت کردیم، سازگار است.

    بیایید به پیش بینی نهایی (استنتاج) از شبکه عصبی پس از 1500 تکرار نگاه کنیم.

    ما آن را انجام دادیم!الگوریتم پیش و پس انتشار ما عملکرد موفقیت آمیز شبکه عصبی را نشان داد و پیش بینی ها بر روی مقادیر واقعی همگرا می شوند.

    توجه داشته باشید که تفاوت جزئی بین پیش بینی ها و مقادیر واقعی وجود دارد. این امر مطلوب است زیرا از برازش بیش از حد جلوگیری می کند و به شبکه عصبی اجازه می دهد تا روی داده های دیده نشده بهتر تعمیم یابد.

    افکار نهایی

    من در فرآیند نوشتن شبکه عصبی خودم از ابتدا چیزهای زیادی یاد گرفتم. اگرچه کتابخانه ها یادگیری عمیقمانند TensorFlow و Keras، اجازه ایجاد را می دهند شبکه های عمیقبدون درک کامل کار درونیشبکه‌های عصبی، به نظر من برای دانشمندان داده‌ای که شروع به کار کرده‌اند، به درک عمیق‌تری از آنها کمک می‌کند.

    من مقدار زیادی از زمان شخصی خود را روی آن سرمایه گذاری کرده ام این کارو امیدوارم برای شما مفید باشد!

    شبکه‌های عصبی مصنوعی (ANN) - مدل‌های ریاضی و همچنین پیاده‌سازی نرم‌افزاری یا سخت‌افزاری آن‌ها که بر اساس اصل سازماندهی و عملکرد بیولوژیکی ساخته شده‌اند. شبکه های عصبی- شبکه های سلول های عصبی یک موجود زنده.

    شبکه های عصبی مصنوعی یک سیستم به هم پیوسته و متقابل هستند پردازنده های ساده(نرون های مصنوعی).

    شبکه های عصبی به معنای معمول کلمه برنامه ریزی نشده اند، بلکه آموزش دیده اند. توانایی یادگیری یکی از مزیت های اصلی شبکه های عصبی نسبت به الگوریتم های سنتی است. ویکیپدیا

    شبکه های عصبی از مغز خود ما الهام گرفته شده اند. مدل استاندارد نورون بیش از پنجاه سال پیش اختراع شد و از سه بخش اصلی تشکیل شده است:

    • دنتریت(های) (دندریت)- مسئول جمع آوری سیگنال های دریافتی؛
    • سوما (سوما)- مسئول پردازش و جمع بندی اصلی سیگنال ها.
    • آکسون (آکسون)- مسئول سیگنال دهی به دندریت های دیگر.

    کار یک نورون را می توان چیزی شبیه به این توصیف کرد: دندریت ها سیگنال های دریافتی از نورون های دیگر را جمع آوری می کنند، سپس سوماها جمع بندی و محاسبه سیگنال ها و داده ها را انجام می دهند و در نهایت، بر اساس نتیجه پردازش، می توانند "بگویند" آکسون ها برای انتقال بیشتر سیگنال. عبور بیشتر به عوامل مختلفی بستگی دارد، اما ما می‌توانیم این رفتار را به‌عنوان مدل‌سازی کنیم تابع انتقالیک ورودی می گیرد، آن را پردازش می کند و در صورت رعایت ویژگی های تابع انتقال، خروجی را آماده می کند.

    نورون بیولوژیکی - یک سیستم پیچیده, مدل ریاضیکه هنوز به طور کامل ساخته نشده است. مدل های زیادی معرفی شده اند که از نظر پیچیدگی محاسباتی و شباهت به یک نورون واقعی متفاوت هستند. یکی از مهمترین آنها نورون رسمی (FN) است. علیرغم سادگی FN، شبکه‌های ساخته شده از چنین نورون‌هایی می‌توانند یک تابع چند بعدی دلخواه را در خروجی تشکیل دهند (منبع: Zaentsev I.V. شبکه‌های عصبی: مدل‌های پایه).

    نورون از یک جمع کننده وزن دار و یک عنصر غیر خطی تشکیل شده است. عملکرد یک نورون با فرمول های زیر تعیین می شود:

    یک نورون چندین ورودی دارد ایکسو یک خروجی خارج. پارامترهای نورون که عملکرد آن را تعیین می کنند عبارتند از: بردار وزن ها w، سطح آستانه θ و شکل تابع فعال سازی اف.

    شبکه های عصبی به دلیل ویژگی های زیر مورد توجه قرار می گیرند:

    • قادر به حل وظایف رسمی دشوار؛
    • ذاتی اصل موازیکار، که هنگام پردازش مقادیر زیادی داده بسیار مهم است.
    • توانایی یادگیری و توانایی تعمیم.
    • تحمل خطا؛

    ویژگی های اصلی شبکه های عصبی عبارتند از:

      توانایی یادگیری. شبکه های عصبی برنامه نویسی نمی شوند، بلکه با مثال آموزش داده می شوند. شبکه پس از ارائه سیگنال های ورودی (احتمالاً همراه با خروجی های مورد نیاز)، پارامترهای خود را به گونه ای تنظیم می کند که پاسخ مورد نیاز را ارائه دهد.

      تعمیم. پاسخ شبکه پس از آموزش می تواند تا حدودی نسبت به تغییرات کوچک در سیگنال های ورودی غیر حساس باشد. این توانایی ذاتی برای "دیدن" یک تصویر از طریق نویز و اعوجاج برای تشخیص الگو بسیار مهم است. توجه به این نکته مهم است که یک شبکه عصبی مصنوعی به دلیل ساختار خود، و نه از طریق استفاده از "هوش انسانی" در فرم برنامه های کامپیوتری مخصوص نوشته شده

      موازی سازی. اطلاعات در شبکه به صورت موازی پردازش می شود، که این امکان را فراهم می کند که پردازش داده ها به اندازه کافی پیچیده با استفاده از تعداد زیادی دستگاه ساده انجام شود.

      قابلیت اطمینان بالا. شبکه می تواند به درستی عمل کند حتی اگر برخی از نورون ها از کار بیفتند، به دلیل این واقعیت که محاسبات به صورت محلی و موازی انجام می شود.

    الگوریتم حل مسائل با استفاده از پرسپترون چند لایه(منبع: Zaentsev I. V. شبکه های عصبی: مدل های پایه)

    برای ساختن پرسپترون چندلایه، باید پارامترهای آن را انتخاب کنید. اغلب، انتخاب وزنه ها و آستانه ها نیاز به تمرین دارد، یعنی. تغییرات گام به گام در وزن ها و سطوح آستانه.

    الگوریتم حل کلی:

    1. تعیین کنید که چه معنایی به اجزای بردار ورودی متصل است ایکس. بردار ورودی باید شامل یک شرط رسمی از مسئله باشد، به عنوان مثال. تمام اطلاعاتی که برای دریافت پاسخ نیاز دارید
    2. بردار خروجی را انتخاب کنید yبه گونه ای که اجزای آن حاوی پاسخ کامل به تکلیف باشد.
    3. نوع غیرخطی بودن نورون ها (تابع فعال سازی) را انتخاب کنید. در این مورد، مطلوب است که ویژگی های مشکل را در نظر بگیریم، زیرا یک انتخاب خوب زمان آموزش را کوتاه می کند.
    4. تعداد لایه ها و نورون های لایه را انتخاب کنید.
    5. محدوده ورودی ها، خروجی ها، وزن ها و سطوح آستانه را با در نظر گرفتن مجموعه مقادیر تابع فعال سازی انتخاب شده تنظیم کنید.
    6. مقادیر اولیه را به وزن ها و آستانه ها اختصاص دهید و گزینه های اضافی(به عنوان مثال، شیب عملکرد فعال سازی، اگر در طول آموزش تنظیم شود). مقادیر اولیه نباید زیاد باشد تا نورون ها اشباع نشوند (در قسمت افقی تابع فعال سازی)، در غیر این صورت یادگیری بسیار کند خواهد بود. مقادیر اولیه نباید خیلی کوچک باشد، به طوری که خروجی اکثر نورون ها برابر با صفر نباشد، در غیر این صورت یادگیری نیز کند می شود.
    7. ارائه آموزش، یعنی پارامترهای شبکه را انتخاب کنید تا کار به بهترین شکل حل شود. در پایان آموزش، شبکه آماده است تا مشکلاتی را که در آن آموزش دیده است، حل کند.
    8. شرایط مسئله را به صورت بردار به ورودی شبکه ارسال کنید ایکس. محاسبه بردار خروجی y، که یک راه حل رسمی برای مشکل ارائه می دهد.

    مشکلاتی که باید حل شوند

    مسائل حل شده با استفاده از شبکه های عصبی ().

      طبقه بندی تصویر. وظیفه نشان دادن این است که آیا تصویر ورودی (مثلاً یک سیگنال گفتار یا یک کاراکتر دست نویس) که توسط یک بردار ویژگی نشان داده شده است به یک یا چند کلاس از پیش تعریف شده تعلق دارد یا خیر. کاربردهای شناخته شده عبارتند از: تشخیص حروف، تشخیص گفتار، طبقه بندی سیگنال الکتروکاردیوگرام و طبقه بندی سلول های خونی.

      خوشه بندی / دسته بندی. هنگام حل مشکل خوشه بندی، که به عنوان طبقه بندی تصاویر "بدون نظارت" نیز شناخته می شود، هیچ نمونه آموزشی با برچسب کلاس وجود ندارد. الگوریتم خوشه بندی بر اساس شباهت تصاویر است و تصاویر مشابه را در یک خوشه قرار می دهد. خوشه‌بندی برای استخراج دانش، فشرده‌سازی داده‌ها و کشف ویژگی‌های داده استفاده شده است.

      تقریب تابع. فرض کنید یک نمونه آموزشی ((x1,y1), (x2,y2)..., (xn,yn)) (جفت داده ورودی-خروجی) داریم که توسط یک تابع ناشناخته (x) که توسط نویز تحریف شده است تولید می شود. مشکل تقریب یافتن تخمینی برای تابع مجهول (x) است. تقریب توابع برای حل بسیاری از مسائل مهندسی و مدل‌سازی علمی ضروری است.

      پیش بینی / پیش بینی. بگذارید n نمونه گسسته (y(t1)، y(t2)...، y(tn)) در زمان های متوالی t1، t2،...، tn داده شود. مشکل پیش‌بینی مقدار y(tn+1) در زمان آینده tn+1 است. پیش بینی/پیش بینی تاثیر قابل توجهی بر تصمیم گیری در کسب و کار، علم و فناوری دارد. پیش بینی قیمت بازار سهام و پیش بینی آب و هوا می باشد برنامه های کاربردی نمونهتکنیک های پیش بینی/پیش بینی

      بهينه سازي. مسائل متعدد در ریاضیات، آمار، مهندسی، علوم، پزشکی و اقتصاد را می توان مسائل بهینه سازی در نظر گرفت. وظیفه الگوریتم بهینه سازی یافتن راه حلی است که سیستم محدودیت ها را برآورده کند و حداکثر یا حداقل کند. تابع هدف. مسئله فروشنده دوره گرد NP-complete یک مثال کلاسیک از یک مسئله بهینه سازی است.

      حافظه قابل آدرس دهی بر اساس محتوا. در مدل محاسباتی فون نویمان، دسترسی به حافظه تنها از طریق آدرسی که مستقل از محتویات حافظه است، در دسترس است. علاوه بر این، اگر در محاسبه آدرس خطایی رخ دهد، می توان اطلاعات کاملا متفاوتی پیدا کرد. حافظه انجمنی، یا یک حافظه قابل آدرس دهی محتوا در محتوای مشخص شده موجود است. محتویات حافظه را می توان حتی با ورودی جزئی یا محتویات مخدوش به خاطر آورد. حافظه انجمنی هنگام ایجاد چند رسانه ای بسیار مطلوب است پایگاه های اطلاع رسانیداده ها.

      کنترل. در نظر گرفتن سیستم پویابا مجموعه (u(t)، y(t))، که در آن u(t) عمل کنترل ورودی است و y(t) خروجی سیستم در زمان t است. در سیستم های کنترل با مدل مرجعهدف کنترل محاسبه چنین اقدام ورودی u(t) است که در آن سیستم از مسیر مورد نظر دیکته شده توسط مدل مرجع پیروی می کند. یک مثال کنترل موتور بهینه است.

    انواع معماری

    معماری شبکه های عصبی- روش سازماندهی و برقراری ارتباط عناصر منفردشبکه های عصبی (نرون ها). تفاوت های معماری خود نورون ها عمدتاً در استفاده از عملکردهای مختلف فعال سازی (تحریکی) است. با توجه به معماری اتصالات، شبکه های عصبی را می توان به دو دسته شبکه های انتشار مستقیم و شبکه های بازگشتی تقسیم کرد.

    طبقه بندی شبکه های عصبی مصنوعی بر اساس معماری آنها در شکل زیر نشان داده شده است.

    طبقه بندی مشابه، اما کمی گسترش یافته است

    شبکه انتشار مستقیم (شبکه انتقال مستقیم)- شبکه عصبی بدون بازخورد(حلقه ها). در چنین شبکه ای، پردازش اطلاعات یک جهته است: سیگنال از لایه ای به لایه دیگر در جهت از لایه ورودی شبکه عصبی به لایه خروجی منتقل می شود. سیگنال خروجی (پاسخ شبکه) پس از تعداد مراحل از پیش تعیین شده (برابر تعداد لایه ها) تضمین می شود. پیاده سازی شبکه های فید فوروارد آسان است و به خوبی قابل درک است. حل مسائل پیچیده به تعداد زیادی نورون نیاز دارد.

    جدول مقایسه ادراکی چند لایهو شبکه های RBF

    پرسپترون چند لایه شبکه های RBF
    مرز تصمیم، تقاطع ابرصفحه ها است مرز تصمیم، تقاطع ابرکره‌ها است که مرزی با شکل پیچیده‌تر را مشخص می‌کند.
    توپولوژی پیچیده اتصالات بین نورون ها و لایه ها شبکه عصبی دو لایه ساده
    الگوریتم یادگیری پیچیده و آهسته همگرا روش یادگیری سریع: حل سیستم معادلات + خوشه بندی
    روی یک نمونه آموزشی کوچک کار کنید برای یک نتیجه قابل قبول، به مقدار قابل توجهی از داده های آموزشی نیاز دارد
    تطبیق پذیری کاربرد: خوشه بندی، تقریب، کنترل و غیره. به عنوان یک قاعده، فقط تقریب تابع و خوشه بندی

    مقدار مشتق به راحتی بر حسب خود تابع بیان می شود. محاسبه مشتق سریع یادگیری را سرعت می بخشد.

    منحنی گاوسی

    در مواردی استفاده می شود که پاسخ نورون باید برای مقدار خاصی از NET حداکثر باشد.

    ماژول های پایتون برای شبکه های عصبی

    مثال ساده

    به عنوان مثال، من یک شبکه عصبی ساده (ساده پرسپترون) که پس از آموزش قادر به تشخیص اشیاء پرنده، نه همه، بلکه فقط خواهند بود مرغ دریایی:)، تمام تصاویر ورودی دیگر به عنوان شناسایی خواهند شد بشقاب پرنده.

    # encoding=utf8 وارد کردن کلاس تصادفی NN: def __init__(خود، آستانه، اندازه): """ پارامترهای اولیه را تنظیم کنید. """ self.threshold = آستانه self.size = اندازه self.init_weight() def init_weight(self): """ ماتریس وزن را با داده های تصادفی اولیه کنید. """ self.weights = [ برای j در xrange(self.size)] def check(self, sample): """ خروجی را برای نمونه تصویر بخوانید. اگر vsum > self. آستانه، پس می توانیم فرض کنیم که نمونه تصویری از یک مرغ دریایی دارد. """ vsum = 0 برای i در xrange(self.size): برای j در xrange(self.size): vsum += self.weights[i][ j] * نمونه[i][j] if vsum > self.threshold: return True other: return False def teach(self, sample): """ آموزش شبکه عصبی. """ برای i در xrange(self.size) : برای j در xrange(self.size): self.weights[i][j] += نمونه[i][j] nn = NN(20، 6) # شبکه عصبی را آموزش دهید. tsample1 = [ , , , , , , ] nn.teach(tsample1) tsample2 = [ , , , , , ] nn.teach(tsample2) tsample3 = [ , , , , , , ] nn.teach(tsample4 =3) [ , , , , , , ] nn.teach(tsample4) # بررسی کنید که شبکه عصبی چه کاری می تواند انجام دهد. # تصویر یک مرغ دریایی را که تقریباً شبیه به تصویری است که پرسپترون از آن می داند عبور دهید. wsample1 = [ , , , , , , ] print u"seagull" if nn.check(wsample1) else u"UFO" # در یک تصویر ناشناخته عبور کنید. wsample2 = [ , , , , , , ] print u"seagull" if nn.check(wsample2) else u"UFO" # تصویر یک مرغ دریایی را که تقریباً شبیه تصویری است که پرسپترون از آن می داند عبور دهید. wsample3 = [ , , , , , , ] print u"seagull" if nn.check(wsample3) other u"UFO"

    احتمالاً برخی از شما اخیراً دوره‌های استنفورد، به‌ویژه کلاس ai و ml-class را گذرانده‌اید. با این حال، تماشای چند سخنرانی ویدیویی، پاسخ دادن به سؤالات مسابقه و نوشتن ده‌ها برنامه در Matlab / Octave یک چیز است، شروع یک چیز دیگر است. استفاده از دانش کسب شده در عمل برای اینکه دانش دریافتی از اندرو نگ در همان گوشه تاریک مغزم نیفتد که dft، نسبیت خاص و معادله اویلر لاگرانژ گم شدند، تصمیم گرفتم اشتباهات مؤسسه را تکرار نکنم و در حالی که دانش هنوز در حافظه من تازه است. ، تا حد امکان تمرین کنید.

    و درست در آن زمان DDoS به سایت ما آمد. می‌توان با کدام روش‌های برنامه‌نویسی مدیریت (grep / awk / غیره) مقابله کرد یا به استفاده از فناوری‌های یادگیری ماشین متوسل شد.

    نمونه ای از ساخت فرهنگ لغت و بردار ویژگی "a

    فرض کنید شبکه عصبی خود را فقط با دو مثال آموزش می دهیم: یکی خوب و دیگری بد. سپس سعی می کنیم آن را در یک رکورد آزمایشی فعال کنیم.

    ورودی از لاگ "بد":
    0.0.0.0 - - "POST /forum/index.php HTTP/1.1" 503 107 "http://www.mozilla-europe.org/" "-"

    ورودی از یک گزارش "خوب":
    0.0.0.0 - - "GET /forum/rss.php?topic=347425 HTTP/1.0" 200 1685 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052 3.0 اینچ

    فرهنگ لغت حاصل:
    ["__UA___OS_U", "__UA_EMPTY", "__REQ___METHOD_POST", "__REQ___HTTP_VER_HTTP/1.0", "__REQ___URL___NETLOC_", "__REQ___URL___PATH_/forum/rss.php", "__REQ___URL___PATH_/forum/index.php", "__REQ___URL___SCHEME_", "__REQ___HTTP_VER_HTTP/ 1.1، "__UA___VER_Firefox/3.0"، "__REFER___NETLOC_www.mozilla-europe.org"، "__UA___OS_Windows"، "__UA___BASE_Mozilla/5.0"، "__CODE_503/5.0"، "__CODE_503"، "__CODE_503", "__CODE_503", "__CODE____", "__CODE_503", "__CODE____", "__CODE____", "__CODE_503", "_RE_ER_F"، "_RE_ER_F" "__REQ___METHOD_GET"، "__UA___OS_Windows NT 5.1"، "__UA___OS_rv:1.9"، "__REQ___URL___QS_topic"، "__UA___VER_Gecko/2008052906"]

    ورودی آزمون:
    0.0.0.0 - - "GET /forum/viewtopic.php?t=425550 HTTP/1.1" 502 107 "-" "BTWebClient/3000(25824)"

    بردار ویژگی آن:

    توجه داشته باشید که بردار ویژگی چقدر "پراکنده" است - این رفتار برای همه درخواست ها مشاهده می شود.

    تقسیم مجموعه داده

    تمرین خوبی است که مجموعه داده "a" را به چند قسمت تقسیم کنید. من آن را به دو قسمت با نسبت 70/30 تقسیم کردم:
    • مجموعه آموزشی ما شبکه عصبی خود را بر روی آن آموزش می دهیم.
    • مجموعه تست . با آن، ما بررسی می کنیم که شبکه عصبی ما چقدر آموزش دیده است.
    چنین پارتیشنی به این دلیل است که شبکه عصبی با کمترین خطای آموزشی (خطا در هر مجموعه آموزشی) b تولید می کند. Oاشتباه بزرگ در داده های جدید، زیرا ما شبکه را "بازآموزی" کردیم و آن را برای مجموعه آموزشی تیز کردیم.
    در آینده، اگر مجبور باشید با انتخاب ثابت‌های بهینه گیج شوید، مجموعه داده‌ها باید به 3 بخش به نسبت 60/20/20 تقسیم شوند: مجموعه آموزشی، مجموعه تست و اعتبارسنجی متقاطع. آخرین مورد به عنوان یک انتخاب عمل خواهد کرد پارامترهای بهینهشبکه عصبی (به عنوان مثال، کاهش وزن).

    به ویژه شبکه عصبی

    اکنون که دیگر هیچ گزارش متنی در دسترس نداریم، بلکه فقط ماتریس های بردار ویژگی داریم، می توانیم خود شبکه عصبی را شروع کنیم.

    بیایید با انتخاب ساختار شروع کنیم. من یک شبکه را از یک لایه پنهان انتخاب کردم که دو برابر اندازه لایه ورودی است. چرا؟ ساده است: این همان چیزی است که اندرو نگ وصیت کرد در صورتی که ندانید از کجا شروع کنید. من فکر می کنم در آینده می توانید با ترسیم برنامه های آموزشی با این موضوع بازی کنید.
    سیگموئید طولانی رنج به عنوان تابع فعال سازی برای لایه پنهان و Softmax برای لایه خروجی انتخاب شده است. مورد دوم در صورتی انتخاب می شود که مجبور باشید انجام دهید
    طبقه بندی چند طبقه با کلاس های متقابل منحصر به فرد. به عنوان مثال، درخواست های "خوب" را به باطن، درخواست های "بد" - به ممنوعیت فایروال و درخواست های "خاکستری" - برای حل کپچا ارسال کنید.

    یک شبکه عصبی تمایل دارد به حداقل محلی برود، بنابراین من چندین شبکه در کد خود می‌سازم و یکی را انتخاب می‌کنم که کوچک‌ترین خطای تست را داشته باشد (توجه داشته باشید، این خطا در مجموعه تست است، نه مجموعه آموزشی).

    سلب مسئولیت

    من یک جوشکار واقعی نیستم. درباره یادگیری ماشینی، من فقط می‌دانم چه چیزی از کلاس ml و ai-class به‌دست آورده‌ام. من برنامه نویسی را در پایتون نسبتاً اخیراً شروع کردم و کد زیر در 30 دقیقه نوشته شد (زمان همانطور که متوجه شدید تمام می شد) و بعداً فقط کمی فایل شد.

    همچنین این کد خودکفا نیست. او هنوز نیاز به فیلمنامه دارد. به عنوان مثال، اگر یک IP در عرض X دقیقه N درخواست بد ایجاد کرد، آن را در فایروال ممنوع کنید.

    کارایی

    • lfu_cache. از ActiveState به منظور سرعت بخشیدن به پردازش درخواست های "فرکانس بالا" منتقل شده است. پایین - مصرف حافظه افزایش یافته است.
    • PyBrain به طور ناگهانی در پایتون نوشته شده است و بنابراین خیلی سریع نیست، با این حال، اگر Fast=True هنگام ایجاد شبکه مشخص شده باشد، می تواند از arac ماژول مبتنی بر ATLAS استفاده کند. در مستندات PyBrain می توانید اطلاعات بیشتری در مورد این موضوع بخوانید.
    • موازی سازی. من شبکه عصبی خود را روی یک سرور نسبتاً "ضخیم" نهالم آموزش دادم، با این حال، حتی در آنجا نیز مضرات آموزش تک رشته ای را احساس کردم. می توانید به موازی کردن آموزش یک شبکه عصبی فکر کنید. یک راه حل ساده این است که چندین شبکه عصبی را آموزش دهید. موازی و بهترین را از بین آنها انتخاب کنید، اما این بار اضافی بر روی حافظه ایجاد می کند، که همچنین خیلی خوب نیست. راه حل یک مرحله ای. شاید منطقی باشد که به سادگی همه چیز را در C بازنویسی کنیم، زیرا کل پایه نظری در کلاس ml جویده شده است.
    • مصرف حافظه و تعداد امکانات. یک بهینه‌سازی حافظه خوب، انتقال از آرایه‌های پایتون استاندارد به numpy "ها بود. همچنین، کاهش اندازه فرهنگ لغت و/یا استفاده از PCA می‌تواند کمک زیادی کند.

    برای آینده

    • فیلدهای اضافی در گزارش شما می توانید چیزهای بیشتری را به گزارش ترکیبی اضافه کنید، باید فکر کنید که کدام فیلدها به شناسایی ربات ها کمک می کنند. شاید منطقی باشد که اولین اکتت آدرس IP را در نظر بگیریم، زیرا در یک پروژه وب غیر بین المللی، کاربران چینی به احتمال زیاد ربات هستند.

    شبکه های عصبی عمدتاً بر روی ایجاد و آموزش داده می شوند زبان پایتون. بنابراین، داشتن درک اولیه از نحوه نوشتن برنامه بر روی آن بسیار مهم است. در این مقاله به طور مختصر و واضح در مورد مفاهیم اساسی این زبان صحبت خواهم کرد: متغیرها، توابع، کلاس ها و ماژول ها.

    این مطالب برای افرادی است که با زبان های برنامه نویسی آشنایی ندارند.

    ابتدا باید پایتون را نصب کنید. سپس باید یک محیط مناسب برای نوشتن برنامه ها در پایتون راه اندازی کنید. این دو مرحله به پورتال اختصاص دارد.

    اگر همه چیز نصب و پیکربندی شده باشد، می توانید شروع کنید.

    متغیرها

    متغیر- یک مفهوم کلیدی در هر زبان برنامه نویسی (و نه تنها در آنها). ساده ترین کار این است که یک متغیر را به عنوان یک جعبه با یک برچسب در نظر بگیرید. این کادر حاوی چیزی است (یک عدد، یک ماتریس، یک شی، ...) که برای ما ارزش دارد.

    به عنوان مثال، فرض کنید می خواهیم یک متغیر x ایجاد کنیم که باید مقدار 10 را ذخیره کند. در پایتون، کد ایجاد این متغیر به شکل زیر است:

    در سمت چپ ما اعلاممتغیری به نام x. این معادل این است که ما یک برچسب شخصی روی جعبه چسبانده ایم. بعد علامت تساوی و عدد 10 می آید. علامت تساوی در اینجا نقش غیرعادی ایفا می کند. این به این معنی نیست که "x 10 است". برابری در این موردعدد 10 را در جعبه قرار می دهد. درست تر، ما اختصاص دهدمتغیر x عدد 10.

    حال در کد زیر می توانیم به این متغیر دسترسی داشته باشیم و اعمال مختلفی را با آن انجام دهیم.

    شما به سادگی می توانید مقدار این متغیر را روی صفحه نمایش دهید:

    X=10 چاپ (x)

    کتیبه print(x) یک فراخوانی تابع است. ما آنها را بیشتر در نظر خواهیم گرفت. اکنون نکته مهم این است که این تابع آنچه را که بین براکت ها قرار دارد را روی کنسول چاپ می کند. بین براکت ها x داریم. قبلاً به x مقدار 10 را اختصاص می دادیم. اگر برنامه بالا را اجرا کنید این دقیقاً 10 است که در کنسول نمایش داده می شود.

    با متغیرهایی که اعداد را ذخیره می کنند، می توانید عملیات ساده مختلفی را انجام دهید: جمع، تفریق، ضرب، تقسیم و افزایش به توان.

    X = 2 y = 3 # افزودن z = x + y چاپ(z) # 5 # تفاوت z = x - y چاپ(z) # -1 # محصول z = x * y چاپ(z) # 6 # تقسیم z = x / y print(z) # 0.66666... ​​‎# توان z = x ** y print(z) # 8

    در کد بالا ابتدا دو متغیر شامل 2 و 3 ایجاد می کنیم. سپس یک متغیر z ایجاد می کنیم که نتیجه عملیات را روی x و y ذخیره می کند و نتایج را در کنسول چاپ می کند. این مثال به وضوح نشان می دهد که یک متغیر می تواند مقدار خود را در حین اجرای برنامه تغییر دهد. بنابراین، متغیر z ما مقدار خود را تا 5 برابر تغییر می دهد.

    کارکرد

    گاهی اوقات لازم می شود چندین بار اعمال مشابه انجام شود. به عنوان مثال، در پروژه خود اغلب نیاز به نمایش 5 خط متن داریم.

    "این یک متن بسیار مهم است!"
    "این متن قابل خواندن نیست"
    "خطا در خط بالا عمدا انجام شد"
    "سلام و خداحافظ"
    "پایان"

    کد ما به شکل زیر خواهد بود:

    X = 10 y = x + 8 - 2 print("این یک متن بسیار مهم است!") print("این متن نباید خوانده شود") print("اشتباهی در خط بالایی عمدا وجود داشت") print( "سلام و خداحافظ") print ("پایان") z = x + y print("این یک متن بسیار مهم است!") print("این متن قابل خواندن نیست") print("اشتباهی در خط بالایی وجود داشت" با هدف") print("سلام و خداحافظ") print ("پایان") test = z print("این یک متن بسیار مهم است!") print("این متن قابل خواندن نیست") print("خطا در خط بالا عمدا ساخته شده است") print("سلام و خداحافظ") چاپ ("پایان")

    همه چیز بسیار زائد و ناخوشایند به نظر می رسد. همچنین در خط دوم خطایی وجود دارد. می توان آن را تعمیر کرد، اما باید در سه مکان به طور همزمان رفع شود. و اگر در پروژه ما این پنج خط 1000 بار فراخوانی شود؟ و همه چیز در جاهای مختلفو فایل ها؟

    به خصوص برای مواردی که نیاز به اجرای دستورات یکسان است، زبان های برنامه نویسی می توانند توابع ایجاد کنند.

    تابع- یک بلوک جداگانه از کد که می تواند با نام فراخوانی شود.

    یک تابع با استفاده از کلمه کلیدی def تعریف می شود. پس از آن نام تابع و پس از آن براکت ها و دو نقطه وجود دارد. در مرحله بعد، با تورفتگی، باید اقداماتی را که هنگام فراخوانی تابع انجام می شود، فهرست کنید.

    Def print_5_lines(): print("این یک متن بسیار مهم است!") print("این متن قابل خواندن نیست") print("خط بالای عمدا اشتباه بود") print("سلام و خداحافظ") print(" پایان")

    اکنون تابع print_5_lines () را تعریف کرده ایم. حال، اگر در پروژه خود یک بار دیگر نیاز به درج پنج خط داشته باشیم، به سادگی تابع خود را فراخوانی می کنیم. به طور خودکار تمام اقدامات را انجام می دهد.

    # تعریف تابع def print_5_lines(): print("این یک متن بسیار مهم است!") print("این متن قابل خواندن نیست") print("خطا در خط بالایی عمدا ایجاد شده است") print("سلام" و خداحافظ") print("پایان") # کد پروژه ما x = 10 y = x + 8 - 2 print_5_lines() z = x + y print_5_lines() test = z print_5_lines()

    راحت است، اینطور نیست؟ ما به طور جدی خوانایی کد را بهبود بخشیده ایم. علاوه بر این، توابع نیز خوب هستند زیرا اگر می خواهید برخی از اقدامات را تغییر دهید، کافی است خود تابع را تغییر دهید. این تغییر در همه جاهایی که تابع شما فراخوانی می شود کار خواهد کرد. به این معنی که می توانیم خطای خط دوم متن خروجی ("not allow" > "not allow") را در بدنه تابع برطرف کنیم. نوع صحیح به طور خودکار در همه مکان های پروژه ما فراخوانی می شود.

    توابع با پارامترها

    فقط تکرار چند مرحله البته راحت است. اما این همه ماجرا نیست. گاهی اوقات می خواهیم متغیری را به تابع خود منتقل کنیم. بنابراین، تابع می تواند داده ها را دریافت کرده و از آنها در فرآیند اجرای دستورات استفاده کند.

    متغیرهایی که به تابع ارسال می کنیم فراخوانی می شوند استدلال ها.

    بیا بنویسیم یک تابع ساده، که دو عدد داده شده را به آن جمع کرده و نتیجه را برمی گرداند.

    Def sum(a, b): result = a + b نتیجه برمی گرداند

    خط اول تقریباً شبیه توابع معمولی است. اما بین پرانتزها اکنون دو متغیر وجود دارد. این گزینه هاکارکرد. تابع ما دو پارامتر دارد (یعنی دو متغیر می گیرد).

    پارامترها را می توان در داخل یک تابع درست مانند متغیرهای معمولی استفاده کرد. در خط دوم، یک نتیجه متغیر ایجاد می کنیم که برابر با مجموع پارامترهای a و b است. در خط سوم، مقدار متغیر نتیجه را برمی گردانیم.

    اکنون در کدهای بعدی می توانیم چیزی شبیه به:

    جدید = مجموع (2، 3) چاپ (جدید)

    تابع sum را فراخوانی می کنیم و دو آرگومان به نوبه خود به آن ارسال می کنیم: 2 و 3. 2 به مقدار متغیر a و 3 تبدیل به مقدار متغیر b می شود. تابع ما یک مقدار برمی گرداند (مجموع 2 و 3) و از آن برای ایجاد یک متغیر جدید new استفاده می کنیم.

    یاد آوردن. در کد بالا اعداد 2 و 3 آرگومان هستند توابع جمع. و در خود تابع sum متغیرهای a و b پارامتر هستند. به عبارت دیگر، متغیرهایی که هنگام فراخوانی یک تابع به آن ارسال می کنیم، آرگومان نامیده می شوند. اما در داخل تابع به این متغیرهای عبوری پارامتر می گویند. در واقع، این دو نام برای یک چیز هستند، اما نباید آنها را اشتباه بگیرید.

    بیایید یک مثال دیگر را در نظر بگیریم. بیایید یک تابع مربع (a) بسازیم که یک عدد را بگیرد و آن را مربع کند:

    Def Square(a): a * a را برگردانید

    تابع ما فقط از یک خط تشکیل شده است. بلافاصله نتیجه حاصل از ضرب پارامتر a در a را برمی گرداند.

    فکر می کنم قبلاً حدس زده اید که ما نیز با استفاده از یک تابع، خروجی داده را به کنسول تولید می کنیم. این تابع print() نامیده می شود و آرگومان ارسال شده به آن را به کنسول چاپ می کند: یک عدد، یک رشته، یک متغیر.

    آرایه ها

    اگر بتوان یک متغیر را به عنوان جعبه ای در نظر گرفت که چیزی (نه لزوماً یک عدد) را در خود جای می دهد، آرایه ها را می توان به عنوان قفسه کتاب در نظر گرفت. آنها شامل چندین متغیر به طور همزمان هستند. در اینجا نمونه ای از یک آرایه از سه عدد و یک رشته آورده شده است:

    آرایه=

    در اینجا یک مثال است، زمانی که متغیر شامل یک عدد نیست، به یک شی دیگر. در این حالت متغیر ما حاوی یک آرایه است. هر عنصر آرایه شماره گذاری شده است. بیایید سعی کنیم برخی از عناصر آرایه را نمایش دهیم:

    آرایه = چاپ (آرایه)

    در کنسول شما عدد 89 را خواهید دید. اما چرا 89 و نه 1؟ مسئله این است که در پایتون، مانند بسیاری از زبان های برنامه نویسی دیگر، شماره گذاری آرایه ها از 0 شروع می شود. بنابراین، آرایه به ما می دهد. دومینعنصر آرایه، نه اولین. برای فراخوانی اولین، باید آرایه می نوشت.

    اندازه آرایه

    گاهی اوقات بدست آوردن تعداد عناصر در یک آرایه بسیار مفید است. برای این کار می توانید از تابع len() استفاده کنید. به طور خودکار تعداد عناصر را شمارش می کند و تعداد آنها را برمی گرداند.

    آرایه = چاپ (لن (آرایه))

    عدد 4 در کنسول نمایش داده می شود.

    شرایط و چرخه ها

    به طور پیش فرض، هر برنامه ای به سادگی تمام دستورات را از بالا به پایین در یک ردیف اجرا می کند. اما شرایطی وجود دارد که باید شرایطی را بررسی کنیم و بسته به اینکه درست باشد یا نه، اقدامات مختلفی را انجام دهیم.

    علاوه بر این، اغلب لازم است که تقریباً همان توالی دستورات را بارها تکرار کنید.

    شرایط در موقعیت اول کمک می کند و چرخه ها در موقعیت دوم کمک می کنند.

    شرایط

    بسته به اینکه ادعای مورد آزمایش درست یا نادرست باشد، برای انجام دو مجموعه متفاوت از اقدامات، شرایط لازم است.

    در پایتون، شرایط را می توان با استفاده از ساختار if: ... else: ... نوشت. فرض کنید مقداری متغیر x = 10 داریم. اگر x کمتر از 10 باشد، می‌خواهیم x را بر 2 تقسیم کنیم. اگر x بزرگتر یا مساوی 10 باشد، می‌خواهیم متغیر دیگری ایجاد کنیم که برابر با مجموع x و عدد 100 است. کد به این شکل خواهد بود:

    X = 10 if(x< 10): x = x / 2 print(x) else: new = x + 100 print(new)

    بعد از ایجاد متغیر x شروع به نوشتن شرط خود می کنیم.

    همه چیز با کلمه کلیدی if (از انگلیسی "اگر" ترجمه شده) شروع می شود. در پرانتز، عبارت مورد بررسی را نشان می دهیم. در این مورد، ما بررسی می کنیم که آیا متغیر x ما واقعاً کمتر از 10 است یا خیر. اگر واقعاً کمتر از 10 است، آن را بر 2 تقسیم می کنیم و نتیجه را در کنسول چاپ می کنیم.

    سپس می آید کلمه کلیدی else ، پس از آن بلوک اقدامات شروع می شود که اگر عبارت داخل پرانتز بعد از if نادرست باشد، انجام می شود.

    اگر بزرگتر یا مساوی 10 باشد، یک متغیر جدید new ایجاد می کنیم که برابر x + 100 است و همچنین آن را در کنسول چاپ می کنیم.

    چرخه ها

    از حلقه ها برای تکرار مکرر اعمال استفاده می شود. فرض کنید می خواهیم جدولی از مربع های 10 عدد طبیعی اول را نمایش دهیم. اینجوری میشه انجام داد

    Print("Square 1 is " + str(1**2)) print("Square 2 is " + str(2**2)) print("Square 3 is " + str(3**2)) print( "Square 4 is " + str(4**2)) print("Square 5 is " + str(5**2)) print("Square 6 is " + str(6**2)) print("Square 7 is " + str(7**2)) print("Square 8 is " + str(8**2)) print("Square 9 is " + str(9**2)) print("Square 10 is " + str(10**2))

    از این واقعیت که رشته ها را اضافه می کنیم تعجب نکنید. "شروع رشته" + "پایان" در پایتون به سادگی به معنای الحاق رشته ها است: "شروع رشته". به همین ترتیب بالا، رشته "Square x is برابر با" را اضافه می کنیم و نتیجه افزایش عدد به توان دوم با استفاده از تابع str (x ** 2) تبدیل می شود.

    کد بالا بسیار زائد به نظر می رسد. اما اگر بخواهیم مربع های 100 عدد اول را چاپ کنیم چه باید کرد؟ ما عذاب میکشیم که عقب نشینی کنیم...

    چرخه ها برای همین است. دو نوع حلقه در پایتون وجود دارد: while و for. بیایید به نوبه خود با آنها برخورد کنیم.

    حلقه while دستورات لازم را تا زمانی که شرط درست باقی بماند، تکرار می کند.

    X = 1 در حالی که x<= 100: print("Квадрат числа " + str(x) + " равен " + str(x**2)) x = x + 1

    ابتدا یک متغیر ایجاد می کنیم و عدد 1 را به آن اختصاص می دهیم سپس یک حلقه while ایجاد می کنیم و بررسی می کنیم که آیا x ما کمتر از (یا مساوی) 100 است یا خیر. اگر کمتر از (یا مساوی) باشد، دو عمل انجام می دهیم:

    1. مربع x را به دست می آوریم
    2. x را 1 افزایش دهید

    پس از دستور دوم، برنامه به حالت باز می گردد. اگر شرط دوباره درست باشد، این دو عمل را دوباره انجام می دهیم. و به همین ترتیب تا زمانی که x برابر 101 شود. سپس شرط false خواهد شد و حلقه دیگر اجرا نمی شود.

    حلقه for برای تکرار روی آرایه ها طراحی شده است. بیایید همان مثال را با مربع های صد عدد طبیعی اول بنویسیم، اما از طریق حلقه for.

    برای x در محدوده (1,101): print("مربع " + str(x) + " است " + str(x**2))

    بیایید خط اول را تحلیل کنیم. برای ایجاد یک حلقه از کلمه کلیدی for استفاده می کنیم. بعد، نشان می‌دهیم که می‌خواهیم اقدامات خاصی را برای همه x در محدوده 1 تا 100 تکرار کنیم. تابع range(1101) آرایه‌ای از 100 عدد ایجاد می‌کند که با 1 شروع می‌شود و با 100 ختم می‌شود.

    در اینجا مثال دیگری از تکرار روی یک آرایه با استفاده از حلقه for آورده شده است:

    برای i in : print(i * 2)

    کد بالا 4 رقم را خروجی می دهد: 2، 20، 200 و 2000. در اینجا به وضوح می توانید ببینید که چگونه هر عنصر آرایه را می گیرد و مجموعه ای از اقدامات را انجام می دهد. سپس عنصر بعدی را می گیرد و همان مجموعه اقدامات را تکرار می کند. و به همین ترتیب تا زمانی که عناصر موجود در آرایه تمام شوند.

    کلاس ها و اشیاء

    در زندگی واقعی، ما نه با متغیرها یا توابع، بلکه با اشیا عمل می کنیم. قلم، ماشین، انسان، گربه، سگ، هواپیما - اشیاء. حالا بیایید شروع کنیم به بررسی جزئیات گربه.

    چند گزینه دارد. اینها شامل رنگ کت، رنگ چشم، نام مستعار او است. اما این همه ماجرا نیست. علاوه بر پارامترها، گربه می تواند اقدامات مختلفی را انجام دهد: خرخر، خش خش و خراش.

    ما فقط به طور کلی تمام گربه ها را به صورت شماتیک توضیح دادیم. مشابه شرح خواص و اعمالیک شی (مثلاً یک گربه) در زبان پایتون و کلاس نامیده می شود. یک کلاس به سادگی مجموعه ای از متغیرها و توابع است که نوعی شی را توصیف می کند.

    درک تفاوت بین یک کلاس و یک شی بسیار مهم است. کلاس - طرح A که شی را توصیف می کند. شیء اوست تجسم مادی. کلاس گربه توصیفی از خواص و اعمال آن است. شی گربه خود گربه واقعی است. گربه های واقعی می توانند بسیار متفاوت باشند - بسیاری از اشیاء گربه. اما فقط یک دسته از گربه ها وجود دارد. تصویر زیر نمایش خوبی است:

    کلاس ها

    برای ایجاد یک کلاس (طرحواره گربه ما)، باید کلمه کلیدی کلاس را بنویسیم و سپس نام این کلاس را مشخص کنیم:

    گربه کلاس:

    در مرحله بعد، باید اقدامات این کلاس (اقدامات گربه) را فهرست کنیم. همانطور که ممکن است حدس زده باشید اکشن ها توابعی هستند که در یک کلاس تعریف شده اند. چنین توابعی در یک کلاس متد نامیده می شوند.

    روش- یک تابع تعریف شده در یک کلاس.

    به صورت شفاهی، ما قبلاً روش های گربه را در بالا شرح داده ایم: خرخر، هیس، خراش. بیایید این کار را در پایتون انجام دهیم.

    # کلاس کلاس گربه Cat: # Purr def purr(self): print("Purrr!") # Hiss def hiss(self): print("Kshh!") # Scratch def scrabble(self): print("Scratch-scratch" !")

    ساده است! ما سه تابع منظم را گرفتیم و تعریف کردیم، اما فقط در داخل کلاس.

    برای مقابله با پارامتر خود نامفهوم، بیایید یک روش دیگر را به گربه خود اضافه کنیم. این متد هر سه متدی را که قبلا ایجاد شده اند به طور همزمان فراخوانی می کند.

    # کلاس کلاس گربه Cat: # Purr def purr(self): print("Purrr!") # Hiss def hiss(self): print("Kshh!") # Scratch def scrabble(self): print("Scratch-scratch" !") # All together def all_in_one(self): self.purr() self.hiss() self.scrabble()

    همانطور که می بینید پارامتر self که برای هر متدی اجباری است به ما امکان دسترسی به متدها و متغیرهای خود کلاس را می دهد! بدون این استدلال ما نمی توانیم چنین اقداماتی را انجام دهیم.

    حال بیایید ویژگی های گربه خود را (رنگ مو، رنگ چشم، نام مستعار) تنظیم کنیم. چگونه انجامش بدهیم؟ مطلقاً در هر کلاسی، می توانید تابع __init__() را تعریف کنید. این تابع همیشه زمانی فراخوانی می شود که ما شی واقعی کلاس خود را ایجاد می کنیم.

    در روش __init__() که در بالا مشخص شده است، ما متغیرهای گربه خود را تنظیم می کنیم. چطوری انجامش میدیم؟ ابتدا 3 آرگومان به این روش پاس می دهیم که رنگ کت، رنگ چشم و نام مستعار را بر عهده دارند. سپس، ما از پارامتر self استفاده می کنیم تا بلافاصله هنگام ایجاد یک شی، گربه خود را با 3 ویژگی توضیح داده شده در بالا تنظیم کنیم.

    این خط به چه معناست؟

    Self.wool_color = پشم_رنگ

    در سمت چپ، ما یک ویژگی برای گربه خود به نام wool_color ایجاد می کنیم، و سپس آن ویژگی را به مقدار موجود در پارامتر wool_color که به تابع __init__() ارسال می کنیم، تنظیم می کنیم. همانطور که می بینید، خط بالا هیچ تفاوتی با ایجاد معمول یک متغیر ندارد. فقط پیشوند self نشان می دهد که این متغیر به کلاس Cat تعلق دارد.

    صفت- متغیری که متعلق به یک کلاس است.

    بنابراین، ما یک کلاس گربه آماده ایجاد کرده ایم. کد او این است:

    # کلاس کلاس Cat Cat: # اقداماتی که هنگام ایجاد یک شی Cat باید انجام دهید def __init__(self, wool_color, eyes_color, name): self.wool_color = wool_color self.eyes_color = eye_color self.name = name # Purr def purr( self): print("Purrr!") # Scrabble def hiss(self): print("Shh!") # Scrabble def scrabble(self): print("Scratch-scratch!") # All together def all_in_one(self) : self. purr() self.hiss() self.scrabble()

    اشیاء

    ما یک طرح گربه ایجاد کرده ایم. حالا بیایید طبق این طرح یک شی گربه واقعی ایجاد کنیم:

    My_cat = گربه ("سیاه"، "سبز"، "زوسیا")

    در خط بالا، متغیر my_cat را ایجاد می کنیم و سپس یک شی از کلاس Cat را به آن اختصاص می دهیم. همه اینها به نظر می رسد فراخوانی به برخی تابع Cat(...) . در واقع همینطور است. با این ورودی، متد __init__() کلاس Cat را فراخوانی می کنیم. تابع __init__() در کلاس ما 4 آرگومان می گیرد: شی خود کلاس self، که نیازی به مشخص شدن ندارد، و همچنین 3 آرگومان مختلف دیگر، که سپس به ویژگی های گربه ما تبدیل می شوند.

    بنابراین، با کمک خط بالا، یک شی گربه واقعی ایجاد کرده ایم. گربه ما دارای ویژگی های زیر است: موهای سیاه، چشمان سبز و نام مستعار Zosya. بیایید این ویژگی ها را در کنسول چاپ کنیم:

    چاپ(گربه_من.رنگ_پشمی) چاپ(گربه_من_رنگ_چشم) چاپ(گربه_من)

    یعنی با نوشتن نام شی و نقطه گذاشتن و تعیین نام صفت مورد نظر می توان به صفات یک شی اشاره کرد.

    ویژگی های گربه را می توان تغییر داد. به عنوان مثال، بیایید نام گربه خود را تغییر دهیم:

    My_cat.name = "نیوشا"

    حالا اگر دوباره نام گربه را روی کنسول چاپ کنید به جای زوسیا نیوشا را خواهید دید.

    اجازه دهید به شما یادآوری کنم که کلاس گربه ما به آن اجازه می دهد برخی اقدامات را انجام دهد. اگر زوسیا / نیوشا خود را نوازش کنیم، او شروع به خرخر کردن می کند:

    My_cat.purr()

    با اجرای این دستور، متن "Murrr!" روی کنسول نمایش داده می شود. همانطور که می بینید، دسترسی به روش های یک شی به همان اندازه دسترسی به ویژگی های آن آسان است.

    ماژول ها

    هر فایلی با پسوند py. یک ماژول است. حتی مقاله ای که در آن روی این مقاله کار می کنید. آنها برای چه چیزی مورد نیاز هستند؟ برای راحتی. بسیاری از مردم فایل هایی با توابع و کلاس های مفید ایجاد می کنند. سایر برنامه نویسان شامل این ماژول های شخص ثالث هستند و می توانند از تمام توابع و کلاس های تعریف شده در آنها استفاده کنند و در نتیجه کار خود را ساده کنند.

    برای مثال، برای کار با ماتریس ها نیازی به صرف زمان برای نوشتن توابع خود ندارید. کافی است ماژول numpy را درج کنید و از توابع و کلاس های آن استفاده کنید.

    تا کنون، دیگر برنامه نویسان پایتون بیش از 110000 ماژول مختلف نوشته اند. ماژول numpy که در بالا ذکر شد به شما این امکان را می دهد که سریع و راحت با ماتریس ها و آرایه های چند بعدی کار کنید. ماژول ریاضی روش های زیادی را برای کار با اعداد ارائه می دهد: سینوس، کسینوس، تبدیل درجه به رادیان، و غیره و غیره ...

    نصب ماژول

    پایتون به همراه مجموعه ای استاندارد از ماژول ها نصب شده است. این مجموعه شامل تعداد بسیار زیادی ماژول است که به شما امکان می دهد با ریاضیات، پرس و جوهای وب، خواندن و نوشتن فایل ها و سایر اقدامات ضروری کار کنید.

    اگر می خواهید از ماژولی استفاده کنید که در مجموعه استاندارد گنجانده نشده است، باید آن را نصب کنید. برای نصب ماژول، خط فرمان را باز کنید (Win + R، سپس در قسمت ظاهر شده "cmd" را وارد کنید) و دستور را در آن وارد کنید:

    نصب پیپ [module_name]

    فرآیند نصب ماژول آغاز خواهد شد. پس از تکمیل، می توانید با خیال راحت از ماژول نصب شده در برنامه خود استفاده کنید.

    اتصال و استفاده از ماژول

    یک ماژول شخص ثالث بسیار ساده متصل می شود. شما فقط باید یک خط کوتاه کد بنویسید:

    وارد کردن [module_name]

    به عنوان مثال، برای وارد کردن ماژولی که به شما امکان می دهد با توابع ریاضی کار کنید، باید موارد زیر را بنویسید:

    واردات ریاضی

    چگونه به یک تابع ماژول دسترسی پیدا کنیم؟ شما باید نام ماژول را بنویسید، سپس نقطه بگذارید و نام تابع / کلاس را بنویسید. به عنوان مثال، فاکتوریل 10 به صورت زیر یافت می شود:

    ریاضی فاکتوریل (10)

    یعنی به تابع فاکتوریل (a) که در داخل ماژول ریاضی تعریف شده است، رفتیم. این راحت است، زیرا ما نیازی به هدر دادن زمان نداریم و به صورت دستی تابعی ایجاد می کنیم که فاکتوریل یک عدد را محاسبه می کند. می توانید ماژول را وصل کنید و بلافاصله اقدام لازم را انجام دهید.