کتابخانه یادگیری عمیق کرس با پایتون

در این مقاله ما می‌خواهیم استفاده از کتابخانه کرس در زبان برنامه‌نویسی پایتون (Python) را آموزش دهیم و نشان دهیم که چگونه می‌توان با استفاده از این کتابخانه یک شبکه عصبی (Neutal Network) را ساخت. شناخت بسته‌های علمی مثل Numpy و Pandas و همچنین آشنایی با کتابخانه‌های scikit-learn مطالبی هستند که جز پیش‌نیازهای یادگیری کتابخانه کرس به حساب می‌آیند.

در ادامه مطلب با ما همراه باشید تا مطالب گفته شده در بالا را با هم فراگیریم.

 

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

برای یادگیری شبکه عصبی مصنوعی (Artificial Neural Network) نیاز است که مراحل زیر را طی کنید:

  • مقداردهی اولیه: وزن‌ها باید مقداردهی شوند که این اتفاق به‌صورت تصادفی صورت خواهد گرفت و با مقدارهای نزدیک به صفر انجام خواهد شد.
  • مجموعه داده‌ها به قسمت ورودی نشان داده شود.
  • برای این‌که نورون‌ها فعال شوند و مقدارهایی که پیش‌بینی شده‌اند نمایان گردند، باید انتشار به جلو از سمت چپ به سمت راست اتفاق افتد.
  • اندازه‌گیری نرخ خطا: برای به‌دست‌آوردن نرخ خطا باید مقادیر واقعی با مقدارهای پیش‌بینی شده توسط کامپیوتر مقایسه گردند تا مقدار خطا محاسبه شود.
  • بازگشت به عقب از سمت راست به سمت چپ، اتفاق بیافتد تا وزن‌ها تنظیم شوند.
  • مراحل از اول تا به مرحله گفته شده مجدداً تکرار شوند.
  • در نهایت، وقتی‌که همه Train Set یا همه مجموعه آموزش از شبکه عصبی عبور کند، یک Epoch یا دوره اتفاق خواهد افتاد.

 

ویدئو پییشنهادی : آموزش یادگیری ماشین لرنینگ با پایتون
آموزش یادگیری ماشین لرنینگ با پایتون

ساخت شبکه عصبی مصنوعی

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

import keras

پس از آن با استفاده از تکه کد زیر ماژول‌های گفته شده را ایمپورت می‌کنیم:

from keras.models import Sequential

from keras.layers import Dense

حال نیاز است که شبکه عصبی مصنوعی یا ANN را مقداردهی اولیه کنیم. این کار با ساختن یک نمونه از تابع Sequential انجام می‌گیرد. با کمک این تابع پشته خطی از لایه‌ها مقداردهی اولیه می‌شوند. این کار سبب خواهد شد تا کاربر بتواند بعدها نیز با کمک گرفتن از ماژول Dense لایه‌هایی را به برنامه اضافه کند.

برای توضیحات بالا، باید در پایتون کد زیر نوشته شود:

classifier = Sequential()

لایه‌های ورودی و خروجی در شبکه عصبی مصنوعی

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

به طور مثال، ۶ متغیر مستقل و ۲ متغیر خروجی در لایه وجود داشته باشد، مجموع آن‌ها عدد ۸ می‌شود که با تقسیم‌بر ۲ برابر می‌شود با عدد ۳، پس در این مثال بهتر است که ۳ گره به لایه اضافه گردد. روش دیگری که با آن می‌شود این مورد را بررسی کرد Parameter Tuning یا همان تنظیم پارامتر نام دارد.

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

پارامتری که بعد از دو پارامتر نام‌برده‌شده استفاده می‌شود Activation Function به معنی تابع فعال‌سازی است. در این بخش به‌عنوان تابع فعال‌سازی از یک تابع یک‌سوساز به طور خلاصه استفاده می‌شود. در بیشتر مواقع برای لایه پنهان در ANN از این تابع بهره گرفته می‌شود‌. در نهایت، پارامتر آخر input_dim است که برای محاسبه کردن تعداد گره‌هایی که در لایه پنهان است، مورد استفاده قرار می‌گیرد. برای دانستن تعداد متغیرهای در کتابخانه کرس مستقل می‌توان به این پارامتر مراجعه کرد‌.

نحوه استفاده از پارامترهای گفته شده در بالا به‌صورت زیر در زبان پایتون است:

