دسته بندی با mlp و تنسورفلو
در جلسه قبل از آموزش یادگیری عمیق، شبکه عصبی mlp را معرفی کردیم. در این جلسه میخواهیم یک پروژه دسته بندی با mlp و تنسورفلو 2 را انجام دهیم. کدنویسی این جلسه در پلتفرم آنلاین گوگل یعنی گوگل کولب (Google Colab) انجام میشود. در پروژه ای که انجام خواهیم داد، میخواهیم تصاویر را در پایگاه داده fashion mnist دسته بندی کنیم. با هوسم همراه باشید…
استفاده از شبکه عصبی mlp برای دسته بندی
شبکه عصبی mlp را میتوان برای حل مسائل دو کلاسه و چند کلاسه استفاده کرد. در binary classification ، در خروجی یک نورون با تابع فعالساز سیگموید داریم که مقداری بین صفر و یک دارد. که در واقع احتمال تعلق ورودی به هر کلاس را نشان میدهد. مثلا سیستم تشخیص ایمیلهای اسپم، یک مسئله دو کلاسه است. فرض کنید یک شبکه mlp ساختهایم که ایمیل های اسپم را تشخیص دهد. چنین شبکهای در لایه خروجی یک نورون با تابع فعالساز sigmoid دارد. بنابراین این شبکه یک خروجی دارد که نشان میدهد ایمیل مورد نظرمان اسپم هست یا خیر. گفتیم مقدار خروجی عددی بین صفر و یک است. اگر مثلا مقدار خروجی 0.9 باشد، ایمیل اسپم است. اگر هم خروجی نزدیک به صفر باشد، مثلا 0.2 ، ایمیل اسپم نیست. این که مقدار این آستانه چقدر باشد را ما خودمان تعیین خواهیم کرد. مثلا ما تعیین میکنیم که اگر خروجی بالای 0.6 باشد، آنگاه ایمیل حتما اسپم است.
شبکه mlp برای حل مسائل چند کلاسه هم استفاده میشود. فرض کنید سیستمی برای تفکیک میوهها داشته باشیم. هدف از این سیستم این است که پرتقال و هویج را از سایر میوهها جدا کند. در این صورت یک شبکه mlp میخواهیم که 3 خروجی داشته باشد.
هرمیوه، یا هویج است، یا پرتقال است و یا هیچکدام از اینها نیست. پس هیچکدام از این سه حالت با همدیگر اتفاق نمیافتد. از این رو نمیتوانیم سه نورون خروجی با تابع فعالساز sigmoid داشته باشیم. در چنین شبکههایی از تابع فعالساز softmax برای لایه آخر استفاده میشود. در بخش بعدی این تابع را معرفی خواهیم کرد.
تابع فعالساز softmax
تابع فعالساز softmax، تابعی است که در لایه آخر classifier قرار میگیرد. ورودی تابع softmax را بردار z با k المان درنظر بگیرید. در این صورت خروجی softmax برابر با k احتمال خواهد بود. این تابع در ریاضی به صورت زیر تعریف میشود:
همانطور که مشاهده میکنید، تابع softmax در واقع ورودیهای خود را به بازهی صفر و یک نرمالیزه میکند. دقت کنید که اگر خروجیهای تابع softmax را با هم جمع کنیم، در هر صورت نتیجه یک خواهد شد. یعنی خروجی softmax احتمال است. در بخش بعدی از پست «دسته بندی با mlp و تنسورفلو»، مسئلهای که میخواهیم حل کنیم، شرح خواهیم داد…
طرح مسئله
در این پست ما میخواهیم یک دسته بندی با mlp و تنسورفلو که چند کلاسه است را پیادهسازی کنیم. برای این منظور از پایگاه داده fashion-Mnist استفاده خواهیم کرد. برای پیادهسازی این پروژه نیز از فریمورک تنسورفلو 2 و کراس استفاده میکنیم. برای راحتی کار کدنویسی در Google Colab انجام خواهد شد. شما میتوانید از IDEهای دیگر مانند پایچارم برای پیادهسازی استفاده کنید.
نحوه import کردن تنسورفلو
قدم اول در کدنویسی، فراخوانی کتابخانههای مورد نیاز است. ابتدا نیاز است که ما تنسورفلو و کراس را در کولب فراخوانی کنیم. برای این کار کافی است بنویسیم:
import tensorflow as tf from tensorflow import keras
در خط اول تنسورفلو را فراخوانی کردیم و مشخص کردیم که در کد به جای عبارت tensorflow از مخفف tf استفاده خواهیم کرد. در خط دوم، از کتابخانه تنسورفلو، کراس را هم فراخوانی کردیم. بیایید ورژن این دو کتابخانه را نیز مشخص کنیم. این کار را با دستور version__. انجام میدهیم:
print("tensorflow is version: ", tf.__version__) print("Keras is version: ", keras.__version__)
با اجرای کد بالا خواهیم داشت:
tensorflow is version: 2.2.0 Keras is version: 2.3.0-tf
مشاهده میکنید که تنسورفلو نسخه 2.2.0 و کراس نسخه 2.3.0 است. کنار ورژن کراس عبارت tf نوشته شده است. کراس یک فریمورک خالص نیست! یعنی اینکه روی فریمورکهای دیگری نوشته شده است. چرا؟ چون آن فریمورکهای دیگر (از جمله تنسورفلو) پیچیده بودند. کراس کدنویسی را سادهتر میکند و پیچیدگی فریمورکهایی مثل تنسورفلو را نیز ندارد. بعد از تغییر اساسی تنسوفلو، کراس و تنسورفلو در هم ادغام شدند به نوعی! واژه tf به معنای این است که کراس روی فریمورک تنسورفلو نوشته شده است.
پایگاه داده fashion mnist
احتمالا همه شما نام دیتاست mnist را شنیده باشید. این دیتاست معروف شامل مجموعهای از اعداد دستنویس است که به عنوان بنچمارک در یادگیری ماشین استفاده میشود. همه تصاویر در mnist سیاه و سفید بوده و ابعادشان نیز 28×28 است. پایگاه داده fashion-mnist پایگاه داده جدیدی است که توسط شرکت Zalando ارائه شده است. این پایگاه داده شامل 70هزار تصویر در حوزه فشن است. همه این تصاویر سیاه و سفید بوده و ابعادشان نیز 28×28 است، دقیقا مانند Mnist. تصاویر نمونه این پایگاه داده در شکل زیر آورده شده است:
این پایگاه داده با هدف جایگزین شدن با mnist ارائه شده است. یک دلیل این است که الگوریتمهای یادگیری ماشین امروزی (شبکههای CNN) توانستهاند به دقت 99.7 درصد برسند. پایگاه داده fashion-mnist، ده کلاس دارد. این کلاسها به همراه برچسبهای متناظرشان در جدول زیر نشان داده شدهاند.
از 70 هزار تصویری که در پایگاه داده fashion-mnist وجود دارد، 60هزار تصویر برای آموزش مدل و 10هزار تصویر برای تست مدل در نظر گرفته شده است. این سه اصطلاح را در اغلب پایگاههای داده میشنویم: validation dataset، training dataset و test dataset. معمولا پایگاه داده را به سه بخش تقسیم میکنند. بخش اول آن را فقط برای آموزش شبکه استفاده میکنند (training dataset). بخش دوم را برای اعتبارسنجی شبکه استفاده میکنند (validation dataset). اعتبارسنجی یعنی اینکه در حین آموزش شبکه، یک درکی از عملکرد شبکه داشته باشیم. ممکن است یک پایگاه داده validation نداشته باشد. در این صورت خودمان بخشی از دادههای آموزش را جدا کرده و به عنوان validation استفاده میکنیم. مثلا 80 درصد از دادههای آموزشی برای آموزش شبکه و 20 درصد آن را برای اعتبارسنجی در نظر میگیریم. در نهایت بخش سوم پایگاه داده برای ارزیابی شبکه استفاده میشود (test dataset).
فراخوانی پایگاه داده fashion-mnist
برخی فریمورکها توابعی برای خواندن پایگاه دادههای معروف نوشتهاند تا کار را برای محقق آسانتر کنند. در کراس هم توابعی برای فراخوانی تعدادی از دیتاست های معروف وجود دارد. در این لینک لیستی از دیتاستهایی که میتوان به کمک کراس فراخوانی کرد، آورده شده است. اگر لینک را باز کنید، مشاهده میکنید که fashion-mnist نیز در این لیست وجود دارد. برای فراخوانی این دیتاست باید بنویسید:
fashion_mnist = keras.datasets.fashion_mnist (X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()
این دو خط کد، دادههای fashion mnist را دانلود کرده و فراخوانی میکند. به خط دوم دقت کنید. خروجی دستور fashion_mnist.load_data() دو tuple است. tuple اول مربوط به داده های آموزش و tuple دوم مربوط به داده های تست است. هر tuple هم دو المان در خود دارد. که یکی تصاویر و دومی برچسب آنها است. بنابراین بهتر است همین اول دادهها را از هم جدا کنیم. با اجرای کد بالا دادهها دانلود و در متغیرهای مخصوص به خودشان ریخته میشوند:
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step
به همین راحتی توانستیم دیتاست fashion-mnist را دانلود کرده و فراخوانی کنیم! حالا بیایید کمی این دادهها را زیر و رو کنیم و ببینیم چه ابعادی دارند و از چه نوعی هستند:
print('x_train_full shape: ', x_train_full.shape, 'x_train_full type: ', x_train_full.dtype) print('y_train_full shape: ', y_train_full.shape, 'y_train_full type: ', y_train_full.dtype) print('x_test shape: ', x_test.shape, 'x_test type: ', x_test.dtype) print('y_test shape:', y_test.shape, 'y_test type', y_test.dtype)
کد بالا را اجرا میکنیم:
x_train_full shape: (60000, 28, 28) x_train_full type: uint8
y_train_full shape: (60000,) y_train_full type: uint8
x_test shape: (10000, 28, 28) x_test type: uint8
y_test shape: (10000,) y_test type uint8
مشاهده میکنید همانطور که انتظار داشتیم دادههای آموزش 60هزار نمونه و دادههای تست 10هزار نمونه بوده و همه آنها از نوع uint8 هستند. سعی کنید حتما بعد از فراخوانی پایگاه داده، ابعاد و نوع آن را چک کنید. تا هرگونه خطای احتمالی در فراخوانی داده ها همین اول کار برطرف شود.
اگر دقت کرده باشید fashion-mnist، داده اعتبارسنجی ندارد. پس بیایید یکی بسازیم! تعداد 10هزار تا از نمونههای train را انتخاب کرده و به اعتبارسنجی اختصاص میدهیم. دقت کنید که این 10هزار نمونه باید از دادههای آموزشی حذف شوند. علاوه بر این تصاویر uint8 هستند. یعنی هر پیکسل در تصاویر، مقداری بین 0 تا 255 دارند. چون از گرادیان کاهشی میخواهیم استفاده کنیم، باید این مقادیر را بین 0 تا 1 بیاوریم. برای این کار کافی است تصاویر را بر 255 تقسیم کنیم.
x_valid, x_train = x_train_full[50000:] / 255.0, x_train_full[:50000] / 255.0 y_valid, y_train = y_train_full[50000:], y_train_full[:50000]
خب تا اینجا ما توانستیم دادهها را فراخوانی کنیم. مقادیر را بین 0 و 1 آوردیم. همچنین 10هزارتا از دادههای آموزش را به اعتبارسنجی اختصاص دادیم. حالا نوبت به ساختن شبکه است😊.
ساختن شبکه در تنسورفلو
در این بخش میخواهیم یک شبکه دسته بندی با mlp و تنسورفلو 2 را پیادهسازی کنیم. شبکه mlp که باید پیادهسازی کنیم ساختاری به شکل زیر دارد:
- لایه اول: لایه ورودی
- لایه دوم: 300 نورون تابع فعالسازی relu
- لایه سوم: 100 نورون تابع فعالسازی relu
- لایه سوم: لایه خروجی شامل 10 نورون تابع فعالسازی softmax
توجه توجه خواهش میکنم اول کار سعی نکنید که شبکه طراحی کنید!! طراحی شبکه نیازمند تخصص و تجربه زیاد است. بنابراین اول کار سعی کنید از شبکههای آماده استفاده کنید.
مدلهای sequential، سادهترین نوع شبکهها هستند که از پشت هم قرار گرفتن چند لایه ساخته میشوند. و پیچیدگی اضافهای ندارند. برای تعریف یک مدل sequential در کراس از دستور keras.models.Sequential استفاده میکنیم. دو راه برای استفاده از این دستور وجود دارد. راه اول این است که ابتدا با کمک keras.models.Sequential یک مدل خالی تعریف کنیم. سپس لایهها را یکی یکی اضافه کنیم. برای این کار مینویسیم:
model = keras.models.Sequential() model.add(keras.layers.Flatten(input_shape=[28, 28])) model.add(keras.layers.Dense(300, activation="relu")) model.add(keras.layers.Dense(100, activation="relu")) model.add(keras.layers.Dense(10, activation="softmax"))
چون ورودی یک تصویر 28×28 است، ابتدا باید آن را به یک بردار تبدیل کنیم. به این کار flat کردن گفته میشود. این کار در کراس با استفاده از دستور keras.layers.Flatten انجام میشود. مشاهده میکنید که ورودی این دستور، ابعاد ورودی است که به صورت input_shape=[28, 28] وارد شده است. برای تعریف لایههای دیگر از دستور keras.layers.Dense استفاده میکنیم. این دستور یک لایه fully connected یا dense تولید میکند. اولین ورودی این دستور تعداد نورونها را نشان میدهد. سپس نوع تابع فعالسازی را مشخص میکنیم. که در اینجا برای لایههای میانی از ReLU و برای لایه خروجی از softmax استفاده کردیم.
روش دوم برای تعریف این شبکه این است که تمام لایهها را داخل همان keras.models.Sequential بنویسیم. به شکل زیر:
model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), keras.layers.Dense(300, activation="relu"), keras.layers.Dense(100, activation="relu"), keras.layers.Dense(10, activation="softmax") ])
model.summary()
با اجرای کد بالا خواهیم داشت:
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_1 (Flatten) (None, 784) 0
_________________________________________________________________
dense_3 (Dense) (None, 300) 235500
_________________________________________________________________
dense_4 (Dense) (None, 100) 30100
_________________________________________________________________
dense_5 (Dense) (None, 10) 1010
=================================================================
Total params: 266,610
Trainable params: 266,610
Non-trainable params: 0
_________________________________________________________________
مشاهده میکنید هر لایه از شبکه نشان داده شده است. حتی تعداد پارامترهای هر لایه نیز آورده شده است. در پایان هم تعداد کل پارامترها، پارامترهای قابل آموزش و پارامترهای غیرقابل آموزش هم آورده شده است. میدانید منظور از پارامتر چیست دیگر؟ منظور همان وزنها و بایاسهایی است که شبکه باید آنها را یاد بگیرد.
بعد از ساختن مدل، نوبت به آموزش آن میرسد. برای آموزش مدل، ابتدا باید یکسری چیزها را برای مدل روشن کنیم.
- تابع اتلاف چیست
- الگوریتم بهینهسازی چیست
- معیار ارزیابی چیست
در این مسئله ما میخواهیم از تابع اتلاف sparse_categorical_crossentropy استفاده کنیم. الگوریتم بهینهسازی گرادیان کاهشی باشد. همچنین معیار ارزیابی accuracy یا دقت باشد. برای این کار کافی است بنویسیم:
model.compile(loss="sparse_categorical_crossentropy", optimizer="sgd", metrics=["accuracy"])
مشاهده میکنید که هرکدام از توابع اتلاف، متریکها و بهینهسازها نماد مخصوص به خود را دارند. شما میتوانید این نمادها را در سایت کراس مشاهده کنید. برای دیدن توابع اتلاف، اینجا کلیک کنید. برای دیدن متریکها اینجا کلیک کنید. برای دیدن الگوریتمهای بهینهسازی اینجا کلیک کنید.
بعد از compile کردن مدل حالا دیگر بالاخره میتوانیم با دستور model.fit مدلی که تعریف کردیم (model) را آموزش دهیم. برای این کار باید بنویسیم:
history = model.fit(X_train, y_train, epochs=30, validation_data=(X_valid, y_valid))
مشاهده میکنید که اول دادههای آموزش و سپس برچسب آنها وارد شده است. در ادامه عبارت epochs = 30 آورده شده است. این عبارت یعنی اینکه تعداد تکرارِ پروسه آموزشِ شبکه، 30 بار باشد. در نهایت هم دادههای validation را وارد میکنیم. با اجرای کد بالا خواهیم داشت:
Epoch 1/30
1719/1719 [==============================] - 5s 3ms/step - loss: 0.6995 - accuracy: 0.7692 - val_loss: 0.5317 - val_accuracy: 0.8172
Epoch 2/30
1719/1719 [==============================] - 5s 3ms/step - loss: 0.4840 - accuracy: 0.8323 - val_loss: 0.4565 - val_accuracy: 0.8456
Epoch 3/30
1719/1719 [==============================] - 5s 3ms/step - loss: 0.4392 - accuracy: 0.8461 - val_loss: 0.4106 - val_accuracy: 0.8570
.
.
.
Epoch 27/30
1719/1719 [==============================] - 5s 3ms/step - loss: 0.2369 - accuracy: 0.9158 - val_loss: 0.3071 - val_accuracy: 0.8934
Epoch 28/30
1719/1719 [==============================] - 5s 3ms/step - loss: 0.2339 - accuracy: 0.9148 - val_loss: 0.3017 - val_accuracy: 0.8938
Epoch 29/30
1719/1719 [==============================] - 5s 3ms/step - loss: 0.2289 - accuracy: 0.9171 - val_loss: 0.3128 - val_accuracy: 0.8866
Epoch 30/30
1719/1719 [==============================] - 5s 3ms/step - loss: 0.2249 - accuracy: 0.9193 - val_loss: 0.3069 - val_accuracy: 0.8904
مشاهده میکنید که در هر تکرار مقدار اتلاف و accuracy برای دادههای آموزش و اعتبارسنجی نوشته شده است. به طور کلی دیده میشود که مقدار اتلاف دادههای اعتبارسنجی و آموزش کم شده و accuracy آنها افزایش یافته است. اما شاید بخواهید این نمودارها را رسم کنید. برای این کار کد زیر را بنویسید:
import pandas as pd import matplotlib.pyplot as plt pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.gca().set_ylim(0, 1) # set the vertical range to [0-1] plt.show()
با اجرای کد بالا خواهیم داشت:
در نمودارهای بالا به وضوح مشخص است که اتلاف سیر نزولی داشته و مقدار accuracy سیر صعودی دارد. اما یک مرحله مهم از کار مانده است. و آن هم این است که عملکرد شبکه را روی دادههای تست بررسی کنیم. برای این کار باید بنویسم:
model.evaluate(x_test/255, y_test)
دقت کنید هر بلایی که سر دادههای آموزش آوردید، باید روی دادههای تست هم بیاورید. چون شبکه روی دادههای آموزش، یادگرفته است. بنابراین اگر دادههای تست با دادههای آموزش متفاوت باشد، شبکه نمیتواند درست تشخیص بدهد!
مقدار x_test را بر 255 تقسیم میکنیم تا مقادیر را به بازه 0 و 1 بیاوریم. با اجرای کد بالا خواهیم داشت:
313/313 [==============================] - 1s 2ms/step - loss: 0.4659 - accuracy: 0.8346
[0.4658662676811218, 0.8345999717712402]
عدد اولی که در خروجی میبینید، مقدار اتلاف را نشان میدهد. عدد دوم accuracy را نشان میشود. یعنی ما به دقت 83.45 درصد روی پایگاه داده fashion-mnist رسیدیم!
منابع آموزش یادگیری عمیق
در فهرست زیر، تعدادی از منابع خوب آموزش یادگیری عمیق را معرفی کردهایم.
- کتاب Hands on Machine Learning
- کتاب Pattern Recognition and Machine Learning
- کتاب Neural Networks for Pattern Recognition
- کتاب شبکه عصبی Haykin
در این پست یک شبکه mlp برای دسته بندی دادههای fashion mnist ساختیم. امیدوارم این آموزش مورد توجه شما قرار گرفته باشد. نظرات و سوالات خود را پایین 👇 برایمان کامنت کنید. حتما سوالات شما پاسخ داده خواهد شد.
مطالب زیر را حتما مطالعه کنید
مدل nanoGPT
شگفتانگیزترین ایده هوش مصنوعی از نظر Andrej Karpathy
شبکه ویژن ترنسفورمر
شبکه اتوانکدر
شبکه عصبی mlp
شبکه ترنسفورمر
43 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام و عرض خدا قوت
ظاهرا سایت fashion mnist به مکان ما گیر داده و ما را تحریم کرده و باز نمیشه
لذا اگر در فایل داخل دستگاه خودمان بخواهیم بانک داده را فراخوانی و پردازش کنیم چه کار باید انجام دهیم
سپاسگزارم پاینده باشید
باگ: X_train_full اکس را همه جا حروف کوچک تایپ نمایید
سلام
خدا قوت! بسیار بسیار عالی و استادانه نوشتین مطالبتون رو، احسنت واقعاً، ایدهآلترین حالت ممکن برای تدریس و ارائه مطالب که قطعاً زمان و انرژی زیادی هم گرفته ازتون
یه سوال داشتم من، الان با چه دستوری میتونیم به این مدل یکی از ورودیهای data_set (مثلاً اولین عکس از x_test) رو بدیم و خروجی مدل و کلاسی که مشخص میکنه رو ببینیم؟ و اینکه با چه دستوری میتونیم خود اون عکس ورودی (x_test[0]) رو هم نمایش بدیم و ببینیم؟
سلام. خیلی ممنونم از آموزش فوقالعادهای که داشتید.
میخواستم در مورد تعداد Epoc بپرسم که بر چه اساسی 30 در نظر گرفتید؟
سلام
ایپاک یک هایپرپارامتر هست و توسط من و شمای مهندس تعیین میشه. ما این عدد رو 30 گذاشتیم، چون با همین اندازه به خوبی آموزش میبینه.
ممنون و خسته نباشید برای آموزش های خوبی که در اختیارمون میزارید
x_valid, x_train = x_train_full[50000:] / 255.0, x_train_full[:50000] / 255.0
y_valid, y_train = y_train_full[50000:], y_train_full[:50000]
متوجه این دو خط کد نمیشم که چطور این کد دیتاهای اعتبار سنجی رو میسازه؟ ممنون میشم توضیح بدین
کلا 60هزارتا تست بود که اینجا 50هزارتا رو صدا کردین ، چطور ده هزارتای باقی مونده به اعتبار سنجی اختصاص داده شده ؟ فقط با تعریف کردن x_valid و y_valid؟
x_valid از 50000 تا آخر داده ها اختصاص داده شده و x_train از ابتدا تا 50000
با سلام و تشکر از آموزش مفیدتون
علت پیغام زیر چه چیزی میتونه باشه؟
NameError: name ‘history’ is not defined
سلام
احتمالا یکی از خطهای برنامه که متغیر history ساخته میشه رو اجرا نکردید. به کدها نگاه کنید؛ یک خط وجود داره بنام model.fit که خروجی دستور توی متغیر history ذخیره میشه.
یک آموزشی هم از بازنمایی شبکه ها به شکل گراف جهتدار وسپس دسته بندی گره های شبکه براساس وزنشون لطفا ارائه بدید یا حداقل چارچوب کلی رو بفرمایید که از کدوم کتابخونها،توابع و …استفاده کنم؟
پاسخ
سلام
متاسفانه، منبعی برای معرفی نداریم. 🙏
دست مریزاد، هیچ آموزشی به زبان فارسی که انقدر دقیق و ساده باشه ندیده بودم
با سلام و خسته نباشین .بییییی نهایت از آموزش عالیتون سپاسگزارم یه عالمه از سوالهایی که درگیرشون بودمو جواب داد.امیدوارم همیشه سلامت و موفق باشین و ادامه پیدا کنه آموزشهای فوق العادتون.
اگه براتون مقدوره یک آموزشی هم از بازنمایی شبکه ها به شکل گراف جهتدار وسپس دسته بندی گره های شبکه براساس وزنشون لطفا ارائه بدید یا حداقل یک چارچوب کلی رو بفرمایید که از کدوم کتابخونها،توابع و …استفاده کنم؟
سلام
بی نهایت ممنون 🌹😊🙏
با سلام و خسته نباشید
علت استفاده از این اعداد رو میشه بگید:
لایه اول: لایه ورودی
لایه دوم: 300 نورون تابع فعالسازی relu
لایه سوم: 100 نورون تابع فعالسازی relu
لایه سوم: لایه خروجی شامل 10 نورون تابع فعالسازی softmax
سلام
* لایه اول که براساس سایز داده ورودی تعیین میشه.
* لایه خروجی هم معادل با تعداد کلاسهاست.
* تعداد لایه پنهان (لایه دوم و سوم) و همچنین تعداد نورونها براساس تجربه تعیین میشه. یعنی طراح شبکه، باتوجه به مساله و داده تصمیم میگیره که چه تعداد لایه پنهان و چه تعداد نورون در شبکه بذاره.
به عنوان تمرین، تعداد لایه و نورونها رو کم و زیاد کنید و نتایج رو توی یک جدول بنویسید و بعد مقایسه و تحلیل کنید.
سلام مجدد
روشی برای به دست آوردنش وجود نداره؟ فقط از راه تجربه است؟
ممنون از تدریس خوبتون ، لطفا یک دوره آموزش برای transfer learning ، مدل های معروف مثل vgg16 هم بزارید .
سلام
پیشنهاد میکنیم به دوره آموزش یادگیری عمیق هوسم نگاهی بندازید. در این دوره درباره ترنسفر لرنینگ و شبکه های کانولوشنی معروف توضیح داده شده.
سلام ببخشید منم خطای کاربر مهسا را دارم.
ولی با روشن کردن همونی که میگین مشکلم حل نمیشه 🙁
با اناکوندا کار میکنم
کار دیگه ای هم هست که باید انجام بدم؟
بسی ممنون از آموزش خوبتون.
تشکر.
سلام
متاسفانه پیام شما رو با تاخیر داریم جواب میدیم. معذرت 🌹🙏
امیدواریم مشکل شما حل شده باشه. با یک اینترنت خوب و اون اسمشو نیار که آیپی کامپیوتر رو عوض کنه، مشکل حل میشه.
من برای فراخوانی با این خطا مواجه میشم
Exception: URL fetch failure on https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz: 403 — Forbidden
مشکل از کجاس ؟
سلام
در این پروژه از دیتاست fashion mnist استفاده شده. اول کار، تنسورفلو این دیتاست رو از اینترنت دانلود میکنه. خطای 403 داده یعنی شما نمیتونید بهش دسترسی داشته باشید! گوگل دسترسی ما به این لینک رو بسته. پس باید از یک چیزی استفاده کنید که نمیتونیم اسمشو بیاریم ولی همه تو کامپیوترمون داریم! 😅
خیلی ممنون از اینکه زود جواب دادین 🙏.. دو ساعت درگیر این خطا بودم ..
پس باید اونو فعال کنم ممنون 😀
با عرض سلام و ادب
بابت آموزشهای روان و پربار بسیار متشکرم و قدا قوت عرض میکنم به شما و تیم شما.
بنده تمام کدهای این آموزش رو نوشتم و دقتی که بدست آوردم چند درصد بیشتر از دقتی بود که شما بدست آوردید، در صورتی که هیچ تفاوتی در کدها و دیتاست من و شما نبود. دلیل این تفاوت چه چیزی هست؟
باتشکر
سلام
خوشحالیم که آموزش برای شما مفید بوده.
این مساله تفاوت دقت، غیرطبیعی نیست. ما در آموزش شبکه عصبی یک جواب قطعی و مشخص نداریم، بلکه با بهینهسازی به دنبال یافتن پارامترهای بهینه برای شبکه عصبی هستیم، طوری که شبکه به حداقل خطا یا بالاترین دقت برسه. حالا پارامترهای شبکه شما از پارامترهای شبکه ما بهینهتر هست و این باعث شده شما به نتیجه بهتری برسید. اگرچه همه کدها یکی هست، اما مسائلی مثل مقداردهی اولیه وزنهای یک شبکه میتونه در این عامل دخیل باشه و تفاوت ایجاد کنه.
خیلی خیلی عالی بود. دست شما درد نکنه. واقعاً ممنون
سپاس 🌹🙏
بسیار ممنون از تدریس فوق العاده خوبتون
🌹🙏
سلام واقعا عالی، من یه تمرین داشتم که دقیقا سوالش مربوط به این دیتاست بود کل اینترنت رو گشتم چیز خوبی گیرم نیومد اما سایت شما با توضیح خیلی خوبتون تونست کمکم کنه
سلام
سپاس 🌹🙏
سلام روزتون بخیر
ببخشید یک سوالی دارم ممنون میشم راهنمایی کنید🌹
پایان نامه من مرتبط با شبکه عصبی عمیق هست. آیا کدنویسی با پایتون بهتره یا متلب؟
سلام
بدون شک پایتون!
تعدادی از دانشجویان، چون به متلب مسلط یا آشنا هستند، ترجیح میدن که با متلب پیش برن. علاقه ندارن که یک زبان برنامه نویسی جدید به نام پایتون رو یاد بگیرن. حتی میترسن سراغ پایتون برن. درحالیکه انتخاب متلب برای یادگیری عمیق کار خوبی نیست. چون اگر با متلب کار کنید، تنها خواهید بود!
اگر با متلب کار کنید، مجموعه بزرگی از آموزشها، مثالها، پروژهها و کدهای آماده مقالات رو به راحتی از دست خواهید داد. مثلا، تقریبا گیتهاب برای شما بیاستفاده میشه، چون اکثر کدهای موجود در گیتهاب بر پایه پایتون هست. علاوهبراین، بسیاری از مجموعههای آموزشی برپایه پایتون پیش میرن. بازهم شما نمیتونید از اونها استفاده کنید. مثلا، بسیاری از آموزشهای هوسم رو از دست میدید!
پیشنهاد هوسم: ابتدا پایتون، بعد پایتورچ و تمام!
سلام خسته نباشید
با اجرای کد زیر:
X_valid, X_train = X_train_full[:5000] / 255.0,
X_train_full[5000:] / 255.0 y_valid,
y_train = y_train_full[:5000],
y_train_full[5000:]
باعث خطای زیر میشه:
File “”, line 2
X_train_full[5000:] / 255.0 y_valid,
^
SyntaxError: invalid syntax
سلام،
ممنون از اینکه پست رو خوندید و مهمتر از همه، کدها رو اجرا کردید.
مشکل از کدهای ما بود و برطرف شد. ممنون که اطلاع دادید 🙏🌹
سلام، وقتتون بخیر، من تست کردم و همچنان این قسمت کد مشکلی داره چون این ارور رو میده :
NameError Traceback (most recent call last)
in ()
—-> 1 x_valid, x_train = x_train_full[50000:] / 255.0, x_train_full[:50000] / 255.0
2 y_valid, y_train = y_train_full[50000:], y_train_full[:50000]
NameError: name ‘x_train_full’ is not defined
سلام
لطفا نگاهی به خط آخر خطا بندازید. نوشته x_train_full is not defined. یعنی متغیری بنام x_train_full تعریف نشده ولی داره ازش استفاده میشه. دلیلش این هست که شما خط اول کدهای ما، یعنی فراخوانی پایگاه داده fashion mnist رو اجرا نکردید.
ممنونم مشکل حل شد، من فراخوانی پایگاه داده رو انجام داده بودم مشکل این بود که در خط فراخوانی پایگاه داده capital x به کار رفته در حالی که برای قسمت بعدی small x استفاده شده
بله درسته. ما هم باید اصلاح کنیم.
ممنون 🌹🙏
تدریستون فوق العاده گویا و قابل فهمه.
ازتون متشکرم
سلام
سپاس 🙏🌹