Python3
200 subscribers
100 photos
6 videos
26 files
518 links
🎓 آموزش و پروژه‌های Python
آموزش‌های کاربردی و پروژه‌های عملی Python برای همه سطوح. 🚀
Download Telegram
پارت ۳: پیاده‌سازی شبکه عصبی کانولوشنی (CNN) در پایتون با استفاده از Keras 🖥️🚀

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

۱. آماده‌سازی محیط کاری 🧑‍💻
قبل از شروع به کدنویسی، ابتدا باید کتابخانه‌های مورد نیاز را نصب کنیم. اگر Keras و TensorFlow را هنوز نصب نکردید، از دستورات زیر استفاده کنید:

pip install tensorflow

پس از نصب، می‌توانید از Keras برای ساخت مدل CNN استفاده کنید.

۲. ساختار مدل CNN در Keras 🔧
در اینجا ساختار یک مدل CNN ساده با استفاده از Keras را توضیح می‌دهیم:

۲.۱. وارد کردن کتابخانه‌ها
ابتدا باید کتابخانه‌های مورد نیاز را وارد کنیم:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

۲.۲. ساخت مدل
حالا یک مدل ساده CNN ایجاد می‌کنیم که شامل لایه‌های کانولوشن، پولوینگ و کاملاً متصل است:

# ساخت مدل Sequential
model = Sequential()

# لایه کانولوشن اول
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))

# لایه پولوینگ اول
model.add(MaxPooling2D(pool_size=(2, 2)))

# لایه کانولوشن دوم
model.add(Conv2D(64, (3, 3), activation='relu'))

# لایه پولوینگ دوم
model.add(MaxPooling2D(pool_size=(2, 2)))

# لایه فلتن (Flatten) برای تبدیل داده‌های دوبعدی به یک‌بعدی
model.add(Flatten())

# لایه کاملاً متصل اول
model.add(Dense(128, activation='relu'))

# لایه خروجی (برای دسته‌بندی)
model.add(Dense(10, activation='softmax')) # فرض بر اینکه 10 کلاس داریم

۲.۳. کامپایل مدل
پس از ساخت مدل، باید آن را کامپایل کنیم. در این مرحله، الگوریتم بهینه‌سازی و معیار ارزیابی انتخاب می‌شود:

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

۳. آموزش مدل CNN 📈
حالا که مدل ساخته و کامپایل شد، می‌توانیم آن را با داده‌های خود آموزش دهیم. فرض کنید که داده‌های شما در دو متغیر X_train (ویژگی‌ها) و y_train (برچسب‌ها) ذخیره شده است:

model.fit(X_train, y_train, epochs=10, batch_size=32)

این دستور مدل را برای ۱۰ دوره آموزش می‌دهد و در هر دوره، داده‌ها را به صورت بچ‌های ۳۲تایی وارد شبکه می‌کند.

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

test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"Test Accuracy: {test_acc}")

۵. استفاده از مدل برای پیش‌بینی 🧩
در نهایت، برای پیش‌بینی یک تصویر جدید از مدل استفاده می‌کنیم:

predictions = model.predict(new_image)

این دستور احتمال‌های پیش‌بینی شده برای کلاس‌های مختلف را برمی‌گرداند.

۶. نتیجه‌گیری
در این قسمت، با پیاده‌سازی یک مدل ساده CNN در پایتون آشنا شدیم. در قسمت‌های بعدی، می‌توانید به موارد پیشرفته‌تر مانند تنظیمات بهینه‌سازی و تکنیک‌های افزایش دقت مدل بپردازید.



برای دریافت آموزش‌های بیشتر در زمینه یادگیری عمیق و پیاده‌سازی مدل‌های پیشرفته‌تر CNN، به کانال تلگرام ما بپیوندید! 💬
🔗 [لینک کانال ]

#DeepLearning #CNN #Python #Keras
1
پارت ۴: بهینه‌سازی و تنظیم مدل CNN در پایتون ⚙️🔧

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

۱. انتخاب بهینه‌ساز (Optimizer) 🔍
بهینه‌ساز یا optimizer وظیفه تنظیم وزن‌های شبکه را بر عهده دارد تا کمترین خطا را به‌دست آورد. چندین بهینه‌ساز مختلف وجود دارد که هرکدام مزایا و معایب خود را دارند. دو بهینه‌ساز محبوب عبارتند از:

- Adam: یک بهینه‌ساز مبتنی بر گرادیان است که به‌طور خودکار نرخ یادگیری را تنظیم می‌کند و از آن برای مدل‌های CNN استفاده می‌شود. این بهینه‌ساز معمولاً عملکرد خوبی دارد.


  model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

- SGD (Stochastic Gradient Descent): این بهینه‌ساز ساده‌تر است و معمولاً برای داده‌های بزرگ و پردازش‌های پیچیده‌تر مورد استفاده قرار می‌گیرد.


  model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])

۲. تنظیم نرخ یادگیری (Learning Rate)
نرخ یادگیری یکی از مهم‌ترین پارامترهای آموزش مدل است. نرخ یادگیری نشان می‌دهد که هر بار که مدل وزن‌های خود را به‌روزرسانی می‌کند، چقدر باید تغییر کنند. نرخ یادگیری زیاد می‌تواند باعث نوسانات و ناتوانی مدل در پیدا کردن کمینه بهینه شود، در حالی که نرخ یادگیری کم می‌تواند باعث کند شدن فرآیند یادگیری شود.

برای تنظیم نرخ یادگیری می‌توانید از روش‌هایی مانند LearningRateScheduler در Keras استفاده کنید که به‌طور خودکار نرخ یادگیری را در طول آموزش تغییر می‌دهد.

from tensorflow.keras.callbacks import LearningRateScheduler

def scheduler(epoch, lr):
if epoch % 10 == 0 and epoch > 0:
lr = lr * 0.1
return lr

lr_scheduler = LearningRateScheduler(scheduler)

model.fit(X_train, y_train, epochs=50, batch_size=32, callbacks=[lr_scheduler])

۳. استفاده از تکنیک‌های جلوگیری از بیش‌برازش (Overfitting) 🚫
یکی از چالش‌های رایج در آموزش مدل‌های پیچیده مانند CNN، پدیده بیش‌برازش است که مدل شما ممکن است به‌طور غیرضروری به داده‌های آموزشی "چسبیده" و عملکرد ضعیفی در داده‌های تست داشته باشد. برای مقابله با این مشکل، از تکنیک‌هایی مانند Dropout و Data Augmentation استفاده می‌کنیم.

۳.۱. Dropout 🔒
در این تکنیک، درصدی از نورون‌ها در هر دوره آموزش غیرفعال می‌شوند تا از وابستگی بیش از حد به نورون‌ها جلوگیری شود و مدل عمومی‌تر شود.

from tensorflow.keras.layers import Dropout

model.add(Dropout(0.5)) # 50% نورون‌ها به طور تصادفی غیرفعال می‌شوند

۳.۲. Data Augmentation 📸
Data Augmentation به شما کمک می‌کند تا با ایجاد تغییرات تصادفی در تصاویر (مانند چرخاندن، تغییر مقیاس و تغییر روشنایی)، حجم داده‌های آموزشی را افزایش دهید و مدل را قادر سازید که ویژگی‌ها را در موقعیت‌ها و شرایط مختلف یاد بگیرد.