classsifier.add
Dense(3, kernel_initializer = ‘uniform’,
activation = ‘relu’, input_dim=5))

روش اضافه‌کردن، دومین لایه پنهان دقیقاً مطابق مطالب گفته شده در بالا و مانند اضافه‌کردن اولین لایه پنهان است:

به تکه کد زیر دقت کنید:

classsifier.add(

      Dense(3, kernel_initializer = ‘uniform’,

activation = ‘relu’))

 

توجه کنید که در این قسمت احتیاجی به تعیین کردن مقدار پارامتر input_dim نیست به دلیل اینکه این پارامتر در اولین لایه پنهان و تکه کد قبلی مشخص گردیده است. با توجه به این متغیر که در اولین لایه پنهان مقداردهی شده است، لایه این موقعیت را دارد که بداند چه تعدادی گره ورودی، اضافه خواهد شد. در دومین لایه پنهان، وظیفه ANN است که بداند باید منتظر چه تعدادی از گره‌های ورودی باشد، پس به‌هیچ‌عنوان احتیاجی به تکرار مجدد این کار نیست.

برای اضافه‌کردن لایه خروجی، باید اولین پارامتر عوض شود چون در گره خروجی، انتظار می‌رود که یک گره خارج شود. برای انجام این کار می‌توان از تابع Sigmoid Activation Function یا همان تابع فعال‌سازی سیگموئید، بهره گرفت. گاهی شرایطی پیش می‌آید که نیاز به دسته‌بندی است و برنامه بیش‌تر از دو کلاس دارد مانند دسته‌بندی میمون‌ها و …  در این مواقع نیاز است که دو مقدار تغییر کنند. پارامتر اول را باید به مقدار دسته‌بندی تغییر داد. مثلاً اگر سه دسته‌بندی داریم، پارامتر اول باید به عدد ۳ تغییر کند. همچنین تابع فعال‌سازی را به مقدار Softmax تغییر دهیم. اگر این سؤال برای شما پیش‌آمده است که سافت مکس چیست؟ باید بگوییم که سافت مکس تابع سیگموئیدی است که به یک متغیر مستقلی که بیش‌تر از دودسته دارد، اعمال می‌شود.

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

classifier.add(

Dense(1, kernel_initializer = ‘uniform’,

activation = ‘sig moid’))

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

کامپایل کردن به زبان انگلیسی Compiling یعنی اعمال کردن Stochastic Gradient (گرادیان کاهشی تصادفی) به همه شبکه عصبی مصنوعی.

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

دومین پارامتر در این بخش، تابع زیان یا به‌اصطلاح انگلیسی Loss Function است که این مقدار داخل الگوریتم گرادیان کاهشی تصادفی است. به دلیل اینکه طبقه‌ها دودویی‌اند، در این حالت از تابع binary_crossentropy استفاده می‌شود. اما در حالت دیگر  categorical_crossentopy مورداستفاده قرار گرفته می‌شود. برای ارزیابی مدل از آرگومان نهایی استفاده می‌شود. مثال زیر تکه کدی در ارتباط با Accuracy (صحت) است که برای ارزیابی مدل مورداستفاده قرار می‌گیرد.

classifier.compile(optimizer= ‘adam’,

loss = ‘binary_crossentropy’,

metrics = [‘accuracy’])

در این بخش از آموزش کتابخانه کرس به تکه کد زیر توجه کنید:

classifier.fit(X_train, y_train, batch_size = 10, epochs = 100)

 

پارامتر X_train آن متغیرهایی را نشان می‌دهد که مستقل هستند و برای آموزش شبکه عصبی مورداستفاده قرار می‌گیرند. ستونی که پیش‌بینی می‌شود را با مقدار y_train نشان می‌دهند. مقدار وارد شده در بخش Bath_size تعداد مشاهداتی است که طبق آن وزن‌ها به روز رسانی می‌شوند. همچنین تعداد دفعاتی که مجموعه داده‌های کامل به شبکه عصبی انتقال داده خواهند شد را با مقدار وارد شده جلوی پارامتر Epochs نشان داده می‌شود.

به کدی که در پایین نوشته شده است دقت کنید:

y_pred = classifier.predict(X_test)

