⭕️ در شبکه عصبی با استفاده از اندازه ی دسته (batchsize)، میتونیم کاری کنیم که الگوریتم وزن خودش رو به ازای میانگین مقدار خطای اندازه دسته آپدیت کند.
📖 وزن های شبکه عصبی با یک ضریب آپدیت میشوند که به آن ضریب نرخ یادگیری (Learning Rate) میگویند. هرچقدر مقدار LR کمتر باشد، الگوریتم در یادگیری صبورتر است. و بالعکس.
📑 در طراحی شبکه های عصبی، معمولا توی هر لایه یک نورون دیگر اضافه میکنند که مقدارش یک است و وزن جدیدی هم اضافه میکنند. معمولا میگویند با اینکار باعث میشود لایه مد نظر از لحاظ یادگیری تقویت بشود. به نورون اضافه شده بایاس میگویند.
📍 چند کتابخانه معروف برای کار در حوزه شبکه عصبی موجود است. یکی از آنها کتابخانه TensorFlow Keras میباشد. کتابخانه قوی دیگری به نام PyTorch نیز موجود است.
- نصب tensorflow از طریق anaconda prompt:
conda install tensorflow
- یا میتونیم داخل یک cell در Jupyter Notebook دستور زیر را وارد کنیم:
!conda install tensorflow
💭 همان پیش پردازش هایی که قبلا انجام میدادیم رو نیز باید در پروژه های مربوط به دیپ لرنینگ نیز انجام بدیم.
🔴 در اینجا باید ستون تارگت رو OHE کنیم. چون معماری شبکه عصبی این کار رو از ما میخواد.
🗂 ساخت شبکه عصبی:
📊 لایه Dense (غلیظ) یعنی از تمامی نورون های لایه قبل به تمامی نورون های لایه بعد وزن متصل است.
🔹 رسم plot برای مدل:
🔔 بعد از ساختن مدل باید اون رو compile کنیم.
▫️ الگوریتم آپدیت وزن ها رو در optimizer مشخص میکنیم. معمولا از Adam استفاده میکنند.
▪️ خطایی که الگوریتم محاسبه میکند با استفاده از فرمول loss انجام میگردد.
🔻 میتونیم metrics رو در هنگام compile کردن نزاریم، اما optimizer و loss رو حتما باید مشخص کنیم.
🔸 سپس مدل رو بر روی داده ها فیت میکنیم:
🔹 اگر دقت شبکه عصبی عمیق خیلی نبود، میتونیم لایه های بیشتری اضافه کنیم و تعداد نورون ها رو افزایش بدیم.
🟧 الگوریتم های شبکه عصبی به مرور همگرا میشن و دقت افزایش پیدا نمیکنه.
- وقتی مدل یاد گرفت میتونیم اونها رو predict کنیم.
📐 تابع فعال ساز softmax که بالاتر ازش استفاده کردیم، معمولا توی نورون لایه آخر استفاده میشه و با استفاده از یک فرمولی، جمع تمامی نورون ها در لایه آخر رو 1 میکنه.
🧮 دلیل اینکه از softmax در لایه های وسط استفاده نمیکنیم بخاطر اینه که حجم پردازشی بالایی نیاز داره.
🧷 چند مورد از توابع فعال ساز:
- Linear
- Sigmoid
- Tanh
- ReLu
- LeakyReLu
- Softmax
📚 در طراحی شبکه عصبی معمولا میگن اول با لایه های تقریبا مساوی با لایه ورودی شروع کنیم، بعد شبکه رو چاق کنیم و در نهایت شبکه رو لاغر کنیم.
📖 وزن های شبکه عصبی با یک ضریب آپدیت میشوند که به آن ضریب نرخ یادگیری (Learning Rate) میگویند. هرچقدر مقدار LR کمتر باشد، الگوریتم در یادگیری صبورتر است. و بالعکس.
📑 در طراحی شبکه های عصبی، معمولا توی هر لایه یک نورون دیگر اضافه میکنند که مقدارش یک است و وزن جدیدی هم اضافه میکنند. معمولا میگویند با اینکار باعث میشود لایه مد نظر از لحاظ یادگیری تقویت بشود. به نورون اضافه شده بایاس میگویند.
📍 چند کتابخانه معروف برای کار در حوزه شبکه عصبی موجود است. یکی از آنها کتابخانه TensorFlow Keras میباشد. کتابخانه قوی دیگری به نام PyTorch نیز موجود است.
- نصب tensorflow از طریق anaconda prompt:
conda install tensorflow
- یا میتونیم داخل یک cell در Jupyter Notebook دستور زیر را وارد کنیم:
!conda install tensorflow
import tensorflow as tf
💭 همان پیش پردازش هایی که قبلا انجام میدادیم رو نیز باید در پروژه های مربوط به دیپ لرنینگ نیز انجام بدیم.
🔴 در اینجا باید ستون تارگت رو OHE کنیم. چون معماری شبکه عصبی این کار رو از ما میخواد.
y = pd.get_dummies(y)
🗂 ساخت شبکه عصبی:
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(11, activation='relu', input_shape=(11,)),
tf.keras.layers.Dense(30, activation='relu'),
tf.keras.layers.Dense(2, activation='softmax'),
model.summary()
📊 لایه Dense (غلیظ) یعنی از تمامی نورون های لایه قبل به تمامی نورون های لایه بعد وزن متصل است.
🔹 رسم plot برای مدل:
from tensorflow.keras.utils import plot_model
plot_model(model, show_layer_activations=True, show_shapes=True)
🔔 بعد از ساختن مدل باید اون رو compile کنیم.
mode.compile(optimizer=tf.keras.optimizers.Adam(0.001), loss=tf.keras.losses.CategoricalCrossentropy(), metrics=[tf.keras.metrics.CategoricalAccuracy()])
▫️ الگوریتم آپدیت وزن ها رو در optimizer مشخص میکنیم. معمولا از Adam استفاده میکنند.
▪️ خطایی که الگوریتم محاسبه میکند با استفاده از فرمول loss انجام میگردد.
🔻 میتونیم metrics رو در هنگام compile کردن نزاریم، اما optimizer و loss رو حتما باید مشخص کنیم.
🔸 سپس مدل رو بر روی داده ها فیت میکنیم:
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test), batch_size=100)
🔹 اگر دقت شبکه عصبی عمیق خیلی نبود، میتونیم لایه های بیشتری اضافه کنیم و تعداد نورون ها رو افزایش بدیم.
🟧 الگوریتم های شبکه عصبی به مرور همگرا میشن و دقت افزایش پیدا نمیکنه.
- وقتی مدل یاد گرفت میتونیم اونها رو predict کنیم.
model.predict(X_test)[3]
📐 تابع فعال ساز softmax که بالاتر ازش استفاده کردیم، معمولا توی نورون لایه آخر استفاده میشه و با استفاده از یک فرمولی، جمع تمامی نورون ها در لایه آخر رو 1 میکنه.
🧮 دلیل اینکه از softmax در لایه های وسط استفاده نمیکنیم بخاطر اینه که حجم پردازشی بالایی نیاز داره.
🧷 چند مورد از توابع فعال ساز:
- Linear
- Sigmoid
- Tanh
- ReLu
- LeakyReLu
- Softmax
📚 در طراحی شبکه عصبی معمولا میگن اول با لایه های تقریبا مساوی با لایه ورودی شروع کنیم، بعد شبکه رو چاق کنیم و در نهایت شبکه رو لاغر کنیم.
✳️ یادگیری در شبکه های عصبی = پیدا کردن اعداد داخل وزن ها
🔸 اگر مشکل overfit در الگوریتم های دیپ لرنینگ اتفاق افتاده بود، میتونیم از لایه drop out استفاده کنیم. لایه drop out بین لایه ها در هنگام train یکسری از وزن ها و نورون ها رو به صورت رندوم غیرفعال میکنه. این کار از overfit جلوگیری میکنه.
🔹 معماری های مختلف شبکه های عصبی:
- CNN: Convolutional Neural Networks
▫️ اگر حجم داده ها زیاد باشه اون ها رو به صورت incremental میخونیم.
🔻 اگر داده ها کم بود از روش Data Augmentation (افزایش مصنوعی داده ها) استفاده میکنیم. از این روش فقط برای داده های train استفاده میکنیم. به هیچ وجه نباید روی داده های train این کار رو انجام بدیم.
🟠 با استفاده از ImageDataGenerator میتونیم بر روی داده های ورودی از جنس تصویر تغییراتی اعمال کنیم.
‼️ پکیج ImageDataGenerator قابلیت جالبی به نام FlowFromDirectory داره. در این قابلیت، یک دایرکتوری میسازیم و به ازای هر کلاس، یک فولدر ایجاد میکنه. داخل هر فولدر فقط تصاویری که مربوط به اون کلاس هستند قرار داده میشه.
✳️ ساخت مدل:
⭕️ کامپایل کردن مدل:
🔸 اگر مشکل overfit در الگوریتم های دیپ لرنینگ اتفاق افتاده بود، میتونیم از لایه drop out استفاده کنیم. لایه drop out بین لایه ها در هنگام train یکسری از وزن ها و نورون ها رو به صورت رندوم غیرفعال میکنه. این کار از overfit جلوگیری میکنه.
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(11, activation='relu', input_shape=(11,)),
tf.keras.layers.DropOut(0.3),
tf.keras.layers.Dense(30, activation='relu'),
tf.keras.layers.Dense(2, activation='softmax')
])
🔹 معماری های مختلف شبکه های عصبی:
- CNN: Convolutional Neural Networks
▫️ اگر حجم داده ها زیاد باشه اون ها رو به صورت incremental میخونیم.
🔻 اگر داده ها کم بود از روش Data Augmentation (افزایش مصنوعی داده ها) استفاده میکنیم. از این روش فقط برای داده های train استفاده میکنیم. به هیچ وجه نباید روی داده های train این کار رو انجام بدیم.
🟠 با استفاده از ImageDataGenerator میتونیم بر روی داده های ورودی از جنس تصویر تغییراتی اعمال کنیم.
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPool2D, Flatten, Dense
from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau
from tensorflow.keras.utils import plot_model
from sklearn.utils.class_weight import compute_class_weight
from tensorflow.keras.callbacks import ModelCheckpoint
image_generator = ImageDataGenerator(
rescale=1./255.,
shear_range=0.1,
zoom_range=0.3,
)
image_generator_test = ImageDataGenerator(
rescale=1./255.
)
‼️ پکیج ImageDataGenerator قابلیت جالبی به نام FlowFromDirectory داره. در این قابلیت، یک دایرکتوری میسازیم و به ازای هر کلاس، یک فولدر ایجاد میکنه. داخل هر فولدر فقط تصاویری که مربوط به اون کلاس هستند قرار داده میشه.
train_data = image_generator.flow_from_directory(
'data',
target_size=(500, 500),
color_mode='grayscale',
class_mode='binary',
batch_size=10
)
test_data = image_generator.flow_from_directory(
'test_data',
target_size=(500, 500),
color_mode='grayscale',
class_mode='binary',
batch_size=10
)
✳️ ساخت مدل:
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(500, 500, 1)))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
⭕️ کامپایل کردن مدل:
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']
❇️ در فیت کردن مدل، موردی داریم به اسم callbacks. این مجموعهی callbacks یک سری فانکشن هستن که بعد از هر ایپاک فراخوانی میشن.
🔸 یکی از اون callbacks ها، es یا early stopping میباشد. این تابع بعد از هر ایپاک چک میکند اگر در سه ایپاک پشت سر هم (مقدار دلخواه هست)، مقدار validation loss کاهش پیدا نکرد، دیگه ادامه نده. در واقع الگوریتم همگرا شده است.
🔹 مورد بعدی در callbacks ها، rlrop یا reduce learning rate on plateau میباشد. این تابع، وقتی الگوریتم جلو میرود به مرور نرخ یادگیری را با ضریب خاص کاهش داده.
🔻 مورد بعدی model checkpoint میباشد. این تابع بعد از هر ایپاک، اگر بهترین (کمترین) loss رو پیدا کرد، وزن ها رو ذخیره میکند.
🟢 شبکه های عصبی قابلیت جالبی به نام class weight دارند. معمولا کلاسی که از لحاظ تعداد در هنگام train کمتر هست، وزن بیشتری داشته باشد.
⭕️ تکنیک Transfer Learning (یادگیری انتقالی): در این روش، وزن های اولیه شبکه به جای اینکه تصادفی باشند، از همون وزن هایی که قبلا یاد گرفته استفاده میکنند.
از مشکلات این روش، اول از همه اینه که مجموعه داده ای پیدا کنیم که خیلی شبیه به پروژه ای که ما قصد انجام اون رو داریم باشه. سپس، معماری ای رو پیدا کنیم که روی مجموعه داده ما train شده باشه و وزن ها به صورت عمومی در دسترس باشه.
⁉️ در Transfer Learning معمولا نیازی به Data Augmentation نداریم.
🔍 اگر مسئله ما ساده بود و تعداد کمی داده داشتیم، در صورتی که به تعداد کافی ایپاک تعریف نکنیم ممکن است الگوریتم overift بشه. برای همین قسمتی از وزن ها رو freez میکنیم تا از این مشکل جلوگیری کنیم. سرعت یادگیری هم با این روش افزایش پیدا میکند.
🔸 یکی از اون callbacks ها، es یا early stopping میباشد. این تابع بعد از هر ایپاک چک میکند اگر در سه ایپاک پشت سر هم (مقدار دلخواه هست)، مقدار validation loss کاهش پیدا نکرد، دیگه ادامه نده. در واقع الگوریتم همگرا شده است.
es = EarlyStopping(monitor='val_loss', mode='min', patience=3)
🔹 مورد بعدی در callbacks ها، rlrop یا reduce learning rate on plateau میباشد. این تابع، وقتی الگوریتم جلو میرود به مرور نرخ یادگیری را با ضریب خاص کاهش داده.
rlrop = ReduceLROnPlateaue(monitor='val_loss', patience=2, factor=0.2, min_lr=0.001)
🔻 مورد بعدی model checkpoint میباشد. این تابع بعد از هر ایپاک، اگر بهترین (کمترین) loss رو پیدا کرد، وزن ها رو ذخیره میکند.
mch = ModelCheckpoint('chestxray.h5', monitor='val_loss', mode='min', save_best_only=True)🟢 شبکه های عصبی قابلیت جالبی به نام class weight دارند. معمولا کلاسی که از لحاظ تعداد در هنگام train کمتر هست، وزن بیشتری داشته باشد.
weights = compute_class_weight(class_weight='balanced', classes=np.unique(train_data.classes), y=train_data.classes)
class_weights = dict(zip(np.unique(train_data.classes), weights))
⭕️ تکنیک Transfer Learning (یادگیری انتقالی): در این روش، وزن های اولیه شبکه به جای اینکه تصادفی باشند، از همون وزن هایی که قبلا یاد گرفته استفاده میکنند.
از مشکلات این روش، اول از همه اینه که مجموعه داده ای پیدا کنیم که خیلی شبیه به پروژه ای که ما قصد انجام اون رو داریم باشه. سپس، معماری ای رو پیدا کنیم که روی مجموعه داده ما train شده باشه و وزن ها به صورت عمومی در دسترس باشه.
⁉️ در Transfer Learning معمولا نیازی به Data Augmentation نداریم.
🔍 اگر مسئله ما ساده بود و تعداد کمی داده داشتیم، در صورتی که به تعداد کافی ایپاک تعریف نکنیم ممکن است الگوریتم overift بشه. برای همین قسمتی از وزن ها رو freez میکنیم تا از این مشکل جلوگیری کنیم. سرعت یادگیری هم با این روش افزایش پیدا میکند.
❤1
❇️ اکثر اوقات بهتره که بجای اینکه دادهها رو به دو قسمت train و test تقسیم کنیم، به سه قسمت train و test و validation تقسیم کنیم.
⁉️ گاهی ممکنه معماریای که طراحی کردیم روی دادههای test دقت خوبی نده و مجبور بشیم معماری رو عوض کنیم که اینکار خیلی درست نیست. چون ما داریم معماری مدل رو برای دادههای test بیش از اندازه تیون میکنیم.
⭕️ اگر سه دسته داده داشته باشیم، طبق معمول که از روی دسته train یادگیری انجام میده. اگه بخوایم هایپر پارامترها یا همون معماری مدلمون جوری عوض کنیم که روی دادههای validation خوب کار کنه، اجازهش رو داریم.
🔸 بعد ازینکه معماری نهایی رو ساختیم و تموم شد، و روی دادههای validation بهترین دقت رو گرفتیم، یبار دیگه روی دادههای test که کنار گذاشتیم و تا حالا ندیدیمش به عنوان آخرین بار دو مرتبه predict میکنیم.
🔻 دستهی test حالت double check برای دادههای validation رو داره.
⁉️ گاهی ممکنه معماریای که طراحی کردیم روی دادههای test دقت خوبی نده و مجبور بشیم معماری رو عوض کنیم که اینکار خیلی درست نیست. چون ما داریم معماری مدل رو برای دادههای test بیش از اندازه تیون میکنیم.
⭕️ اگر سه دسته داده داشته باشیم، طبق معمول که از روی دسته train یادگیری انجام میده. اگه بخوایم هایپر پارامترها یا همون معماری مدلمون جوری عوض کنیم که روی دادههای validation خوب کار کنه، اجازهش رو داریم.
🔸 بعد ازینکه معماری نهایی رو ساختیم و تموم شد، و روی دادههای validation بهترین دقت رو گرفتیم، یبار دیگه روی دادههای test که کنار گذاشتیم و تا حالا ندیدیمش به عنوان آخرین بار دو مرتبه predict میکنیم.
🔻 دستهی test حالت double check برای دادههای validation رو داره.
👍1
🔹 لایه Batch Normalization نورونهایی که توی آخرین لایه (لایه قبلی) بودن رو نرمالایز میکنه (مثلا تقسیم بر ماکسیموم). اینکار باعث میشه نورونها توی لایههای مختلف خیلی واگرا نشن و الگوریتم بهتر و دقیقتر یاد بگیره.
▫️ اگر دقت روی دادههای train بالا باشه و روی دادههای test پایین باشه یعنی مدل overfit شده. 🔹 لایه Batch Normalization نورونهایی که توی آخرین لایه (لایه قبلی) بودن رو نرمالایز میکنه (مثلا تقسیم بر ماکسیموم). اینکار باعث میشه نورونها توی لایههای مختلف خیلی واگرا نشن و الگوریتم بهتر و دقیقتر یاد بگیره.
▫️ اگر دقت روی دادههای train بالا باشه و روی دادههای test پایین باشه یعنی مدل overfit شده.
▫️ اگر دقت روی دادههای train بالا باشه و روی دادههای test پایین باشه یعنی مدل overfit شده. 🔹 لایه Batch Normalization نورونهایی که توی آخرین لایه (لایه قبلی) بودن رو نرمالایز میکنه (مثلا تقسیم بر ماکسیموم). اینکار باعث میشه نورونها توی لایههای مختلف خیلی واگرا نشن و الگوریتم بهتر و دقیقتر یاد بگیره.
▫️ اگر دقت روی دادههای train بالا باشه و روی دادههای test پایین باشه یعنی مدل overfit شده.
⭕️ شبکه های عصبی چند کاناله (Multi Channel)
❎ این شبکه های عصبی برای وقتی هستن که ما چند ورودی داریم (مثلا یکسری ورودی عددی، و یکسری ورودی تصویری). حال برای هر کدوم ازین ورودی ها یک شبکه عصبی جدا طراحی میکنیم (به هر مدل طراحی شده یک کانال میگن). سپس خروجی کانال اول رو با خروجی کانال دوم concat میکنیم و در نهایت اون رو به یک شبکه Dense دیگه میدیم یا فقط یک نورون قرار میدیم که پیش بینی رو انجام بده.
🔹 در شبکه های عصبی چند کاناله به ازای هر ورودی میتونیم یک کانال جدا داشته باشیم که هر کدوم یادگیری رو مستقل انجام بدن.
❎ این شبکه های عصبی برای وقتی هستن که ما چند ورودی داریم (مثلا یکسری ورودی عددی، و یکسری ورودی تصویری). حال برای هر کدوم ازین ورودی ها یک شبکه عصبی جدا طراحی میکنیم (به هر مدل طراحی شده یک کانال میگن). سپس خروجی کانال اول رو با خروجی کانال دوم concat میکنیم و در نهایت اون رو به یک شبکه Dense دیگه میدیم یا فقط یک نورون قرار میدیم که پیش بینی رو انجام بده.
🔹 در شبکه های عصبی چند کاناله به ازای هر ورودی میتونیم یک کانال جدا داشته باشیم که هر کدوم یادگیری رو مستقل انجام بدن.
🔸 معماری Recurrent یا RNN (شبکه عصبی بازگشتی)
‼️ در شبکه های عصبی Dense ما یه مشکلی داریم، و اونم اینه که شبکه حافظه نداره. یعنی نمیتونیم داده ها رو به صورت ترتیبی بهشون بدیم. (ترتیب داده ها براش مهم نیست)
❇️ جاهایی که داده ها ترتیبی باشن (داده های سری زمانی یا داده های متنی و...) به مشکل برمیخوریم.
⭕️ شبکه عصبی بازگشتی، یک شبکه عصبی هست که هر نمونه عادی ای که بهش میدیم رو n بار به خودش برمیگردونه. درواقع این شبکه عصبی یک ورودی در زمان t داره، و یک خروجی به ما میده. همچنین یک خروجی هم به خودش برای زمان بعدی میده.
📍 الگوریتم های RNN یک مشکلی دارن و اونم اینه که وقتی Sequence طولانی بشه، به آخر که میرسه اولی ها رو از یاد میبره.
‼️ در شبکه های عصبی Dense ما یه مشکلی داریم، و اونم اینه که شبکه حافظه نداره. یعنی نمیتونیم داده ها رو به صورت ترتیبی بهشون بدیم. (ترتیب داده ها براش مهم نیست)
❇️ جاهایی که داده ها ترتیبی باشن (داده های سری زمانی یا داده های متنی و...) به مشکل برمیخوریم.
⭕️ شبکه عصبی بازگشتی، یک شبکه عصبی هست که هر نمونه عادی ای که بهش میدیم رو n بار به خودش برمیگردونه. درواقع این شبکه عصبی یک ورودی در زمان t داره، و یک خروجی به ما میده. همچنین یک خروجی هم به خودش برای زمان بعدی میده.
📍 الگوریتم های RNN یک مشکلی دارن و اونم اینه که وقتی Sequence طولانی بشه، به آخر که میرسه اولی ها رو از یاد میبره.
🔍 معماری RNN چهار نوع اصلی دارد:
- One 2 One
- One 2 Many
- Many 2 One
- Many 2 Many: Sync , Async
📚 وقتی Sequence ای از داده ها داریم، باید از یجایی به قبل رو به داده های train اختصاص بدیم، و از یک جایی به بعد رو به داده های test اختصاص بدیم. در اینجا نباید نمونه ها رو shuffle کنیم زیرا ترتیب برای ما اهمیت دارد.
📌 داده ها رو باید در سه بعد به RNN بدیم. بعد اول تعداد نمونه ها، بعد دوم توالی یا Sequence ای است که میخوایم پشت سر هم رخ بده، بعد سوم تعداد متغیرهایی است که در اون توالی میخوایم داشته باشیم.
📈 در RNN ما وقتی Xt رو از کاربر میگیریم، میتونیم برای مثال nتا بلوک Sequence رو بصورت تکرار شونده پشت سر هم داشته باشیم. (تصویر بلوک در پست بعدی ارسال میشه)
🧮 برای حل مشکل فراموشی که در Simple RNN ها داشتیم، مدل Long Short Term Memory یا LSTM به وجود اومد. این مدل برای توالی های بلند مدت خیلی بهتر عمل میکند و اون ها رو حفظ میکند.
💭 از مشکلات LSTM بخاطر محاسبات سنگین میشه به پایین اومدن سرعت یادگیری و پیش بینی، و قاطی کردن الگوریتم اشاره کرد. اگر الگوریتم قاطی کنه یا vanish میشه یا explode رخ میده.
⭕️ برای حل مشکلات LSTM مدل GRU یا Gated Recurrent Unit به وجود اومد. مثل همون LSTM هست منتهی یکم ساده تر. هم سرعت بهتری داره هم پیچیدگی کمتری داره.
- One 2 One
- One 2 Many
- Many 2 One
- Many 2 Many: Sync , Async
📚 وقتی Sequence ای از داده ها داریم، باید از یجایی به قبل رو به داده های train اختصاص بدیم، و از یک جایی به بعد رو به داده های test اختصاص بدیم. در اینجا نباید نمونه ها رو shuffle کنیم زیرا ترتیب برای ما اهمیت دارد.
📌 داده ها رو باید در سه بعد به RNN بدیم. بعد اول تعداد نمونه ها، بعد دوم توالی یا Sequence ای است که میخوایم پشت سر هم رخ بده، بعد سوم تعداد متغیرهایی است که در اون توالی میخوایم داشته باشیم.
📈 در RNN ما وقتی Xt رو از کاربر میگیریم، میتونیم برای مثال nتا بلوک Sequence رو بصورت تکرار شونده پشت سر هم داشته باشیم. (تصویر بلوک در پست بعدی ارسال میشه)
🧮 برای حل مشکل فراموشی که در Simple RNN ها داشتیم، مدل Long Short Term Memory یا LSTM به وجود اومد. این مدل برای توالی های بلند مدت خیلی بهتر عمل میکند و اون ها رو حفظ میکند.
💭 از مشکلات LSTM بخاطر محاسبات سنگین میشه به پایین اومدن سرعت یادگیری و پیش بینی، و قاطی کردن الگوریتم اشاره کرد. اگر الگوریتم قاطی کنه یا vanish میشه یا explode رخ میده.
⭕️ برای حل مشکلات LSTM مدل GRU یا Gated Recurrent Unit به وجود اومد. مثل همون LSTM هست منتهی یکم ساده تر. هم سرعت بهتری داره هم پیچیدگی کمتری داره.
⭕️ اگر مقدار return sequence رو برابر True قرار بدیم، خروجی تمام تایمها رو به ما میده نه فقط تایم آخر.
❇️ وقتی که بخوایم RNN رو به dense وصل کنیم، یا یک خروجی باید بهش بدیم یا nتا خروجی که در این صورت باید اونها رو به TimeDistributedDense بدیم.
❇️ وقتی که بخوایم RNN رو به dense وصل کنیم، یا یک خروجی باید بهش بدیم یا nتا خروجی که در این صورت باید اونها رو به TimeDistributedDense بدیم.
📌 یکی دیگر از معماری های RNN، نوع Encoder-Decoder است. (حالتی از Many 2 Many است)
🔸 معماری sequence to sequence دو بلوک دارد. بلوک Encoder و بلوک Decoder.
📚 عنصر embedding در یادگیری عمیق، با استفاده از یکسری تکنیک ورودی رو به یک فضای برداری معنایی (vector) تبدیل میکند. کلماتی که از لحاظ معنایی نزدیک بهم باشند در فضای اقلیدسی نزدیک هم میافتند. این روش سرعت پایینی دارد. همچنین حجم بسیار زیادی از داده ها رو نیاز دارد.
🔸 معماری sequence to sequence دو بلوک دارد. بلوک Encoder و بلوک Decoder.
📚 عنصر embedding در یادگیری عمیق، با استفاده از یکسری تکنیک ورودی رو به یک فضای برداری معنایی (vector) تبدیل میکند. کلماتی که از لحاظ معنایی نزدیک بهم باشند در فضای اقلیدسی نزدیک هم میافتند. این روش سرعت پایینی دارد. همچنین حجم بسیار زیادی از داده ها رو نیاز دارد.
🟡 ترانسفورمرها (Transformers) یک Encoder-Decoder است که از Attension Mechanism استفاده میکنه.
🔵 مدل BERT نوعی از همین ترانسفورمرهاست که یک متن رو دریافت میکنه و تبدیلش میکنه به یک فضای مثلا 1024 بعدی. (به صورت معنایی اینکار رو انجام میده)
💭 در وبسایت huggingface.co افراد مختلف شبکه هایی رو که طراحی میکنند، آپلود میکنند.
▫️ از CNN 1D برای متون استفاده میشه.
🔵 مدل BERT نوعی از همین ترانسفورمرهاست که یک متن رو دریافت میکنه و تبدیلش میکنه به یک فضای مثلا 1024 بعدی. (به صورت معنایی اینکار رو انجام میده)
💭 در وبسایت huggingface.co افراد مختلف شبکه هایی رو که طراحی میکنند، آپلود میکنند.
▫️ از CNN 1D برای متون استفاده میشه.
⭕️ در مسائلی که پیچیدگی زیادی داریم، استفاده از elu به عنوان activation function پیشنهاد میشه.
✳️ روش های مختلفی برای Segmentation هست. یکی از معروف ترین روش ها، روشی به نام Segment anything می باشد.
🔸 مدل Segment Anything توسط شرکت فیسبوک ساخته شده. این مدل یک تصویر رو دریافت میکنه و با استفاده از encoder موجود در ترانسفورمر، تصویر رو به حالت embed تبدیل میکنه و با استفاده از masking قسمت های مختلف تصویر رو جدا میکنه.
✳️ روش های مختلفی برای Segmentation هست. یکی از معروف ترین روش ها، روشی به نام Segment anything می باشد.
🔸 مدل Segment Anything توسط شرکت فیسبوک ساخته شده. این مدل یک تصویر رو دریافت میکنه و با استفاده از encoder موجود در ترانسفورمر، تصویر رو به حالت embed تبدیل میکنه و با استفاده از masking قسمت های مختلف تصویر رو جدا میکنه.
✳️ معماری Multi Modal که زیر مجموعه Transformers ها هستند، وقتی استفاده میشن که ما چند جنس داده داشته باشیم. الگوریتم های زیر مجموعه Multi Modal میتونن رابطه ی بین دو جنس داده رو متوجه بشن (مثلا متن و تصویر).
💡 الگوریتم CLIP ارتباط بین تصاویر و متن رو میفهمه و مثالی از Multi Modal هاست.
📚 لایه Convolution Transpose برعکس لایه Covolution عمل میکنه. یعنی یک حالت فیلتر شده رو دریافت میکنه و تصویرش رو تحویل میده.
💡 الگوریتم CLIP ارتباط بین تصاویر و متن رو میفهمه و مثالی از Multi Modal هاست.
📚 لایه Convolution Transpose برعکس لایه Covolution عمل میکنه. یعنی یک حالت فیلتر شده رو دریافت میکنه و تصویرش رو تحویل میده.
🔍 در Docker دو مفهوم اولیه داریم، محفظه ها (Container) و Image ها. این Image ها معادل یه CD یا فایل ISO هستن که میتونیم روی سیستم عامل های مختلف باز کنیم و نصب کنیم. Container یک Image هست که بالا اومده و اجرا شده.
📝 انواع Image های آماده روی سایت hub.docker.com پیدا میشن.
📍 بالا آوردن یک Container از روی یک Image:
docker run image name
🗄 برای مشاهده Container هایی که اجرا کردیم:
docker ps
💭 برای توقف یک Container (پایین آوردن):
docker stop port
❇️ برای اجرای مجدد یک Container:
docker start port
❎ برای دیدن لیست Container های متوقف شده:
docker ps -a
⁉️ برای حذف یکی از Container های متوقف شده:
docker rm port
🧮 برای ساختن Image راه های مختلفی وجود داره که یکی از اونها استفاده از Dockerfile هست
📝 انواع Image های آماده روی سایت hub.docker.com پیدا میشن.
📍 بالا آوردن یک Container از روی یک Image:
docker run image name
🗄 برای مشاهده Container هایی که اجرا کردیم:
docker ps
💭 برای توقف یک Container (پایین آوردن):
docker stop port
❇️ برای اجرای مجدد یک Container:
docker start port
❎ برای دیدن لیست Container های متوقف شده:
docker ps -a
⁉️ برای حذف یکی از Container های متوقف شده:
docker rm port
🧮 برای ساختن Image راه های مختلفی وجود داره که یکی از اونها استفاده از Dockerfile هست
❤1👎1
Code_The_Hidden_Language_of_Computer_Hardware_and_Software_2nd_Edition.epub
22.8 MB
کتاب جالبیه، وقت داشتید بخونید
❤1
🔹 اهداف جبر خطی
⭕️ در این درس کمی بیشتر به بررسی مسائلی که قصد داریم حل کنیم میپردازیم و توضیح میدیم که جبر خطی چیه و چطوری میتونه به ما توی حل مسائل کمک کنه.
🔸 مسئلهی "کشف قیمت" برای شروع میتونه مناسب باشه. فرض میکنیم من دو بار به خرید رفتم و سیب و موز خریدم. بار اول من دو تا سیب و سه تا موز خریدم که قیمتشون شده هشت یورو (سیب را با a و موز را با b نمایش میدهیم).
2a + 3b = 8
▫️بار دوم که به خرید میرم، ده تا سیب و یک موز میخرم که قیمتشون میشه 13 یورو.
10a + 1b = 13
💭 حال کاری که باید انجام بدم، اینه که معادلات رو حل کنم تا قیمت سیب و موز رو بدست بیارم.
🔸حالا انواع مختلف و بسیاری از این خریدها با اقلام متفاوت وجود داره و اگر من بخوام همهی اون ها رو بصورت دستی حل کنم، خیلی سخت و زمانبر هست. بنابراین در حالت کلی ما میخوایم که یک الگوریتم کامپیوتری این کار رو برامون بصورت خودکار انجام بده.
🔹 مثالی که بالا برای خرید میوه و قیمت اون ها زدم، نمونهای از یک مسئلهی جبر خطی بود.
2a + 3b = 8
10a + 1b = 13
🟢 در این مثال ما ضرایب خطی ثابت رو داریم، اعداد 2 و 10 و 3 و 1. این اعداد ورودیهای a و b را به خروجیهای 8 و 13 مرتبط میکنند.
🟥 من به یک بردار [a,b] فکر میکنم که اون، قیمت سیب و موز رو توصیف میکنه. سپس اون به هزینه تبدیل میشه که در قالب بردار [13, 8] داریم. همچنین یک ماتریس داریم که در سطر اول (خرید اول) اعداد 2 و 3 رو داریم و در سطر دوم (خرید دوم) اعداد 10 و 1 رو داریم.
🔍 نوع دیگهای از مسائل که ما علاقمند به حل اون هستیم، برازش (تطابق) یک معادله برای برخی دادهها هستیم. در حقیقت با شبکههای عصبی و یادگیری ماشین ما میخواهیم که کامپیوتر نه تنها با معادله مطابقت داشته باشد، بلکه بفهمد از چه معادلهای نیز استفاده میکند.
📍 فرض کنیم دادههایی شبیه به این نمودار (در تصویر نمایش داده شده) داریم. این شبیه به یک نمودار توزیع جمعیت با یک میانگین و تنوع است. نوع دیگه از مسائلی که ما میخواهیم حل کنیم، اینه که چطوری مقدار بهینه پارامترها را در معادله پیدا کنیم تا خط قوسی نمودار را توصیف کند. بهترین اونها که داده رو با نمودار تطبیق میده.
#جبر_خطی #قسمت_اول #کالج_لندن
⭕️ در این درس کمی بیشتر به بررسی مسائلی که قصد داریم حل کنیم میپردازیم و توضیح میدیم که جبر خطی چیه و چطوری میتونه به ما توی حل مسائل کمک کنه.
🔸 مسئلهی "کشف قیمت" برای شروع میتونه مناسب باشه. فرض میکنیم من دو بار به خرید رفتم و سیب و موز خریدم. بار اول من دو تا سیب و سه تا موز خریدم که قیمتشون شده هشت یورو (سیب را با a و موز را با b نمایش میدهیم).
2a + 3b = 8
▫️بار دوم که به خرید میرم، ده تا سیب و یک موز میخرم که قیمتشون میشه 13 یورو.
10a + 1b = 13
💭 حال کاری که باید انجام بدم، اینه که معادلات رو حل کنم تا قیمت سیب و موز رو بدست بیارم.
🔸حالا انواع مختلف و بسیاری از این خریدها با اقلام متفاوت وجود داره و اگر من بخوام همهی اون ها رو بصورت دستی حل کنم، خیلی سخت و زمانبر هست. بنابراین در حالت کلی ما میخوایم که یک الگوریتم کامپیوتری این کار رو برامون بصورت خودکار انجام بده.
🔹 مثالی که بالا برای خرید میوه و قیمت اون ها زدم، نمونهای از یک مسئلهی جبر خطی بود.
2a + 3b = 8
10a + 1b = 13
🟢 در این مثال ما ضرایب خطی ثابت رو داریم، اعداد 2 و 10 و 3 و 1. این اعداد ورودیهای a و b را به خروجیهای 8 و 13 مرتبط میکنند.
🟥 من به یک بردار [a,b] فکر میکنم که اون، قیمت سیب و موز رو توصیف میکنه. سپس اون به هزینه تبدیل میشه که در قالب بردار [13, 8] داریم. همچنین یک ماتریس داریم که در سطر اول (خرید اول) اعداد 2 و 3 رو داریم و در سطر دوم (خرید دوم) اعداد 10 و 1 رو داریم.
🔍 نوع دیگهای از مسائل که ما علاقمند به حل اون هستیم، برازش (تطابق) یک معادله برای برخی دادهها هستیم. در حقیقت با شبکههای عصبی و یادگیری ماشین ما میخواهیم که کامپیوتر نه تنها با معادله مطابقت داشته باشد، بلکه بفهمد از چه معادلهای نیز استفاده میکند.
📍 فرض کنیم دادههایی شبیه به این نمودار (در تصویر نمایش داده شده) داریم. این شبیه به یک نمودار توزیع جمعیت با یک میانگین و تنوع است. نوع دیگه از مسائلی که ما میخواهیم حل کنیم، اینه که چطوری مقدار بهینه پارامترها را در معادله پیدا کنیم تا خط قوسی نمودار را توصیف کند. بهترین اونها که داده رو با نمودار تطبیق میده.
#جبر_خطی #قسمت_اول #کالج_لندن