from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True
)

datagen.fit(X_train)
model.fit(datagen.flow(X_train, y_train, batch_size=32), epochs=50)

۴. ارزیابی مدل با Cross-Validation 📊
برای ارزیابی دقت مدل و جلوگیری از مشکلاتی مانند بیش‌برازش، می‌توانید از Cross-Validation استفاده کنید. این تکنیک مدل شما را بر روی چندین مجموعه مختلف از داده‌ها آزمایش می‌کند و دقت واقعی مدل را مشخص می‌کند.

from sklearn.model_selection import StratifiedKFold

kfold = StratifiedKFold(n_splits=5, shuffle=True)

for train_idx, val_idx in kfold.split(X, y):
X_train, X_val = X[train_idx], X[val_idx]
y_train, y_val = y[train_idx], y[val_idx]
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_val, y_val))

۵. استفاده از مدل‌های پیش‌آموزش دیده (Pretrained Models) 🏆
اگر داده‌های شما محدود است، می‌توانید از مدل‌های پیش‌آموزش دیده مانند VGG16 یا ResNet استفاده کنید و تنها لایه‌های نهایی آن‌ها را آموزش دهید تا دقت مدل خود را افزایش دهید.

from tensorflow.keras.applications import VGG16

ادامه 👇
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(64, 64, 3))
model.add(base_model)
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))

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



برای دریافت آموزش‌های بیشتر و یادگیری نحوه بهینه‌سازی و تنظیم مدل‌های پیشرفته CNN، به کانال تلگرام ما بپیوندید! 💬
🔗 [لینک کانال تلگرام]

#DeepLearning #CNN #Optimization #MachineLearning
پارت ۵: ارزیابی و تحلیل عملکرد مدل CNN 📊🔍

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

۱. ارزیابی مدل با استفاده از داده‌های آزمایشی 🧪
پس از اینکه مدل را آموزش دادید، ارزیابی مدل روی داده‌های آزمایشی (Test Data) بسیار مهم است. این مرحله به شما کمک می‌کند تا مطمئن شوید که مدل در شرایط واقعی (داده‌هایی که در زمان آموزش ندیده است) به خوبی عمل می‌کند. برای ارزیابی مدل، می‌توانید از متد evaluate در Keras استفاده کنید.

test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"Test Accuracy: {test_acc}")

در اینجا، test_loss میزان خطای مدل بر روی داده‌های آزمایشی و test_acc دقت مدل بر روی همان داده‌ها را نشان می‌دهد.

۲. استفاده از ماتریس سردرگمی (Confusion Matrix) 🔢
ماتریس سردرگمی ابزاری است که عملکرد مدل در شناسایی درست و نادرست کلاس‌ها را نشان می‌دهد. این ماتریس به‌ویژه در دسته‌بندی‌های چندکلاسه مفید است.

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

from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

y_pred = model.predict(X_test)
y_pred_classes = y_pred.argmax(axis=-1)

conf_matrix = confusion_matrix(y_test.argmax(axis=-1), y_pred_classes)
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=class_names, yticklabels=class_names)
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()

این کد ماتریس سردرگمی را برای پیش‌بینی‌های مدل ترسیم می‌کند که می‌تواند به شناسایی مشکلات خاص مانند شناسایی نادرست کلاس‌ها کمک کند.

۳. تحلیل منحنی ROC و AUC 📈
برای ارزیابی مدل در دسته‌بندی‌های دودویی (Binary Classification)، منحنی ROC (Receiver Operating Characteristic) و مساحت زیر منحنی (AUC) ابزارهای قدرتمندی هستند. این منحنی به شما نشان می‌دهد که مدل چقدر می‌تواند مثبت‌های واقعی را از منفی‌های واقعی تشخیص دهد.

from sklearn.metrics import roc_curve, auc

fpr, tpr, _ = roc_curve(y_test, y_pred[:, 1])
roc_auc = auc(fpr, tpr)

plt.figure()
plt.plot(fpr, tpr, color='blue', lw=2, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='gray', linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC)')
plt.legend(loc='lower right')
plt.show()

این کد منحنی ROC را رسم کرده و AUC را محاسبه می‌کند که نشان‌دهنده دقت مدل در شناسایی کلاس‌ها است.

۴. استفاده از Cross-Validation برای ارزیابی مدل 🔄
برای کاهش احتمال خطای تصادفی و به‌دست آوردن ارزیابی دقیق‌تر از عملکرد مدل، از Cross-Validation می‌توان استفاده کرد. این روش مدل را روی چندین بخش مختلف از داده‌ها آموزش می‌دهد و عملکرد آن را به طور متوسط محاسبه می‌کند.

from sklearn.model_selection import cross_val_score
from sklearn.utils import shuffle

X_shuffled, y_shuffled = shuffle(X_train, y_train, random_state=42)

scores = cross_val_score(model, X_shuffled, y_shuffled, cv=5)
print(f"Average Cross-Validation Score: {scores.mean()}")

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

۵. تنظیم آستانه تصمیم‌گیری (Thresholding) 🎯
گاهی اوقات برای مشکلات دسته‌بندی دودویی (مثل پیش‌بینی بیماری‌ها)، تنظیم آستانه تصمیم‌گیری برای خروجی مدل می‌تواند مفید باشد. به‌طور پیش‌فرض، مدل‌های CNN برای پیش‌بینی کلاس‌ها از آستانه 0.5 استفاده می‌کنند (یعنی اگر احتمال پیش‌بینی برای کلاس 1 بیشتر از 0.5 باشد، پیش‌بینی می‌کند که نمونه از کلاس 1 است). اما می‌توانید این آستانه را تغییر دهید.

threshold = 0.6
y_pred_classes = (y_pred[:, 1] > threshold).astype(int)

با تغییر آستانه، می‌توانید دقت مدل را برای دسته‌بندی دقیق‌تر تنظیم کنید.

۶. بهبود مدل پس از ارزیابی 🔨
پس از ارزیابی مدل، ممکن است به این نتیجه برسید که نیاز به بهبود عملکرد دارید. در این صورت، می‌توانید یکی از روش‌های زیر را امتحان کنید:
- افزایش داده‌ها (Data Augmentation)
- تغییر معماری مدل (افزودن لایه‌های بیشتر)
- تغییر بهینه‌ساز و نرخ یادگیری
- استفاده از مدل‌های پیش‌آموزش دیده (Pretrained Models)
1
برای یادگیری بیشتر در مورد تحلیل و ارزیابی مدل‌های CNN و نحوه استفاده از آن‌ها در پروژه‌های واقعی، به کانال تلگرام ما بپیوندید! 💬
🔗 [لینک کانال تلگرام]

#MachineLearning #CNN #ModelEvaluation #DataScience
پارت ۶: پیاده‌سازی مدل CNN در پروژه‌های واقعی 🚀💼

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

۱. آماده‌سازی داده‌ها برای پروژه‌های واقعی 🧳
در پروژه‌های واقعی، اولین قدم آماده‌سازی داده‌ها است. داده‌ها معمولاً نیاز به پیش‌پردازش دارند تا برای استفاده در مدل‌های CNN مناسب شوند. این پیش‌پردازش ممکن است شامل مراحل زیر باشد:

