بررسی شبکه عصبی کانولوشن (CNN) — بخش دوم
در بخش قبل با پرسپترون (Perceptron) به صورت مقدماتی و اولیه آشنا شدیم. حال به ادامه این مبحث می پردازیم:
آموزش پرسپترون
مجموعه داده
1X = np.array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
2 Y = np.array([0, 1, 1, 0])
ما برای آموزش مدل پرسپترون خود با جدول درستی شروع کردیم.
X: بردار ویژگی برای هر نمونه.
Y: برچسب هر نمونه.
نمایش تصویری فرآیند تغییر وزنها
مقادیر اولیه وزنهای مدل پرسپترون ما، مقادیر تصادفی هستند.
1W = np.random.rand(1, X.shape[1] + 1)
همانطور که در بخش الگوریتم آموزش توضیح داده شد، هدف ما افزایش عملکرد کارهای T است. در هر تکرار، ما پرسپترون را برای پیشبینی خروجی دلخواه در یک جهت و بهصورت پیشرو (feed-forward) حرکت میدهیم. هنگامیکه خروجیها پیشبینی شده (محاسبه شده) با مقادیر مطلوب سازگار نباشد، وزنهای پرسپترون را تغییر میدهیم. تغییر مقادیر وزنها (w) به معنی افزایش یا کاهش وزنها میباشد. این تغییر همان عملی است که در الگوریتم آموزش برای کمینه کردن خطای کلی تعریفشده است.
هنگام بهینهسازی وزنها در آموزش هر مدل، همیشه خطا وجود دارد. نتیجه تابع خطای آموزش معمولی باید مشابه شکل زیر باشد. نرخ یادگیری نمایانگر سرعت آموزش میباشد.
ما در این مقاله، خطا را با خطای مربع تعریف کردهایم. همانطور که در بخش قبل توضیح داده شد، وزنهای دلتا فرمولها را بهصورت زیر تغییر میدهند:
1def delta_weight(eta, true_label, predicted_label, x):
2 """
3
4 :param eta: Learning rate
5 :param true_label:
6 :param predicted_label:
7 :param x:
8 """
9 lambda_param = -1
10 delta_w = lambda_param * eta * (predicted_label - true_label) * x
11 return delta_w
1def training_perceptron(eta, X, Y, number_of_epoch=5000):
2 """
3 :param eta: learning rate of perceptron
4 :param X: the feature set for training
5 :param Y: the target value against feature set
6 """
7
8 logging.info('Training Config:\nNumber_of_epoch: {} Eta: {}'.format(number_of_epoch, eta))
9 W = np.random.rand(1, X.shape[1] + 1)
10 loss_log = []
11 X = np.insert(X, 2, values=1, axis=1)
12 for epoch in range(number_of_epoch):
13 X, Y = shuffle(X, Y)
14 loss = 0.0
15
16 for index, (feature_row, true_label) in enumerate(zip(X, Y)):
17 theta = np.dot(np.array(feature_row), W.T)
18 # predicted_output = 1 if theta > 0 else 0
19 predicted_output = float(theta)
20
21 loss += (true_label - predicted_output) ** 2
22 delta_W = [delta_weight(eta, true_label, predicted_output, x) for x in feature_row]
23 logging.debug([feature_row, true_label, np.around(W, decimals=1), predicted_output, theta, delta_W])
24
25 W = np.add(W, delta_W)
26 if epoch % 50 == 0:
27 loss_log.append([epoch, loss])
28 logging.info('Epoch Summary : Epoch: {} Loss: {}'.format(epoch, loss))
29 if loss < 0.001:
30 break
31
32 time.sleep(0.001)
33 df = pd.DataFrame(loss_log, columns=['Epoch', 'Loss'])
34 logging.info(df)
35 df.to_csv('training_log.csv')
36 return number_of_epoch
بنابراین، ما هنگام شروع آموزش مدل یک فرا پارامتر (laper-parametr) انتخاب میکنیم. در این مقاله، فرا پارامترها عبارتند از:
1"""
2eta: learning rate of the training
3lambda_param: to limit the maximum delta change in weights
4"""
چنانچه نرخهای یادگیری متفاوت باشند، ممکن است نقاط خطا نیز متفاوت باشند. اگر نرخ یادگیری بالا باشد، تغییر وزنها بزرگ میباشد و ممکن است آموزش سریعتر باشد.
اگر نرخ یادگیری eta=0.0001 باشد، آموزش تعداد تکرار بیشتری برای حصول کمترین خطا خواهد داشت.
اگر نرخ یادگیری eta=0.01 باشد، سرعت آموزش 10 برابر میشود.
حال که در این مورد اطلاعاتی را کسب کردید، شاید آموزش های زیر بتواند برای شما مفید باشند:
- آموزش یادگیری عمیق (Deep learning)
- مجموعه آموزش های شبکه های عصبی مصنوعی در متلب
- آموزش شبکههای عصبی مصنوعی
**