پروژه ترجمه ماشین

اعضای گروه : عاطفه ولی پور – المیرا قربانی

مقدمه

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

GRU & LSTM

Recurrent Neural Networks

جلسات پیش با RNN ها آشنا شدیم و با ساختن یک language مدل توانستیم مدلی طراحی کنیم که یک کلمه را دریافت کند و کلمات بعدی را حدس بزند.

در ادامه به بررسی شبکه های LSTM و GRU میپردازیم.

یادآوری:

شبکه ی RNNشامل تعدادی Hidden نورون است که این Hidden نورون ها تکرار میشوند به طوری که انگار در طول زمان باز و تکرار میشوند.

 

Notations:

X1,X2,….Xn   ورودی های شبکه هستند که به مرور زمان به شبکه میدهیم به طور مثال اگر بخواهیم کلمه کلمه  به شبکه بدهیم ابتدا X1 , … الی آخر پشت هم می آیند. این ورودی ها شامل یک سری وزن هستند که با Wax نمایش میدهیم و یک سری وزن که از state مرحله ی قبلی ورودی میگیرد که همان حافظه ی ما  و خروجی را تشکیل میداد .

a  : خلاصه ای از ورودی های قبلی است که دار ی حافظه است و براسا ورودی هی قبلی و ورودی فعلی تصمبم میگیرد.

Simple syntax RNN:

 

برای ساده تر شدن از این پس تنها یک بردار وزن برای ‌X و a خواهیم داشت که در کنار هم این دو Concatمیشوند.

در نهایت :

مشکل RNNها :

استفاده از این شبکه برای جملات کوتاه مشکلی ایجاد نمی کند.اما اگر جمله ی ما ادامه پیدا کند این شبکه نمیتواند به صورت Long Term جمله را حفظ کند و اصطلاحا مشکل Wanishing Gradiant به وجود میاید .

RNN Unit:

مطابق شکل  یک وزنی داریم که در concat شده ی ورودی و  stateقبلی ضرب میشود و به activation function داده میشوند که y hatما را تشکیل میدهد.

 

GRU:

برای حل مشکل Wanishing Gradiant  برای جملاتی مثل :

The cat, which already ate …, was full.

برای اینکه بدانیم در جای خالی با توجه به ضمیر چه چیزی به کار ببریم نیاز داریم حافظه ی طولانی تری داشته باشیم .

در gru به state که داریم c میگوییم که مخفف cell است .به عبارتی cهمان <a<t قبلی است .

بجای مشخص شدن stateجاری یک stateپیشنهادی داریم~C که کاندیدی برای stateجاری است که هنوز به صورت قطعی قرار نیست  stateجاری باشد.

ورودی جاری و state قبلی در هم concatشده و در وزن Wc ضرب میشوند.

GRU Simplified:

تفاوت با RNNساده :

یک سری گیت اضافه شده برای بررسی پذیرش کاندید state

برای بررسی آپدیت گیت یک activation function sigmoid داریم .(0:بروز نکن ,1:بروز کن)

رای تعیین <C<t اگر  Г آپدیت برابر با 1 بود بروز رسانی صورت میگیرد و اگر 0 باشد , کاندید state را نمیپذیرد و stateمرحله قبل را در نظر میگیرد.

Full Gru:

در Full GRU یک گیت جدید اضافه میکنیم  که بررسی میکند stateمرحله قبل چقدر به context جاری مربوط میشود.

activation function گیت جدید یک sigmoid است که مقدار 0 یا 1 برمیگرداند و تصمیم میگیرد حافظه قبلی چقدر به ورودی جاری مربوط میشود و براساس ورودی میتواند تصمیم بگیرد ,گیت حافظه را برای خروجی دادن این state در نظر بگیرد یا خیر.

LSTM:

شبکه‌های LSTM که خلاصه شده عبارت “Long Short Term Memory” هستند، نوع خاصی از شبکه‌های عصبی بازگشتی هستند که توانائی یادگیری وابستگی‌های بلندمدت را دارند و مشکل ‌wanishing gradiant حل کردند.این شبکه‌ها برای اولین بار توسط Hochreiter و Schmidhuber در سال ۱۹۹۷ معرفی شدند.

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

 

مقایسه بین LSTM و GRU

در lstm گیت Γr نداریم این گیت مشخص میکند چه میزان از حافظه را دخیل کند اگر 0 باشد به طور کلی اثر حافظه  را از بین میبرد,میتوان قرار داد اما ضروری نیست.

lstmدر مقایسه با gru تعداد گیت های بیشتری دارد. در lstm برای فراموش کردن هم یک گیت اضافه شده و مشخص میکند برای برای بازنویسی< C<t چه میزان کاندید state را تاثیر بدهیم به عبارتی چقدر بخاطر بسپرد و چقدر فراموش کند.

 

Bidirectional RNN:

ماژول تکرار در RNN دو طرفه می تواند RNN معمولی، LSTM یا GRU باشد. ساختار و اتصالات یک RNN دو طرفه در شکل زیر نشان داده شده است. دو نوع ارتباط وجود دارد که یکی از آن ها در زمان پیش می رود که به ما کمک می کند تا از بازنمایی های قبلی یاد بگیریم و دیگر به عقب بازگردیم، که به ما در بازنمایی های آینده کمک می کند. مثلا ما دیتای آفلاین داریم مثل ویدیو یا یک متن

 

Deep Rnn:

مطابق شکل state مرحله قبل که رسیده توی کروشه 1 در نظر گرفته شده یعنی برای لایه اول و برای هر لایه عدد کروشه متفاوت است .در هر مرحله state ایجاد میکنند و به مرحله ی بعدی میروند .میتوانیم این state را به یک softmax و یا sigmiodوصل کنیم .این state ها زمانی که شروع میشوند با 0 مقدار دهی میشوند ,لایه ها روی هم stack شده و یک شبکه دیپ ایجاد میکنند .y های خروجی قرار است برای ما چیزی حساب کنند در طول زمان X دریافت کرده اند و یک state خود yهم چند لایه است ,میتوانیم مستقل از دیپ بودن قبلش خروجی لایه را به یک شبکه cnnبدهیم :

 

استفاده از خروجی y :

تولید متن با شبکه بازگشتی LSTM در Keras

در این مثال به پیاده سازی یک شبکه lstm میپردازیم که بر روی کتاب فیلسوف آلمانی نیچه به صورت

character-level پیاده سازی شده.

ابتدا مجموعه داده را بارگذاری میکنیم:

 

توسط maxlen مشخص میکنیم به شبکه چند حرف چند حرف بدیم . در این مثال طول کلمات 60 تایی است و ممکن است  این 60 تا وسط کلمه تمام شود یا بیشنر از طول رشته ی ورودی باشد.

در for زیر کاراکتر 61 ام به عنوان label در نظر گرفته میشود.

توسط setنیز تعداد کاراکتر های یونیک را مشخص میکنیم.

 

ایجاد شبکه (Building the network)

 

این کدی است که ما برای  توزیع احتمالی اصلی خارج از مدل استفاده می کنیم و یک شاخص کاراکتر را از آن به دست می آوریم. میدانیم predict دقیقا 0 و 1 نیست .در این جا نقش temperature این است که براساس احتمالات رندم انتخاب کند.هر چقدر temperature بیشتر باشد احتمال نفر اول را بیشتر نشان میدهد.

 

و در نهایت ایجاد متن 

 

نمونه خروجی متن ایجاد شده :

آشنایی با سرویس ابری Google Colab

محیط گوگل کولب امکان استفاده از GPU  را به صورت رایگان میدهد و امکان نصب و کار با پکیج های مختلف زبان پایتون و فریم ورکهای مطرح یادگیری عمیق همانند Tensorflow, Keras, Pytorch,Fast.ai را فراهم میکند.

مراحل ایجاد یک نوت بوک

ابتدا مطمئن شوید که به حساب کاربری gmail  خود متصل هستید . اگر حساب کاربری gmail ندارید اینجا را کلیک کنید.

* توجه :در تمام طول کار، باید  وی‌پی‌ان یا فیلترشکن روشن باشد.

از اینجا وارد محیط  google drive  شوید .

روش اول :

در محیط google drive   یک پوشه ایجاد کنید :

پوشه ای که ایجاد کرده ایم را انتخاب میکنیم

با کیلک راست بر روی  My drive فایل های نوت بوک وdataset.py    [Upload files] و

Data_hoda_full را آپلود میکنیم.

با کلیک راست بر روی نوت بوک مانند شکل زیر،نوت بوک را  با colaboratoryباز میکنیم :

بعد از باز شدن نوت بوک  GPU را فعال  میکنیم:

یک cell جدید ایجاد میکنیم :

کد زیر را در cell  وارد میکنیم :

بعد از run  شدن  cell دو مرحله تایید اعتبار داریم ، در هر مرحله بر رو لینک کلیک کنید و کد رو در تکست باکس وارد کنید :

کدهای زیر را به نوت بوک اضافه میکنیم تا فایل ها از گوگل درایو به محیط colab  اضافه شوند :

add cell+

add cell +

حالا  یک دایرکتوری برای دیتاست ایجاد میکنیم :

add cell+

دیتاست هدی را به پوشه ی دیتاست اضافه میکنیم :

add cell+

روش دوم ایجاد نوت بوک :

وارد سایت colab.research.google.com میشویم :

NEW NOTEBOOK >>> NEW PYTHON3 NOTEBOOK

سپس از منو file  نوت بوک جدید را آپلود میکنیم :