- مقیاس‌دهی تصاویر: تصاویر معمولاً باید به یک اندازه ثابت تبدیل شوند (مثلاً 64x64 یا 128x128 پیکسل).


  from tensorflow.keras.preprocessing.image import load_img, img_to_array

img = load_img('path_to_image.jpg', target_size=(64, 64))
img_array = img_to_array(img)
img_array = img_array / 255.0 # نرمالیزه کردن تصویر

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


  from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

۲. استفاده از مدل CNN در مسائل واقعی 👁️‍🗨️
مدل CNN می‌تواند در مسائل مختلف شناسایی الگو و پردازش تصاویر استفاده شود. برخی از کاربردهای رایج آن عبارتند از:

۲.۱. تشخیص و طبقه‌بندی تصاویر 🖼️
مدل‌های CNN معمولاً برای تشخیص و طبقه‌بندی تصاویر در زمینه‌هایی مانند شناسایی اشیاء، تشخیص بیماری‌ها و حتی دسته‌بندی تصاویر دیجیتال استفاده می‌شوند.

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

predicted_class = model.predict(img_array)
predicted_label = class_names[predicted_class.argmax()]

۲.۲. تشخیص ناهنجاری‌ها (Anomaly Detection) ⚠️
در برخی از پروژه‌ها مانند شناسایی عیوب در تصاویر تولیدات صنعتی یا تشخیص مشکلات پزشکی، از CNN برای تشخیص ناهنجاری‌ها استفاده می‌شود. این مدل‌ها می‌توانند تشخیص دهند که آیا یک تصویر از الگوی طبیعی منحرف شده است یا خیر.

۳. بهینه‌سازی مدل برای اجرا در دنیای واقعی ⚙️
برای استفاده از مدل‌های CNN در پروژه‌های عملی، ممکن است نیاز باشد تا مدل را به‌طور خاص بهینه کنید تا سرعت پردازش بهتری داشته باشد و زمان پاسخ‌دهی کاهش یابد. برخی از روش‌های بهینه‌سازی عبارتند از:

۳.۱. فشرده‌سازی مدل (Model Compression) 🗜️
برای کاهش اندازه مدل و تسریع در استفاده از آن، می‌توانید از تکنیک‌های فشرده‌سازی مدل استفاده کنید. این روش‌ها شامل کاهش تعداد پارامترها و استفاده از تکنیک‌هایی مانند quantization و pruning است.

import tensorflow_model_optimization as tfmot

pruned_model = tfmot.sparsity.keras.prune_low_magnitude(model)

۳.۲. استفاده از TensorFlow Lite 📱
برای پیاده‌سازی مدل‌ها در دستگاه‌های موبایل و کاربردهای اینترنت اشیاء (IoT)، می‌توانید مدل CNN خود را به TensorFlow Lite تبدیل کنید. این نسخه بهینه‌شده از TensorFlow برای دستگاه‌های کم‌قدرت مناسب است.

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

# ذخیره مدل به فرمت TFLite
with open('model.tflite', 'wb') as f:
f.write(tflite_model)

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

۴.. ساخت یک API برای مدل 🖥️
برای دسترسی به مدل و استفاده از آن دراپلیکیشن ها
وب یا موبایل، می‌توانید یک API بسازید. یکی از رایج‌ترین روش‌ها استفاده از Flask یا FastAPI است تا مدل را در یک سرور پیاده‌سازی کنید.

from flask import Flask, request, jsonify
import numpy as np

app = Flask(name)

👇
1
@app.route('/predict', methods=['POST'])
def predict():
img = request.files['image']
# پردازش تصویر و پیش‌بینی با مدل
img_array = preprocess_image(img)
prediction = model.predict(img_array)
predicted_class = prediction.argmax()
return jsonify({'prediction': predicted_class})

if name == 'main':
app.run(debug=True)

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



برای یادگیری بیشتر و دریافت آموزش‌های پیشرفته‌تر در زمینه پیاده‌سازی مدل‌های یادگیری عمیق و CNN، به کانال تلگرام ما بپیوندید! 💬
🔗 [لینک کانال تلگرام]

#AI #CNN #DeepLearning #TensorFlow
پارت ۷: نکات مهم، مشکلات رایج و روش‌های جلوگیری از آن‌ها در پیاده‌سازی مدل CNN ⚠️🔧

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

۱. مشکل: بیش‌برازش (Overfitting) 🧐
بیش‌برازش زمانی رخ می‌دهد که مدل بیش از حد به داده‌های آموزشی "چسبیده" و قادر به تعمیم‌دادن اطلاعات به داده‌های جدید نیست. این مشکل باعث می‌شود که مدل بر روی داده‌های آزمایشی عملکرد ضعیفی داشته باشد.

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


  model.add(Dropout(0.5))  # غیرفعال کردن 50% نورون‌ها

- استفاده از Data Augmentation: با استفاده از افزایش داده‌ها (Data Augmentation) می‌توانید داده‌های آموزشی بیشتری تولید کنید و از این طریق مدل را وادار به یادگیری ویژگی‌ها در شرایط مختلف کنید.


  datagen = ImageDataGenerator(
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
zoom_range=0.2,
horizontal_flip=True
)
datagen.fit(X_train)

- تنظیم وزن‌ها (Weight Regularization): اضافه کردن لایه‌های تنظیم وزن مثل L2 regularization می‌تواند به جلوگیری از بیش‌برازش کمک کند.


  from tensorflow.keras.regularizers import l2

model.add(Dense(128, activation='relu', kernel_regularizer=l2(0.01)))

۲. مشکل: کم‌برازش (Underfitting) 🤔
کم‌برازش زمانی اتفاق می‌افتد که مدل به‌درستی نتواند ویژگی‌های داده‌ها را یاد بگیرد و دقت آن پایین باشد. این مشکل معمولاً زمانی رخ می‌دهد که مدل بسیار ساده است یا آموزش کافی ندیده است.

راه‌حل‌ها:
- افزایش پیچیدگی مدل: اگر مدل شما ساده است، می‌توانید لایه‌های بیشتری به آن اضافه کنید تا قدرت مدل افزایش یابد.


  model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))

- افزایش تعداد دوره‌های آموزش (Epochs): اطمینان حاصل کنید که مدل شما به اندازه کافی آموزش دیده است. ممکن است نیاز باشد تعداد دوره‌های آموزش را افزایش دهید تا مدل بهتر یاد بگیرد.


  model.fit(X_train, y_train, epochs=100, batch_size=32)

- استفاده از مدل‌های پیش‌آموزش دیده: استفاده از مدل‌های پیش‌آموزش دیده (مثل VGG16 یا ResNet) و اضافه کردن لایه‌های سفارشی می‌تواند کمک‌کننده باشد.

۳. مشکل: تنظیمات نادرست نرخ یادگیری (Learning Rate)
نرخ یادگیری نادرست می‌تواند باعث شود که مدل به سرعت به کمینه بهینه نرسد یا در نقاط محلی گیر کند. نرخ یادگیری خیلی بالا می‌تواند باعث شود که مدل از حداقل‌ها عبور کند و نرخ یادگیری خیلی پایین می‌تواند باعث شود که آموزش خیلی کند پیش برود.