برای اینکه مطمئن شوید که یک ادعا کلاهبرداران است یا نه می‌توانید از کد بالا استفاده کنید. آستانه‌ای که برای دسته‌بندی کردن یک ادعا به‌عنوان کلاهبرداری، حساب می‌شود ۵۰% است. این به این معنا است که هر ادعا گفته شده با احتمال ۰٫۵ یا بیشتر می‌توان یک ادعا کلاهبرداری محسوب شود.

y_pred = (y_pred > 0.5)

به این صورت شرکت بیمه می‌تواند به‌راحتی ادعاها را پیگیری کند و زمان زیادی را صرف ارزیابی ادعاهایی بکند که به‌عنوان ادعای کلاهبرداری هایلایت شده‌اند.

ویدئو پییشنهادی : آموزش برنامه‌نویسی با پایتون (پیشرفته)
آموزش یادگیری ماشین لرنینگ با پایتون

بررسی ماتریس درهم‌ریختگی

اصطلاح Confusion Matrix یا همان ماتریس درهم‌ریختگی در کتابخانه کرس را می‌توان به این صورت تعریف کرد که؛ از بین ۲۰۰۰ مشاهده، ۱۵۵۵ + ۱۷۰ مشاهده انجام شده به‌درستی پیش‌بینی شده‌اند. در صورتی که ۴۰ + ۲۳۰ مورد مشاهده شده به‌اشتباه پیش‌بینی شده‌اند. برای به دست آوردن صحت مطلب می‌توان تعداد پیش‌بینی‌های صحیح را به کل پیش‌بینی‌ها تقسیم کرد و مقدار به‌دست‌آمده صحت خواهد بود. حال با توجه به مثال گفته شده در بالا (۱۷۰ + ۱۵۵۵) تقسیم‌بر ۲۰۰۰ برابر با صحت ۸۷٪ می‌شود.

کد زیر نحوه تعریف ماتریس در‌هم‌ریختگی در پایتون است:

 

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)

به مثال زیر توجه کنید:

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

به نظر شما با توجه به توضیحاتی که در این مقاله داده شد چگونه می‌توان به چنین موضوعی پی برد؟

کد زیر را بنویسید:

new_pred = classifier.predict(sc.transform(np.array([[a,b,c,d]])))

در کدی که بالا نوشتیم، مقدارهای a, b, c, d نشانگر ویژگی‌هایی هستند که موجودند.

سپس باید کد زیر نوشته شود:

new_pred = (new_prediction > 0.5)

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

شما عزیزان به‌راحتی می‌توانید پس از یادگیری یک یا چند مدل متوجه شوید که صحت‌های متفاوتی به وجود می‌آید‌. در این صورت نمی‌توان اطمینان حاصل کرد که کدام‌یک از صحت‌های به وجود آمده صحیح هستند. بدین ترتیب همین موضوع سبب به‌وجودآمدن مسئله موازنه بایاس و واریانس که اصطلاح انگلیسی Bias Variance Trade-Off است می‌شود. البته در نظر داشته باشید که تلاش زیادی می‌شود تا مدلی به کاربران آموزش داده شود که صحیح باشد و پس از چند بار آموزش‌داده‌شده، واریانس زیادی برای صحت وجود نداشته باشد.

برای حل کردن چنین مسئله‌ای از اعتبارسنجی متقابل -k fold با مقدار k برابر با ۱۰ استفاده می‌شود. این عمل سبب خواهد شد که مجموعه آموزش بر روی Fold برابر با ۱۰ تنظیم شود. بعد مدل روی fold برابر با ۹ آموزش داده خواهد شد و روی foldهای باقی‌مانده تست انجام خواهد شد. به دلیل اینکه fold برابر با ۱۰ است، تلاش می‌شود تا این کار از طریق ۱۰ ترکیب به‌صورت بازگشتی انجام شود.

هر تکراری که انجام شود سبب به‌وجودآمدن سه صحتی شود. پس از انجام تمام این مراحل همه صحت‌ها با هم جمع و میانگین آن‌ها محاسبه می‌شود و در نهایت به‌عنوان صحت مدل از آن استفاده می‌شود. البته توجه داشته باشید که در همه این موارد واریانس نیز محاسبه خواهد شد تا اطمینان حاصل گردد. چیزی که کاربر را قادر می‌سازد تا اعتبارسنجی متقابل k-fold را در کد Keras قرار دهد، KerasClassifier است که یک پوشش از کتابخانه کرس است.

from keras.wrappers.scikit_learn import KerasClassifier

پس از نوشتن کد بالا، تابع اعتبارسنجی K-fold از scikit_learn ایمپورت می‌گردد.

 

