مقدمه‌ای بر پیاده سازی شبکه‌های عصبی ترتیبی در کراس

تعریف یک مدل ساده روی دیتاست هدی (ادامه):

تا اینجا با نحوه لود کردن مجموعه داده در keras ، پیش پردازش داده ها، تعریف معماری مدل و طبقه بند چندلایه softmax آشنا شدیم.

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

Compile model :

Model.compile() :

در دستور compile تابع loss  معیار بد بودن شبکه را نشان می دهد و optimizer مشخص می کند چگونه باید آن را بهبود دهیم تا این معیار به مینیمم مقدار خود برسد.

کد:

model.compile (loss=’categorical_crossentropy,

optimizer=’rmsprop’

 metrics=[‘accuracy’])

در این قسمت یک مدل به دست می آید که ورودی، خروجی، معیار بد بودن و نحوه بهینه کردن آن مشخص شده است و از این پس منتظر data است تا بهینه کردن را آغاز کند.

با دستور fit این عملیات آغاز می شود.

نکته: دستور fit روی data های train صورت می گیرد.

آموش مدل با داده‌های آموزشی، تعیین سایز mini_batch و تعداد epoch:

Model.fit() :

x_train و y_train به عنوان پارامتر اول و پارامتر دوم به آن داده می شود.

epochs که به عنوان پارامتر سوم به آن داده شده است نشان می دهد شبکه باید چند بار data های موجود را مرور کند.

همچنین batch_size به عنوان پارامتر آخر مشخص می کند پس از دیدن چند data شروع به بهینه کردن مسئله کند.

برای مثال batch_size = 64 نشان می دهد به شصت و چهارمین data که برسد ، میانگین خطا ها را در نظر می گیرد و بر اساس این میانگین تابع را optimize می کند.

در فرمول C = Σ(y-a)2 / n  مقدار n  نشان دهنده ی batch_size است.

نکته: اعداد معروف batch_size (طبق گفته دکتر Andrew ng ،استاد دانشگاه استنفورد): 16 ، 32 ، 64 ، 128 ، 256 ، 512 و نهایتا 1024 است.

Batch_size یک hyper parameter است و بزرگ و کوچک بودن آن در فرآیند training تاثیر دارد.  همچنین این پارامتر روی سرعت همگرا شدن تاثیرگذار است. علاوه بر سرعت، هرچه سایز batch بزرگ تر باشد، نرمال سازی (batch_normalization)  بهتر است.

برای مثال اگر بخواهد هر کدام از data های هدی که می آید، شبکه را به روز کند دید کلی نسبت به شبکه ندارد. همچنین اگر بخواهد همه ی data ها را ببیند سپس بهینه ساری را انجام دهد، هزینه بالا می رود و سرعت پایین می آید بنابراین batch_size باید عددی بین یک و تعداد کل داده ها باشد که به آن mini_batch می گویند.

کد:

model.fit(x_train, y_train,

epochs=5,

( batch_size=64

وقتی کد را اجرا کنیم چون در کد های قبلی metric را accuracy تعریف کرده بودیم هر epoch که تمام می شود accuracy را اعلام می کند.

خروجی کد:

Epoch 1/5

1000/1000 [==============================] – 9s 9ms/step – loss: 0.2789 – acc: 0.9100

Epoch 2/5

1000/1000 [==============================] – 10s 10ms/step – loss: 0.2689 – acc: 0.9180

Epoch 3/5

1000/1000 [==============================] – 10s 10ms/step – loss: 0.2637 – acc: 0.9210

Epoch 4/5

1000/1000 [==============================] – 10s 10ms/step – loss: 0.2591 – acc: 0.9250

Epoch 5/5

1000/1000 [==============================] – 10s 10ms/step – loss: 0.2555 – acc: 0.9210

هرچه پایین تر می رود مقدار loss کمتر می شود. اگر بخواهیم loss کمتر و accuracy بیشتر شود می توانیم epoch را بیشتر کنیم.

ارزیابی مدل روی داده های آزمون:

در ارزیابی هم از accuracy استفاده می شود.

Model.evaluate() :

در دستور evaluate به جای x_train و y_train ، از x_test و y_test به عنوان پارامتر اول و دوم استفاده می شود.

خروجی این تابع یک tuple است که از loss و accuracy تشکیل شده و در واقع میزان loss و accuracy را در data های test نشان می دهد.

کد:

loss, acc = model.evaluate(x_test, y_test)

print(‘\nTesting loss: %.2f, acc: %.2f%%’%(loss, acc))

خروجی کد:

200/200 [==============================] – 0s 195us/step

Testing loss: 0.33, acc: 0.91%

پیش‌بینی داده‌های آموزشی: ( predicted class  )

از ابتدا تا اینجا یک مدل را به صورت sequential تعریف و معماری آن را مشخص کردیم، سپس روی آن بهینه سازی انجام دادیم و در آخر مدل را روی آن fit کردیم. حالا می توانیم روی همان مدل predicted class را صدا بزنیم.

data های test به عنوان پارامتر به predicted class داده می شود سپس predicted ها و true lable ها چاپ می شوند.

کد:

predicted_classes = model.predict_classes(x_test)

print(“predicted:”)

print(predicted_classes)

print(“True Label:”)

print(y_test_original)

خروجی کد:

predicted:

[7 2 3 8 5 5 4 7 3 2 0 8 8 0 2 9 3 6 7 4 0 3 6 3 9 2 7 5 2 9 2 5 5 8 9 2 5

1 4 8 8 4 2 2 1 2 7 9 0 3 7 2 7 5 2 9 8 2 9 8 8 6 6 6 7 6 2 4 2 4 4 5 9 1

8 4 0 5 6 2 4 3 2 7 7 7 7 1 8 1 7 8 7 7 8 9 7 2 3 1 0 2 9 6 3 5 5 0 0 9 6

7 9 3 9 9 8 7 9 2 5 2 5 5 9 6 9 2 0 3 7 9 5 2 9 0 4 1 8 2 2 3 5 2 9 3 8 2

7 0 9 9 0 7 6 7 4 0 9 3 7 0 7 4 9 4 7 3 4 1 5 6 7 9 1 3 5 4 5 7 4 1 3 3 1

1 4 3 8 9 6 7 7 2 3 0 1 4 9 5]

True Label:

[7 2 3 1 5 5 4 7 3 2 0 8 8 0 2 9 3 6 7 4 0 3 6 3 9 2 7 5 2 9 7 5 5 8 9 6 5

1 4 8 8 4 7 7 1 2 7 9 0 3 7 4 7 5 2 9 8 2 9 8 8 6 6 6 6 6 2 4 3 4 4 5 9 1

8 2 0 5 6 2 4 3 2 7 7 7 7 1 8 1 7 8 7 7 8 9 3 2 3 1 0 2 9 6 3 5 5 0 0 3 6

7 9 3 9 9 8 7 9 2 5 2 5 5 9 6 9 2 0 3 7 6 5 2 9 0 4 1 8 2 2 3 0 2 9 3 8 6

7 0 9 9 0 7 6 5 4 7 9 3 7 0 7 1 9 4 7 3 4 1 5 6 7 9 1 3 5 4 5 7 4 1 3 3 1

2 3 3 8 9 6 7 7 2 3 0 1 4 9 5]

نکته: یکی از روش های خوب machine learning این است که وقتی شبکه را train کردیم مشخص کنیم کدام data ها را اشتباه پیش بینی کرده است و سپس بر این اساس مدل را بهبود دهیم.