راه‌حل‌ها:
- استفاده از الگوریتم‌های بهینه‌ساز پیشرفته مانند Adam که به‌طور خودکار نرخ یادگیری را تنظیم می‌کند و عملکرد بهتری دارد.


  model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

- استفاده از Learning Rate Scheduler: تنظیم دینامیک نرخ یادگیری با استفاده از LearningRateScheduler می‌تواند مفید باشد.


  from tensorflow.keras.callbacks import LearningRateScheduler

def scheduler(epoch, lr):
if epoch % 10 == 0 and epoch > 0:
lr = lr * 0.1
return lr

lr_scheduler = LearningRateScheduler(scheduler)

۴. مشکل: داده‌های نامتعادل (Class Imbalance) ⚖️
اگر داده‌های شما برای دسته‌بندی بسیار نامتعادل باشند (مثلاً تعداد تصاویری که در یک دسته خاص وجود دارد، بسیار بیشتر از دیگر دسته‌ها است)، مدل ممکن است تمایل به پیش‌بینی دسته پرجمعیت‌تر داشته باشد و دقت کمتری روی دسته‌های نادر نشان دهد.

راه‌حل‌ها:
- استفاده از وزن‌دهی به دسته‌ها: هنگام آموزش مدل می‌توانید به دسته‌های نادر وزن بیشتری بدهید تا مدل تشویق به یادگیری ویژگی‌های آن‌ها شود.


  class_weights = {0: 1., 1: 50.}  # مثال: وزن‌دهی به دسته نادر
model.fit(X_train, y_train, class_weight=class_weights)

- استفاده از Data Augmentation برای تولید داده‌های بیشتر از دسته‌های نادر و متعادل کردن داده‌ها.
1
۵. مشکل: استفاده از داده‌های نادرست یا کیفیت پایین 🔍
اگر داده‌هایی که برای آموزش استفاده می‌کنید نادرست یا کیفیت پایین باشند، مدل شما عملکرد ضعیفی خواهد داشت.

راه‌حل‌ها:
- پیش‌پردازش داده‌ها: قبل از استفاده از داده‌ها، آن‌ها را تمیز و نرمال کنید. این ممکن است شامل تغییر اندازه تصاویر، حذف داده‌های ناقص یا اشتباه و یا نرمال‌سازی داده‌ها باشد.


  X_train = X_train / 255.0  # نرمال‌سازی داده‌ها

- مطمئن شوید که داده‌ها متنوع و متوازن هستند تا مدل شما قادر به یادگیری ویژگی‌های مختلف و تعمیم‌دادن به داده‌های جدید باشد.

۶. مشکل: زمان آموزش طولانی (Long Training Time)
آموزش مدل‌های CNN ممکن است زمان‌بر باشد، به‌ویژه اگر داده‌های زیادی داشته باشید و مدل پیچیده‌ای بسازید.

راه‌حل‌ها:
- استفاده از GPU: آموزش مدل‌های CNN معمولاً روی GPU سریع‌تر از CPU انجام می‌شود. بنابراین، از کارت‌های گرافیکی برای آموزش سریع‌تر استفاده کنید.


  with tf.device('/GPU:0'):
model.fit(X_train, y_train, epochs=10)

- استفاده از Batch Normalization: این تکنیک می‌تواند به تسریع فرآیند آموزش کمک کند.


  from tensorflow.keras.layers import BatchNormalization
model.add(BatchNormalization())



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



برای دریافت نکات بیشتر و آموزش‌های پیشرفته در این زمینه، به کانال تلگرام ما بپیوندید! 💬
🔗 [لینک کانال تلگرام]

#DeepLearning #CNN #MachineLearning #AI
1
2💯1
مدیریت خودکار حافظه در پایتون 🧠💡

در پایتون، مدیریت حافظه به‌صورت خودکار انجام می‌شود. یعنی برخلاف زبان‌های سطح پایین مثل C و C++، نیازی به تخصیص یا آزادسازی دستی حافظه نیست و این کار به لطف سیستم مدیریت حافظه خودکار انجام می‌شود. این سیستم شامل شمارش ارجاعات و جمع‌آوری زباله‌ها می‌باشد. بیایید به‌صورت کامل این دو مکانیزم را بررسی کنیم:



🔹 بخش اول: شمارش ارجاعات (Reference Counting)
پایتون از شمارش ارجاعات برای مدیریت حافظه استفاده می‌کند. هر شی در پایتون دارای یک شمارشگر است که تعداد ارجاعات به آن شی را نشان می‌دهد. وقتی مقدار شمارش ارجاعات به صفر برسد، یعنی دیگر هیچ بخشی از برنامه به آن شی نیاز ندارد و پایتون می‌تواند حافظه آن را آزاد کند.

چطور شمارش ارجاعات کار می‌کند؟
- هر زمان که یک متغیر به شی‌ای اشاره می‌کند، شمارش ارجاعات آن شی افزایش می‌یابد.
- وقتی ارجاعی حذف می‌شود، شمارش ارجاعات کاهش می‌یابد.
- زمانی که شمارش به صفر برسد، پایتون حافظه را آزاد می‌کند.

مثال:
a = [1, 2, 3]
b = a # شمارش ارجاعات به شی لیست افزایش می‌یابد
del a # شمارش ارجاعات کاهش می‌یابد

مزیت‌ها:
- *سریع و کارآمد*: شمارش ارجاعات بسیار سریع است و به‌صورت همزمان با اجرای برنامه انجام می‌شود.

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



🔹 بخش دوم: جمع‌آوری زباله‌ها (Garbage Collection)
پایتون از یک سیستم جمع‌آوری زباله‌های دورانی برای پاکسازی حافظه اشیاء بدون ارجاع استفاده می‌کند که شمارش ارجاعات به تنهایی قادر به آزادسازی آن‌ها نیست.

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

مثال: اجرای دستی جمع‌آوری زباله‌ها
import gc

gc.collect() # اجرای دستی جمع‌آوری زباله

مزیت‌ها:
- *حذف حلقه‌های مرجع*: این مکانیزم باعث می‌شود که حافظه اشیائی که در حلقه‌های مرجع هستند آزاد شود.



🔹 بهینه‌سازی حافظه: بهترین تمرین‌ها
برای بهینه‌سازی استفاده از حافظه، این نکات را در نظر بگیرید:

1. پاکسازی متغیرهای غیرضروری: متغیرهایی که دیگر نیازی به آن‌ها ندارید را با del حذف کنید تا شمارش ارجاعات کاهش یابد.
2. کپی‌های غیرضروری را حذف کنید: از کپی‌های سطحی و عمیق تنها در مواقع نیاز استفاده کنید.
3. ماژول gc: می‌توانید در برنامه‌های طولانی‌مدت و پیچیده، با gc.collect() حافظه را بهینه کنید.
4. Weak References: در مواقعی که نیازی به جلوگیری از جمع‌آوری زباله ندارید، از weak referenceها استفاده کنید.



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


برای آموزش‌های بیشتر و مباحث حرفه‌ای‌تر برنامه‌نویسی، به کانال ما بپیوندید 📢
🔗 [لینک کانال تلگرام]

#PythonMemory #MemoryManagement #GarbageCollection #Python
1
آموزش درخت AST در پایتون 🌳