from sklearn.model_selection import cross_val_score

به کدهایی که در پایین نوشته شده است توجه کنید:

 

def make_classifier():

classifier = Sequential()

classiifier.add(Dense(3, kernel_initializer = ‘uniform’, activation = ‘relu’, input_dim=5))

classiifier.add(Dense(3, kernel_initializer = ‘uniform’, activation = ‘relu’))

classifier.add(Dense(1, kernel_initializer = ‘uniform’, activation = ‘sigmoid’))

classifier.compile(optimizer= ‘adam’,loss = ‘binary_crossentropy’,metrics = [‘accuracy’])

return classifier

این تابع Classifier را می‌سازد، همچنین آن را برای استفاده شدن در گام بعدی بازگردانی می‌کند. در این مرحله باید پوشش‌دهی انجام شود. نهایتاً با استفاده از اعتبارسنجی متقابل K-fold یک دسته‌بندی جدید ساخته می‌شود و پارامتر build_fn به عنوان یک تابع ساخته خواهد شد.

 

classiifier = KerasClassifier(build_fn = make_classifier,

batch_size=10, nb_epoch=100)

برای لحاظ‌کردن تابع اعتبارسنجی متقابل K-fold از تابع cross_vol_score کتابخانه scikit-learn استفاده می‌شود. با استفاده از make_classifier یک برآوردگر دسته‌بندی ساخته خواهد شد و n_jobs=-1 سبب خواهد شد تا از همه پردازنده‌های موجود بتوان استفاده کرد. مقدار cv تعداد foldها است که مقدار ۱۰ یک انتخاب رایج و متداول است.

 

accuracies = cross_val_score(estimator = classifier,

X = X_train,

y = y_train,

cv = 10,

n_jobs = -1)

برای اینکه تطابق نسبی یا Relative Accuracies به دست آورده شود، میانگین صحت‌ها گرفته می‌شود.

mean = accuracies.mean()

توجه کنید که واریانس را می‌توان به صورت زیر محاسبه کرد. هدف ما داشتن واریانس کم‌بین صحت‌ها است. به کد زیر در زبان برنامه‌نویسی پایتون و در کتابخانه کرس توجه کنید:

 

variance = accuracies.var()

مبارزه با بیش برازش در کتابخانه کرس

در یادگیری ماشین، بیش برازش یا Overfitting زمانی اتفاق می‌افتد که مدل جزئیات و نویز موجود در مجموعه داده را می‌آموزد و در نتیجه این عمل روی مجموعه داده، یک تست ضعیف اعمال می‌شود. زمانی که تفاوت زیادی مابین صحت مجموعه تست و مجموعه آموزش وجود داشته باشد این اتفاق مشاهده خواهد شد. همچنین می‌توان گفت این اتفاق زمانی نمایش داده خواهد شد که واریانس بالایی موقع اعمال اعتبارسنجی متقابل K-fold موجود باشد. در شبکه‌های عصبی مصنوعی یا ANN با استفاده از روشی به نام Dropout Regularization با این مسئله مقابله می‌گردد. روش Dropout Regularization با غیرفعال‌سازی به‌صورت تصادفی، بعضی از نورون‌ها، در هر بار تکرار از آموزش برای جلوگیری از مستقل بودن بیشتر از مقدار آن‌ها نسبت به یکدیگر عمل می‌کند.

 

from keras.layers import Dropout

classifier = Sequential()

classiifier.add(Dense(3, kernel_initializer = ‘uniform’, activation = ‘relu’, input_dim=5))

# Notice the dropouts

classifier.add(Dropout(rate = 0.1))

classiifier.add(Dense(6, kernel_initializer = ‘uniform’, activation = ‘relu’))

classifier.add(Dropout(rate = 0.1))

classifier.add(Dense(1, kernel_initializer = ‘uniform’, activation = ‘sigmoid’))

classifier.compile(optimizer= ‘adam’,loss = ‘binary_crossentropy’,metrics = [‘accuracy’])

در مثال نوشته شده در بالا، می‌توان بعد از اولین لایه خروجی و همچنین پس از دومین لایه پنهان dropout را انجام داد. استفاده کردن از نرخ ۰٫۱ به این معنی است که فقط ۱٪ از نورون‌ها در هر بار تکرار غیرفعال خواهند شد. پیشنهاد ما به شما کاربران عزیز این است که با نرخ ۰٫۱ کار را انجام دهید. به این نکته توجه کنید که هرگز نباید بیشتر از ۰.۴ کار شود زیرا مدل دچار Underfitting یا همان کم برازش خواهد شد.

 