یک cell  جدید  ایجاد میکنیم سپس دستور زیر را وارد میکنیم  :

فایل و پوشه ی دیتاست را آپلود میکنیم :

add cell+

دیتاست هدی را به پوشه ی دیتاست اضافه میکنیم :

add cell+

روش سوم :

ابتدا ریپازیتوری خود را با دیتاست موردنظر و دلخواه روی گیت هاب ایجاد کنید

یا در صورت وجود ریپازیتوری آدرس آن را به صورت زیر یافته و با دستور زیر آن را در جوپیتر ران کنید

*توجه داشته باشید که فرمت دستورات لینوکسی میباشد.

مثال :

بعد از اتمام موفقیت آمیز بودن عملیات کلون از ریپازیتوری گیت هاب خروجی زیر را مشاهده میکنید:

در ادامه مسیر جاری را پیدا کرده و فایل های دریافت شده از مخزن را در مسیر دلخواه ( بعنوان مثال /content ) منتقل کنید:

در نهایت کد های اجرایی مورد نظر را در یک سلول جدید وارد کرده و برنامه را اجرا کنید:

بروزرسانی : 1397/11/06

دستکاری تصویر (3) – مثال‌های عملی در OpenCV

تبدیلات همگن (Affine Transform) 

انتقال (Translation) :

برای پیاده سازی این تبدیلات  از cv2.warpAffine استفاده میکینم.

به طور مثال در کد زیر :

پس از خواندن عکس  و دریافت عرض و طول تصویر:

یک نسبت دلخواه برای انتقال طول و عرض تصویر در نظر گرفتیم :

با استفاده از ضرب ماتریس انتقال در مختصات تصویر ،تصویر انتقال پیدا میکند :

از warpAffine برای تبدیل عکس استفاده میکنیم که ورودی های آن به صورت زیر است :

چرخاندن  (Rotations) :

*یادآوری

ماتریس دوران:

 

 

 

دوران در opencv

  • از نقص های این روش میتوان به ایجاد فضاهای سیاه اطراف تصویر اشاره کرد که در ادامه فضاهای سیاه ایجاد شده اطراف تصویر را با کراپ از بین میبریم.

روشی دیگر برای دوران :

ترانهاده ماتریس

ماتریس ترانهاده  با تغییر جای سطر ها با ستون ها باعث چرخش تصویر میشود و فضای سیاه اطراف تصویر ایجاد نمی کند .

flip  تصویر

تصویر را در جهت افق و خط عمود آینه می کند.

پارامتر دوم :

صفر یا false عکس را حول محور x  ها قرینه میکند.

یک یا True عکس را حول محور y ها قرینه میکند.

تغییر اندازه (scaling, resizing) و درون‌یابی (interpolations)

  • fx  و fy  پارامتر های  نام دار هستند میتوان آنها را به تابع پاس نداد.

روش های درون یابی :

  1.  Bilinear Interpolation (درج وابسته به ۴ پیکسل ۴ طرف)
  2.  Bicubic interpolation (درج وابسته به ۴ پیکسل ۴ طرف به علاوه ۴ پیکسل اریب)
  3.  Nearest Neighbor (نزدیکترین همسایه)

استفاده از ماتریس تبدیل

جهت هایی را که میخواهیم  scale شوند را در قطر ماتریس قرار میدهیم.

معایب :

  1. مشکل سیاهی تصویر را دارد.
  2. عکس بعد از اعمال interpolations باید crop شود .

Image Pyramids

در بعضی موارد، ما باید با تصاویری با وضوح مختلف تصویر مشابه کار کنیم. به عنوان مثال، هنگام جستجو برای چیزی در یک تصویر، مانند چهره، ما مطمئن نیستیم که کدام اندازه از شئ در تصویر وجود دارد.

در این روش عکس را به صورت پلکانی به سایز های مختلف  می بریم :

کاربرد: آموزش به هوش مصنوعی برای تشخیص اشیاء

Cropping

Opencv تابع مشخص برای کراپ کردن ندارد.

روش های جایگزین :

یکی از روش های کراپ کردن slicing است که با دادن بازه ی دقیقی از  x ,y (برای ساده تر شدن عکس را بصورت دو بعدی و سیاه سفید تصور میکنیم)همان بازه ی مشخص شده را کراپ می کنیم.

نکات :

مختصات شروع و پایان حتما  باید اعداد صحیح باشند.

در بازه نویسی به صورت   [ x1 : x2 , y1:y2 ] :

x1 شامل بازه میشود اما x2 نوشته نمیشود .

روش دیگر اسلایس کردن ماتریس  ها به کمک  numpy است.

مثال:

a=np.array([[100,200,400],[1,2,3]])

میخواهیم  عناصر سطر اول [0] و ستون دوم [1]  را انتخاب کنیم.

a [0: , 1:] => array([[200, 400],[ 2, 3]])