در این آموزش، یاد می‌گیریم درخت نحوی انتزاعی (Abstract Syntax Tree) چیست، چه کاربردهایی دارد، و چطور می‌توانیم با پایتون از آن استفاده کنیم.



درخت AST چیست؟
درخت AST یک نمایش انتزاعی از کد است که ساختار دستوری آن را توصیف می‌کند.
هر گره (Node) در درخت AST یک بخش از کد شما را نشان می‌دهد، مانند:
- متغیرها
- عملیات‌ها
- توابع

🔧 چرا به AST نیاز داریم؟
- ساده‌سازی تحلیل کد: حذف جزئیات اضافی مثل پرانتزها.
- ابزار تحلیل کد: برای ابزارهایی مانند Linters یا Code Optimizers بسیار مفید است.
- پایه‌ای برای ساخت مفسر: AST نقش حیاتی در پردازش و اجرای کد ایفا می‌کند.


چگونه AST در پایتون کار می‌کند؟
پایتون یک ماژول داخلی به نام ast دارد که برای کار با درخت‌های AST طراحی شده است.

۱. تبدیل کد به درخت AST
می‌توانیم کد پایتون را به درخت AST تبدیل کنیم:

import ast

code = """
x = 5 + 3
if x > 5:
print(x)
"""

# تبدیل کد به درخت AST
tree = ast.parse(code)

# نمایش درخت AST
print(ast.dump(tree, indent=4))

🔍 خروجی:
Module(
body=[
Assign(
targets=[Name(id='x', ctx=Store())],
value=BinOp(left=Constant(value=5), op=Add(), right=Constant(value=3))
),
If(
test=Compare(
left=Name(id='x', ctx=Load()),
ops=[Gt()],
comparators=[Constant(value=5)]
),
body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Name(id='x', ctx=Load())], keywords=[]))],
orelse=[]
)
]
)



۲. پیمایش درخت AST
با استفاده از ast.walk یا ast.NodeVisitor می‌توانید درخت AST را پیمایش کنید:

مثال ۱: پیدا کردن متغیرها در کد
for node in ast.walk(tree):
if isinstance(node, ast.Name):
print(f"Variable found: {node.id}")

🔍 خروجی:
Variable found: x
Variable found: x
Variable found: print

مثال ۲: نمایش تمام عملیات‌ها
for node in ast.walk(tree):
if isinstance(node, ast.BinOp):
print(f"Operation: {type(node.op).__name__}")

🔍 خروجی:
Operation: Add



۳. تغییر درخت AST
درخت AST قابل تغییر است. می‌توانید گره‌ها را تغییر دهید یا جایگزین کنید.

مثال: جایگزینی همه اعداد با عدد ۱۰
class Transformer(ast.NodeTransformer):
def visit_Constant(self, node):
if isinstance(node.value, int):
return ast.Constant(value=10)
return node

transformer = Transformer()
new_tree = transformer.visit(tree)

# نمایش درخت جدید
print(ast.dump(new_tree, indent=4))

🔍 توضیح:
کدی که از درخت جدید ساخته شود، همه اعداد را با عدد ۱۰ جایگزین می‌کند.



۴. تبدیل درخت AST به کد اجرایی
بعد از تغییر درخت AST، می‌توان آن را به کد اجرایی تبدیل کرد:

import astor  # برای تبدیل AST به کد خوانا

# تبدیل درخت به کد
new_code = astor.to_source(new_tree)
print(new_code)

🔍 خروجی:
x = 10 + 10
if x > 10:
print(x)



کاربردهای AST در دنیای واقعی
1. تحلیل کد:
ابزارهای بررسی کد مانند Flake8 و pylint از AST استفاده می‌کنند.
2. بهینه‌سازی کد:
AST می‌تواند برای اصلاح و بهبود کدها مورد استفاده قرار گیرد.
3. ساخت مفسر:
AST یکی از مهم‌ترین مراحل ساخت مفسر است.
4. ابزارهای تبدیل کد:
مثلاً تبدیل کد قدیمی به نسخه‌های جدیدتر.



تمرین:
1. کدی بنویسید که تمام توابع تعریف‌شده در یک فایل پایتون را شناسایی کند.
2. درخت AST یک کد ساده را دستکاری کنید تا همه متغیرها به نام دیگری تغییر یابند.


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

🔗 برای ادامه آموزش‌ها، به کانال تلگرام ما بپیوندید!
[لینک کانال]
#PythonAST #CodeAnalysis #PythonTools
👍1
آموزش پیشرفته درخت AST در پایتون 🌳

در این آموزش، به عمق بیشتری از درخت AST (Abstract Syntax Tree) وارد می‌شویم. هدف این است که با جزئیات بیشتری نحوه ایجاد، تغییر، و استفاده از درخت‌های AST را یاد بگیریم و ابزارهای پیشرفته برای کار با آن‌ها را بررسی کنیم.


۱. بررسی ساختار درخت AST پیشرفته

درخت AST و گره‌های آن
هر گره (Node) در درخت AST، نوع خاصی از اجزای کد را نشان می‌دهد. گره‌ها در پایتون با کلاس‌های مختلف ast نمایش داده می‌شوند. مثال‌هایی از گره‌های رایج:
- ast.Module: نشان‌دهنده کل کد.
- ast.FunctionDef: نشان‌دهنده تعریف یک تابع.
- ast.BinOp: نشان‌دهنده عملیات‌های دودویی مثل جمع و ضرب.

🔧 نمایش جزئیات یک گره:
می‌توانید گره‌ها را با جزئیات بیشتری بررسی کنید:
import ast

code = """
def greet(name):
print(f"Hello, {name}!")
"""
tree = ast.parse(code)

# بررسی جزئیات گره
function_node = tree.body[0] # اولین گره در بدنه (تابع greet)
print(f"Node type: {type(function_node)}")
print(f"Function name: {function_node.name}")
print(f"Arguments: {[arg.arg for arg in function_node.args.args]}")

🔍 خروجی:
Node type: <class 'ast.FunctionDef'>
Function name: greet
Arguments: ['name']


۲. جستجو و تغییر گره‌ها در درخت

NodeVisitor و NodeTransformer
پایتون دو کلاس برای پیمایش و تغییر درخت AST ارائه می‌دهد:
- NodeVisitor: برای مشاهده گره‌ها.
- NodeTransformer: برای تغییر گره‌ها.

مثال: جستجوی گره‌های خاص با NodeVisitor
کدی بنویسید که تمام توابع را پیدا کند:
class FunctionFinder(ast.NodeVisitor):
def visit_FunctionDef(self, node):
print(f"Function found: {node.name}")
self.generic_visit(node)

tree = ast.parse(code)
finder = FunctionFinder()
finder.visit(tree)

🔍 خروجی:
Function found: greet



مثال: تغییر گره‌ها با NodeTransformer
در اینجا تمام چاپ‌ها را با دستور log جایگزین می‌کنیم:
class ReplacePrint(ast.NodeTransformer):
def visit_Call(self, node):
if isinstance(node.func, ast.Name) and node.func.id == "print":
node.func.id = "log"
return self.generic_visit(node)

transformer = ReplacePrint()
new_tree = transformer.visit(tree)