تنظیم پارامتر

زمانی که صحت مدنظر شما به دست آمد، دیگر می‌توان پارامترها را برای به‌دست‌آوردن صحت بالاتر تنظیم کرد. کاربر به سهولت می‌تواند با جست‌وجوی Grid پارامترهای مختلف را محاسبه کند تا به بهترین پارامتر دست یابد. اولین مرحله در این قسمت ایمپورت کردن ماژول GridSearchCV است که این کار باید از sklearn انجام شود.

به کد نوشته شده در پایین توجه کنید:

from sklearn.model_selection import GridSearchCV

پس از انجام مراحل گفته شده، نیاز است که تابع make_classifier ویرایش گردد. برای اینکه امکان افزایش بیشتر از یک بهینه‌ساز در متغیر params به وجود آید، باید یک متغیر جدید با نام optimizer ساخته شود.

توضیحات گفته شده در می‌توان به صورت زیر در پایتون نوشت:

def make_classifier(optimizer):

classifier = Sequential()

classiifier.add(Dense(6, kernel_initializer = ‘uniform’, activation = ‘relu’, input_dim=11))

classiifier.add(Dense(6, kernel_initializer = ‘uniform’, activation = ‘relu’))

classifier.add(Dense(1, kernel_initializer = ‘uniform’, activation = ‘sigmoid’))

classifier.compile(optimizer= optimizer,loss = ‘binary_crossentropy’,metrics = [‘accuracy’])

return classifier

در تکه کد زیر پارامترهای تابع KerasClassifier تنظیم می‌شوند:

classifier = KerasClassifier(build_fn = make_classifier)

مرحله بعدی که باید انجام شود ساختن یک دیکشنری است که در آن پارامترهایی است که تعداد دوره‌ها و تابع batch size تنظیم می‌شوند. از adam نیز در اینجا به عنوان یک بهینه‌ساز استفاده می‌شود. همچنین یک بهینه‌ساز جدید نیز با عنوان rmsproo اضافه می‌گردد. همیشه در سندهای Keras استفاده کردن از بهینه‌ساز rmsprop در زمان کار شبکه‌های عصبی بازگشتی توصیه می‌شود. در اصطلاح انگلیسی به شبکه‌های عصبی بازگشتی Recurrent Neural Network گفته می‌شود. البته می‌توان از آن بهینه‌ساز برای شبکه عصبی مصنوعی یا ANN هم استفاده کرد. با این عمل می‌توان تأثیر بهینه‌ساز را بر بهبود نتایج در کتابخانه کرس بررسی کرد.

params = {

'batch_size':[20,35],

'nb_epoch':[150,500],

'Optimizer':['adam','rmsprop']

}

 

در آخر برای تست پارامترها از Grid Search استفاده خواهد شد. کار تابع Grid Search این است که از برآوردگر پارامترها که تعریف شده‌اند، تعداد K-foldها و همچنین سنجه امتیازدهی را می‌خواهد.

کد زیر نحوه کدنویسی تابع Grid Search در زبان برنامه‌نویسی پایتون است:

 

grid_search = GridSearchCV(estimator=classifier,

param_grid=params,

scoring=’accuracy’,

cv=10)

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

grid_search = grid_search.fit(X_train,y_train)

با استفاده از best_params می‌توان بهترین انتخاب از پارامترها را از شیء Grid search گرفت. به همین دلیل از best_score- می‌توان برای گرفتن بهترین امتیاز کمک گرفت.

best_param = grid_search.best_params_

best_accuracy = grid_search.best_score_

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

 

نتیجه‌گیری

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

از دیگر شبکه‌های عصبی مصنوعی می‌توان به شبکه‌های عصبی پیچشی یا Convolutional Neural Network، به‌صورت اختصار CNN و همچنین شبکه‌های عصبی بازگشتی یا Recurrent Neural Networks، به‌اختصار RNN اشاره کرد.

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

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

امیدواریم با مطالعه این مقاله در رابطه با کتابخانه کرس اطلاعات مفیدی کسب نموده باشید.همچنین در مقاله ای دیگر آشنایی با بهترین کتابخانه‌های پایتون علم داده پرداخته ایم.