import astor # تبدیل درخت به کد
print(astor.to_source(new_tree))

🔍 خروجی:
def greet(name):
log(f"Hello, {name}!")



۳. ساخت AST به‌صورت دستی

گاهی ممکن است بخواهید یک کد را بدون نوشتن متن آن به‌صورت مستقیم ایجاد کنید. می‌توانید با استفاده از گره‌های ast، یک درخت AST بسازید:

مثال: ساخت یک تابع ساده
تابعی به نام add ایجاد کنید که دو عدد را جمع کند:
func = ast.FunctionDef(
name="add",
args=ast.arguments(
args=[ast.arg(arg="a"), ast.arg(arg="b")],
defaults=[],
vararg=None,
kwarg=None,
kw_defaults=[],
posonlyargs=[],
),
body=[
ast.Return(
value=ast.BinOp(
left=ast.Name(id="a", ctx=ast.Load()),
op=ast.Add(),
right=ast.Name(id="b", ctx=ast.Load())
)
)
],
decorator_list=[]
)

module = ast.Module(body=[func], type_ignores=[])

# تبدیل به کد و نمایش
print(astor.to_source(module))

🔍 خروجی:
def add(a, b):
return a + b



۴. ابزارهای پیشرفته برای کار با AST

استفاده از astor برای مدیریت کد و AST
astor یک کتابخانه قدرتمند است که می‌تواند:
- AST را به کد تبدیل کند.
- کد را به AST تبدیل کند.

نصب astor:
pip install astor

مثال با astor:
import astor

code = """
x = 5 + 3
y = x * 2
"""
tree = ast.parse(code)

# تبدیل AST به کد خوانا
print(astor.to_source(tree))



استفاده از inspect برای تحلیل کد در زمان اجرا
ماژول inspect می‌تواند کد نوشته‌شده را در زمان اجرا تجزیه کند و همراه با AST استفاده شود.

مثال: بررسی بدنه یک تابع
import inspect

def sample_function(x):
return x + 10

source = inspect.getsource(sample_function)
tree = ast.parse(source)

print(ast.dump(tree, indent=4))



۵. کاربردهای پیشرفته درخت AST
👍1
۱. ساخت ابزارهای بررسی کد (Linters)
می‌توانید بررسی کنید که آیا کدی استانداردهای خاصی را رعایت می‌کند یا خیر.

۲. ایجاد ابزارهای بهینه‌سازی کد
کدی که کاربر نوشته است را تغییر دهید تا سریع‌تر اجرا شود.

۳. ساخت ابزارهای تحلیل امنیتی
بررسی کنید که آیا کد شامل الگوهای ناامن است یا نه.

۴. تبدیل کدهای قدیمی به نسخه‌های جدید
مثلاً تغییر کدهایی که برای پایتون ۲ نوشته شده‌اند به نسخه ۳.



تمرین پیشرفته:
۱. ابزاری بنویسید که تمام استفاده‌های متغیر x را در یک فایل پایتون پیدا کند.
۲. برنامه‌ای بسازید که همه حلقه‌های for را به حلقه‌های while تبدیل کند.
۳. ابزاری بنویسید که کدهای طولانی را با دستورهای کوتاه‌تر جایگزین کند.



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

این سطح از آشنایی با AST، مقدمه‌ای عالی برای مراحل بعدی مثل ساخت مفسر است.

🔗 برای آموزش‌های بیشتر، کانال تلگرام ما را دنبال کنید!
[لینک کانال]
#PythonAST #AdvancedPython #CodeOptimization #PythonTools
👍1
آموزش استفاده از ماژول EasyList در پایتون 📚

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



مقدمه 🤔
لیست‌ها یکی از مهم‌ترین انواع داده‌ها در پایتون هستند که برای ذخیره مجموعه‌ای از مقادیر به کار می‌روند. ماژول EasyList این امکان را فراهم می‌آورد که عملیات‌های متنوعی مانند افزودن، حذف، اعمال توابع، مرتب‌سازی، و فیلتر کردن لیست‌ها را با سهولت بیشتر انجام دهیم.



نصب و راه‌اندازی ⚙️

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

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

from easylist import EasyList  # وارد کردن ماژول



عملکردهای اصلی ماژول

در اینجا برخی از عملکردهای اصلی EasyList آورده شده است که به راحتی می‌توانید آن‌ها را در برنامه خود استفاده کنید:

1. افزودن عنصر به لیست
با استفاده از عملگر + می‌توانید به راحتی یک عنصر جدید به انتهای لیست اضافه کنید:

   my_list = EasyList([1, 2, 3, 4])
my_list + 5 # لیست به [1, 2, 3, 4, 5] تبدیل می‌شود

2. حذف عنصر از لیست
عملگر - برای حذف یک عنصر از لیست استفاده می‌شود:

   my_list - 3  # لیست به [1, 2, 4] تبدیل می‌شود

3. اعمال تابع به تمام عناصر لیست
با استفاده از عملگر * می‌توانید یک تابع را به تمامی عناصر لیست اعمال کنید:

   my_list * (lambda x: x * 2)  # لیست به [2, 4, 8] تبدیل می‌شود

4. مرتب‌سازی لیست 🔢
برای مرتب‌سازی لیست می‌توانید از عملگر ~ استفاده کنید:

   my_list ~  # لیست به [1, 2, 3, 4] مرتب می‌شود

5. معکوس کردن لیست 🔄
برای معکوس کردن لیست، از عملگر - استفاده کنید:

   my_list -  # لیست به [4, 3, 2, 1] معکوس می‌شود

6. یافتن بزرگترین عنصر از لیست 🏆
برای پیدا کردن بیشترین مقدار در لیست، از عملگر & استفاده کنید:

   max_value = my_list & None  # 4

7. یافتن کوچکترین عنصر از لیست 🌱
برای پیدا کردن کوچکترین مقدار در لیست، از عملگر | استفاده کنید:

   min_value = my_list | None  # 1

8. ترکیب دو لیست 🔗
برای ترکیب دو لیست، از عملگر & استفاده کنید:

   my_list2 = EasyList([5, 6, 7])
combined_list = my_list & my_list2 # لیست ترکیب شده [1, 2, 3, 4, 5, 6, 7]

9. فیلتر کردن لیست با تابع دلخواه 🔍
از عملگر ^ برای فیلتر کردن لیست با استفاده از یک تابع خاص می‌توانید استفاده کنید:

   my_list ^ (lambda x: x > 2)  # لیست به [3, 4] فیلتر می‌شود

10. حذف تکراری‌ها 🧹
برای حذف تکراری‌ها از لیست، از عملگر @ استفاده کنید:

   my_list @ None  # لیست به [1, 2, 3, 4] تبدیل می‌شود


تست ماژول (مثال کامل) 🧑‍💻
برای مشاهده نحوه عملکرد تمامی این ویژگی‌ها، از کد زیر استفاده کنید:

from easylist import EasyList

def test():
my_list = EasyList([1, 2, 3, 4, 5, 5])
print("Test 1 - Add:", my_list + 6)
print("Test 2 - Remove:", my_list - 3)
print("Test 3 - Multiply (apply function):", my_list * (lambda x: x * 2))
print("Test 4 - Sort:", my_list ~)
print("Test 5 - Reverse:", my_list -)
print("Test 6 - Max:", my_list & None)
print("Test 7 - Min:", my_list | None)

my_list2 = EasyList([6, 7, 8])
print("Test 8 - Combine two lists:", my_list & my_list2)
print("Test 9 - Filter (> 4):", my_list ^ (lambda x: x > 4))
print("Test 10 - Remove duplicates:", my_list @ None)

test()


نتیجه‌گیری

ماژول EasyList به شما این امکان را می‌دهد که به راحتی با لیست‌ها در پایتون کار کنید و عملیات مختلف را به سادگی انجام دهید. این ماژول علاوه بر سادگی، امکانات جدیدی را برای کار با داده‌ها فراهم می‌کند.


#پایتون #آموزش_پایتون #کدنویسی
👍2
خود فایل ☝️
پارت 1: آموزش SQL با پایتون (پایه)

👨‍💻 SQL یا Structured Query Language زبان استانداردی برای کار با پایگاه‌های داده است که به ما اجازه می‌دهد داده‌ها را ایجاد، خواندن، بروزرسانی و حذف کنیم (CRUD operations). در این پارت، می‌خواهیم SQL را در پایتون به کمک کتابخانه sqlite3 یاد بگیریم. این کتابخانه برای کار با پایگاه داده‌های SQLite در پایتون بسیار مفید است و در اکثر سیستم‌ها به صورت پیش‌فرض نصب شده است.

1️⃣ شروع کار با sqlite3

برای شروع، باید ابتدا کتابخانه sqlite3 را وارد کنیم:

import sqlite3

بعد از وارد کردن کتابخانه، برای اتصال به یک پایگاه داده، از تابع connect() استفاده می‌کنیم:

# اتصال به پایگاه داده (اگر فایل پایگاه داده وجود نداشته باشد، ساخته می‌شود)
conn = sqlite3.connect('example.db')

# ایجاد یک cursor برای اجرای دستورات SQL
cursor = conn.cursor()

در کد بالا:
- example.db نام فایل پایگاه داده است.
- اگر فایل پایگاه داده با این نام وجود نداشته باشد، به صورت خودکار ایجاد خواهد شد.
- cursor یک شی است که می‌توان از آن برای اجرای دستورات SQL استفاده کرد.

2️⃣ ایجاد یک جدول جدید

برای ایجاد یک جدول در پایگاه داده، از دستور SQL CREATE TABLE استفاده می‌کنیم. فرض کنید می‌خواهیم یک جدول برای ذخیره اطلاعات کاربر مانند نام، سن و ایمیل ایجاد کنیم:

# ایجاد یک جدول جدید
cursor.execute('''CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER,
email TEXT)''')

# ذخیره تغییرات در پایگاه داده
conn.commit()

در این کد:
- IF NOT EXISTS به این معناست که اگر جدول قبلاً ایجاد شده باشد، دوباره ایجاد نمی‌شود.
- id یک ستون است که به عنوان کلید اصلی (Primary Key) برای هر رکورد استفاده می‌شود و به طور خودکار افزایش می‌یابد (AUTOINCREMENT).

3️⃣ وارد کردن داده‌ها در جدول

حالا که جدول خود را ایجاد کرده‌ایم، می‌توانیم داده‌ها را به آن وارد کنیم. از دستور SQL INSERT INTO استفاده می‌کنیم:

# وارد کردن داده‌ها در جدول
cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", ('Ali', 25, '[email protected]'))

# ذخیره تغییرات
conn.commit()

در این کد:
- ?ها به عنوان جایگزین برای مقادیر استفاده می‌شوند و از تزریق SQL جلوگیری می‌کنند.
- مقادیر به صورت یک‌تایپ در لیست وارد می‌شوند.

4️⃣ خواندن داده‌ها از جدول

برای خواندن داده‌ها از جدول، از دستور SQL SELECT استفاده می‌کنیم:

# خواندن داده‌ها از جدول
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()

# نمایش داده‌ها
for row in rows:
print(row)

در این کد:
- SELECT * FROM users تمام داده‌های جدول users را انتخاب می‌کند.
- fetchall() تمام نتایج را به صورت یک لیست از تاپل‌ها برمی‌گرداند.

5️⃣ بستن اتصال

پس از انجام تمام عملیات، بهتر است که اتصال به پایگاه داده را ببندیم:

# بستن اتصال به پایگاه داده
conn.close()

📚 خلاصه پارت 1:
- یاد گرفتیم که چطور به پایگاه داده متصل شویم.
- نحوه ایجاد یک جدول و وارد کردن داده‌ها را بررسی کردیم.
- چطور داده‌ها را از پایگاه داده بخوانیم.
- در نهایت اتصال به پایگاه داده را بستیم.

🔜 در پارت بعدی، به بررسی دستورات پیشرفته‌تر SQL و نحوه بروزرسانی و حذف داده‌ها خواهیم پرداخت.

#SQL #Python #SQLite #Database
👍2
پارت 2: آموزش SQL با پایتون (بروزرسانی و حذف داده‌ها)

👨‍💻 در پارت اول با نحوه ایجاد جدول، وارد کردن داده‌ها و خواندن داده‌ها از پایگاه داده آشنا شدیم. حالا در این پارت به بررسی دستورات بروزرسانی و حذف داده‌ها در پایگاه داده خواهیم پرداخت.

1️⃣ بروزرسانی داده‌ها (UPDATE)

اگر بخواهیم داده‌ای را که قبلاً وارد کرده‌ایم، تغییر دهیم، از دستور **UPDATE** استفاده می‌کنیم. مثلاً فرض کنید می‌خواهیم سن کاربری که نامش "Ali" است را تغییر دهیم.

# بروزرسانی داده‌ها
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (30, 'Ali'))

# ذخیره تغییرات
conn.commit()

در این کد:
- SET age = ? به این معناست که مقدار سن تغییر می‌کند.
- WHERE name = ? مشخص می‌کند که فقط رکوردهایی که نام آن‌ها "Ali" است تغییر خواهند کرد.
- مانند قبل، برای جلوگیری از تزریق SQL از ? استفاده کرده‌ایم و مقادیر را به صورت پارامتر می‌فرستیم.

2️⃣ حذف داده‌ها (DELETE)

برای حذف داده‌ها از پایگاه داده، از دستور **DELETE** استفاده می‌کنیم. فرض کنید می‌خواهیم رکورد کاربری که نامش "Ali" است را حذف کنیم.

# حذف داده‌ها
cursor.execute("DELETE FROM users WHERE name = ?", ('Ali',))

# ذخیره تغییرات
conn.commit()

در این کد:
- DELETE FROM users تمام داده‌ها را از جدول users حذف می‌کند.
- WHERE name = ? به این معناست که فقط رکوردهایی که نام آن‌ها "Ali" است حذف می‌شوند.

⚠️ توجه داشته باشید که دستور DELETE بدون استفاده از WHERE، تمام رکوردها را حذف می‌کند. پس باید حتماً دقت کنید که از WHERE به درستی استفاده کنید تا فقط رکوردهای مورد نظر حذف شوند.

3️⃣ حذف تمام داده‌ها از جدول (Truncate)

اگر بخواهیم تمام داده‌ها را از یک جدول حذف کنیم، می‌توانیم اDELETEDELETE** استفاده کنیم بدون اینکه شرطی بگذاریم یا اDROP**DROP** برای حذف جدول استفاده کنیم.

# حذف تمام داده‌ها از جدول
cursor.execute("DELETE FROM users")

# ذخیره تغییرات
conn.commit()

یا برای حذف ساختار جدول و داده‌ها:

# حذف جدول از پایگاه داده
cursor.execute("DROP TABLE IF EXISTS users")

# ذخیره تغییرات
conn.commit()

در اینجا:
- DELETE FROM users تمام داده‌ها را از جدول حذف می‌کند، اما ساختار جدول باقی می‌ماند.
- DROP TABLE IF EXISTS users جدول users را به طور کامل حذف می‌کند، حتی اگر داده‌ها داخل آن باشند.

4️⃣ جستجوی داده‌ها با شرط‌های مختلف

برای جستجوی داده‌ها به صورت خاص‌تر، می‌توانیم اSELECTSELECT** با شرط‌های مختلWHERE*WHERE**، **LIKE**، و **ORDER BY** استفاده کنیم. به عنوان مثال، فرض کنید می‌خواهیم کاربران را بر اساس سن مرتب کنیم:

# جستجو و مرتب‌سازی داده‌ها
cursor.execute("SELECT * FROM users ORDER BY age DESC")
rows = cursor.fetchall()

# نمایش داده‌ها
for row in rows:
print(row)

در این کد:
- ORDER BY age DESC داده‌ها را بر اساس سن به صورت نزولی مرتب می‌کند.
- برای مرتب‌سازی صعودی از ASC استفاده می‌شود که به طور پیش‌فرض است.

5️⃣ بستن اتصال

در نهایت، پس از انجام عملیات‌های مورد نظر، باید اتصال به پایگاه داده را ببندیم:

# بستن اتصال به پایگاه داده
conn.close()

📚 **خلاصه پارت 2**:
- در این پارت یاد گرفتیم که چگونه UPDATE با دستور **UPDATE** بروزرسانی کنیم.
- نحوه حذف DELETE با دستور **DELETE** بررسی کردیم.
- برای حذف تمام داده‌ها یا DELETEز دDROP*DELETE** و **DROP** استفاده کردیم.
- یاد گرفتیم که چگونه داده‌ها را جستجو کرده و مرتب کنیم.

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

#SQL #Python #SQLite #Database
👍3
پارت 1: مفاهیم اولیه گراف‌ها
🎓 گراف چیست؟
گراف یک ساختار ریاضی است که شامل:
- رأس‌ها (📍): نقاطی که اطلاعات را نمایش می‌دهند.
- یال‌ها (🔗): خطوطی که ارتباط بین رأس‌ها را نشان می‌دهند.

💡 انواع گراف‌ها:
1. جهت‌دار (➡️): یال‌ها دارای جهت هستند.
2. بدون جهت (🔄): یال‌ها بدون جهت‌اند.
3. وزن‌دار (🔢): هر یال یک وزن یا هزینه دارد.
4. غیر وزن‌دار (): یال‌ها بدون وزن هستند.



🔍 کاربردهای گراف‌ها:
- مسیریابی (🚗)
- شبکه‌های اجتماعی (👥)
- تحلیل شبکه‌ها (🌐)
- حل مسائل ریاضی (📐)


🎯 نمایش گراف‌ها:
1. ماتریس مجاورت (📊):
- هر سطر و ستون نشان‌دهنده یک رأس است.
- مقدار 1 یا وزن نشان‌دهنده وجود یال بین دو رأس است.

مثال (برای گراف وزن‌دار):

   0 3 0  
3 0 7
0 7 0

2. لیست مجاورت (📋):
- لیستی از رأس‌های متصل به هر رأس نگهداری می‌شود.

مثال:

   1 -> [(2, 3)]  
2 -> [(1, 3), (3, 7)]
3 -> [(2, 7)]


کد نمونه در پایتون:
# تعریف گراف وزن‌دار با لیست مجاورت
graph = {
'1': [('2', 3)],
'2': [('1', 3), ('3', 7)],
'3': [('2', 7)]
}
print("Graph:", graph)



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



#گراف #برنامه‌نویسی #آموزش_تلگرام #الگوریتم_گراف #یادگیری
👍1
پارت 2: الگوریتم‌های پیمایش گراف
یکی از مهم‌ترین بخش‌های کار با گراف‌ها، پیمایش (Traversal) است. با پیمایش گراف می‌توان به اطلاعات مختلف دست یافت، مانند:
- بررسی اتصال رأس‌ها (🔗).
- یافتن مسیر بین رأس‌ها (🚶‍♂️).
- تحلیل داده‌های گراف (📊).



🎯 انواع پیمایش گراف:
1. پیمایش عرضی (BFS - Breadth First Search):
- گراف را به صورت لایه‌لایه (📏) پیمایش می‌کند.
- از یک رأس شروع کرده و ابتدا رأس‌های مجاور را بررسی می‌کند.
- مناسب برای پیدا کردن کوتاه‌ترین مسیر.

💡 مراحل BFS:
1. رأس شروع را در یک صف (Queue) قرار دهید.
2. رأس جاری را بازدید کرده و رأس‌های مجاور را به صف اضافه کنید.
3. تا خالی شدن صف، مراحل را تکرار کنید.

کد BFS در پایتون:

   from collections import deque

def bfs(graph, start):
visited = set()
queue = deque([start])
while queue:
node = queue.popleft()
if node not in visited:
print(node, end=" ")
visited.add(node)
queue.extend(graph[node])

# تعریف گراف
graph = {
'1': ['2', '3'],
'2': ['4', '5'],
'3': ['6'],
'4': [],
'5': [],
'6': []
}
print("BFS:", end=" ")
bfs(graph, '1')



2. پیمایش عمقی (DFS - Depth First Search):
- گراف را به صورت عمقی (🔍) پیمایش می‌کند.
- ابتدا رأس شروع و سپس رأس‌های فرزندان هر رأس بررسی می‌شوند.
- مناسب برای بررسی تمام مسیرهای ممکن.

💡 مراحل DFS:
1. رأس شروع را به یک پشته (Stack) اضافه کنید.
2. رأس جاری را بازدید کرده و رأس‌های فرزند را به پشته اضافه کنید.
3. تا خالی شدن پشته، مراحل را تکرار کنید.

کد DFS در پایتون:

   def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
print(start, end=" ")
for neighbor in graph[start]:
if neighbor not in visited:
dfs(graph, neighbor, visited)

# تعریف گراف
graph = {
'1': ['2', '3'],
'2': ['4', '5'],
'3': ['6'],
'4': [],
'5': [],
'6': []
}
print("DFS:", end=" ")
dfs(graph, '1')



📚 جمع‌بندی:
- BFS برای پیدا کردن کوتاه‌ترین مسیر مناسب است.
- DFS برای جستجوی عمیق و بررسی همه مسیرها به‌کار می‌رود.
در پارت بعدی با الگوریتم‌های پیشرفته مثل دایکسترا و درخت پوشای کمینه آشنا خواهیم شد.


#پیمایش_گراف #BFS #DFS #الگوریتم_گراف #آموزش_تلگرام