PixtoPix

PixToPix

در این بخش قصد داریم مدلی را پیاده سازی کنیم که با دادن یک تصویر به شبکه ، تصویری مشابه الگوهای زیر از شبکه بگیریم . برای مثال بتوانیم عکسی  در فضای آفتابی از یک منظره به شبکه بدهیم و تصویر همان منظره را در فضای ابری بخواهیم ، و یا اینکه عکس سیاه سفید از یک شی را به شبکه داده و عکس رنگی آن را از شبکه بگیریم ، و مثال هایی از این قبیل …

در شکل زیر میتوانید نمونه هایی از این دسته را مشاهده نمایید :

 

 

 

 

 

همانطور که در تصویر بالا مشاهده میکنید میتوانیم با داشتن لبه های یک کیف به تصویر اصلی کیف ، با داشتن منظره ای در هوای افتابی به آن منظره در هوای ابری و با داشتن segment های یک ساختمان به تصویری مشابه از یک ساختمان واقعی و با داشتن عکس سیاه سفید به عکس رنگی تصویرمان برسیم .

در اینجا می توانید نمونه های از این عملیات را به طور آنلاین مشاهده نمایید .


شبکه GAN

همانطور که می دانید در ساختار یک شبکه ی GAN دو واحد اصلی Genarator و Discriminator داریم ، که در واقع کار اصلی واحد Generator  تولید عکس های جعلی و به مرور  یادگیری تولید عکس های واقعی تر و شبیه تر به نمونه ی عکس های اصلی ، و وظیفه ی واحد Discriminator یادگیری فرایند تشخیص عکس جعلی از عکس واقعی می باشد .

به مرور هر دو شبکه ی Generator و Discriminator به ترتیب یاد میگیرند عکس های واقعی تر تولید و عکس های تقلبی را تشخیص دهند ( واحد Generator  سعی در فریب دادن واحد Descriminator دارد )  . پس بدین ترتیب ( همانظور که در بخش های قبلی دیدیم ) generator  یک نویز را به عنوان ورودی میگیرد و تصویری تولید میکند و Discriminator عکس تولیدی واحد Generator را گرفته و سعی در تشخیص جعلی بودن یا نبودن  آن دارد .

Conditional GAN :

conditional generative adverserial nets ها در واقع شبکه ها ی GAN  ای هستند که می توان با اضافه کردن یک ترم به Generator و  Discriminator  از شبکه بخواهیم آن چه مورد نظر ماست را تولید کند . برای مثال میتوانیم نویزی که قرار است به جنریتور بدهیم با یک one hot که عدد 3 را نشان می دهد concat کرده و به generator بدهیم تا برای مثال شبکه ای که دیتا ی Mnist را آموزش دیده بتواند عدد 3 را تولید کند یا برای مثال به طور پیشرفته تر از شبکه بخواهیم یک انسان که تصویرش را دریافت می کند ،  بتواند پیرتر کند .

بدین ترتیب اگر فرایند Train  را بدین گونه تغییر دهیم ( یک ترم اضافه به Discriminator  و Generator بدهیم ) میتوانیم آنچه گفته شد را پیاده سازی کنیم .

 


شبکه ی Generator :

در این بخش از یک auto encoder  برای پیاده سازی این شبکه استفاده میکنیم.

همانطور که میدانید auto encoder دارای یک سری لایه ی convlution در لایه های اول ( کوچک کردن طول و عرض و بزرگ کردن  عمق )  تا رسیدن به یک bottle neck ، و یک سری لایه ی TransposeConvolution ( بزرگ کردن طول و عرض و کوچک کردن  عمق ) تا رسیدن به سایز اولیه می باشد ، بدین صورت عکس ورودی را تا یک جایی کوچک کرده و سپس به ابعاد اولیه می رساند .

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

همانطو که در تصویر بالا مشاهده می کنید ، ورودی شبکه ی Generator  یک عکس سیاه سفید بوده که این شبکه سعی در تولید عکس رنگی ( در مشابه ترین حالت ممکن به عکس رنگی اصلی در دیتاست) دارد .

ایده ای که در قسمت مطرح شد استفاده از skip connection های مشابه در شبکه ی Resnet بود ، به عبارتی از لایه ی n ام encoding به لایه n ام decoding یک skip connection با این هدف که ممکن است نیازی به طی کردن همه ی لایه های کانولوشن و به طبع تمام لایه های دی کانولوشن ( Transpose Convolution )  نباشد ، و با طی کردن تعداد کمتری از این لایه ها به هدف مربوطه برسیم ، بدین منظور ایده ای مطابق شکل زیر بیان گردید که به آن اصطلاحا UNet می گویند.


شبکه ی Discriminator :

این شبکه که وظیفه ی تشخیص دیتای واقعی ( دیتای موجود در دیتاست ) از دیتای غیر اصلی و جعلی ( تصویر تولید شده ی Generator )  را دارد ، ساختاری کانولوشنی مطابق شکل زیر داراست .

همانطور که مشاهده می کنید ورودی این واحد ، ورودی شبکه ( مثلا عکس سیاه سفید ) به علاوه عکس Unknown  ( دلیل Unknown  نامیدن این تصویر این است که نمیدانیم این عکس توسظ Generator تولید شده و یا تصویر اصلی رنگی ) می باشد .

پس بدین ترتیب شبکه ی Discriminator  سعی دارد با دریافت یک عکس سیاه سفید و یک عکس رنگی ( تولید شده ی Generator و یا عکس رنگی اصلی )  عکس های جعلی را از اصلی تشخیص دهد .

از آنجایی که این شبکه در خروجی یک تابع Sigmoid دارد و مقادیر بین 0 تا 1 برمیگرداند ، در واقع قضاوت سخت گیرانه ای دارد یعنی حتی اگر تنها یک پیکسل تفاوت مشاهده کند خروجی را نزدیک به 0 نشان می دهد ،از این رو میتوانیم در خروجی به جای داشتن یک سیگموید از یک ماتریس 30 در 30  در 1 استفاده کنیم ، که هر عدد در این ماتریس میتواند بین اعداد 0 و  1 باشد ( یعنی در واقع به جای یک سیگموید 30 در 30 عدد سیگموید داریم ) که هرعدد نزدیک به 1 و یا نزدیک به 0 در این ماتریس به ترتیب بیانگر مساوی بودن یا نبودن 70 پیکسل در تصویر مورد مقایسه است . به عبارت ساده تر اگر اولین عدد این ماتریس ( خانه ی سطر 1 و ستون 1 ) 0.9 باشد ، بیانگر یکسان بودن 70 پیکسل اول تصویر است. ( از آنجایی که 70 * 30 یعنی 2100 عددی بزرگتر از 256 که سایز تصویر ماست ، می باشد ، overlap نیز وجود خواهد داشت)


تعریف خطای شبکه ی Discriminator :

از آنجایی که این شبکه وظیفه دارد عکس تولید شده ی Generator بگیرد و واقعی یا جعلی بودن آن را تشخیص دهد ، پس این مدل باید در راستای تشخیصِ درست دیتای اصلی از دیتای تولید شده ی Generator آموزش ببیند . پس بدین ترتیب 2 خطا برای این شبکه قابل تعریف و اعمال برای به روز رسانی وزن های آن می باشد :

1) خطای ناشی از تشخیص نادرست دیتای اصلی به عنوان دیتای جعلی

2) خطای ناشی از تشخیص نادرست دیتای جعلی ( تولید شده ی Generator ) به عنوان دیتای اصلی .

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

 


تعریف خطای شبکه ی Generator

1) خطای ناشی از شکست در فریب دادن Discriminator :

با توجه به آنچه که گفته شد شبکه ی Generator باید بتواند عکس هایی تولید کند که شبکه ی Discriminator را فریب دهد ، به ظوری که شبکه ی Discriminator با گرفتن عکسی که Generator تولید می کند ،  لیبل True به معنای اصلی بودن عکس برگرداند ، پس برگرداندن هر چیزی جز 1 برای Generator  ، یک خطا محسوب می شود (چون در فریب دادن Discriminator  موفق نبوده ) و قابل انتشار در شبکه ی Generator برای به روز رسانی وزن های آن است .

2) خطای ناشی از تفاوت عکس تولید شده با عکس واقعی :

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

در شکل زیر فرایند اعمال دو خطای تعریف شده مشاهده میگردد :

 

مکانیزم توجه (Attention Mechanism) و استفاده از آن در ترجمه ماشین (Machine Translation)

این مبحث در جلسه ۱۳ام از کلاس مباحث ویژه ۲ تدریس و بررسی شده است +ویدئوی جلسه در آپارات + اسلاید‌ها

 

توجه (Attention) درواقع یک وکتور است که معمولا خروجی‌های یک لایه تمام‌متصل (Dense) با تابع فعال‌ساز Softmax است. Attention به ماشین مترجم کمک می‌کند تا تمامی اطلاعاتی که زبان مبدا دارد را بررسی کرده و کلمه خروجی را بر اساس کلمه‌ فعلی در حال کار و کل متن -یا جمله- انتخاب کند. درواقع Attention این امکان را به مترجم ماشینی می‌دهد تا در محدوده‌های محلی و عمومی متمرکز شود و عمل ترجمه را علاوه بر توجه به مکان فعلی کلمه، با در نظر داشتن کل جمله انجام دهد.

ادامه خواندن مکانیزم توجه (Attention Mechanism) و استفاده از آن در ترجمه ماشین (Machine Translation)

pix2pix & cyclegan

به نام خدا

کلاس نوت – محمد حسین نیکی ملکی
مقدمه ای بر cyclegan & pix2pix

ساختار شبکه ای pix2pix از ساختار شبکه های شرطی GAN برای ساخت دیتا ها و تبدیل و generate کردن آن هااستفاده میکند .
فرض کنید تصاویری ورودی شبکه ما باینری شده و انتظار خروجی شبکه امان هم از همان جنس دیتا رنگی rgb باشد .طبیعتا انتظار داریم که generator در اینجا یاد بگیرد که چطور رمگ امیزی کند .و همچنین discriminator هم تلاش میکند تا تفاوت بین رنگی که generator تولید کرده و رنگ اصلی به نظر صحیح که در بین دیتاست ها بوده را محاسبه کند .

ساختار generator بصورت “encoder-decoder” است و pix2pix هم تقریبا مانند همین (در شکل پایین هم میبینید ) است .

مقادیر دایمنشن های هر لایه در کنار آن نوشته شده است .در اینجا ورودی شبکه ما یک 256*256*3 است و پس از اعمال تغییرات دوباره به همان شیپ ابتدایی در خروجی باز میگردد .
در اینجا generator ورودی هارا میگیرد وبا انکودر ها مقادیرش را کم میکند ( لازم به یاداوری است که انکودر محصولی از کانولوشن و اکتیویشن فانکشن مربوطه است .) همچنین در ادامه ی مسیر هم از دیکودر برای بازگشت ز مسیر استفاده میکنیم .
نکته : برای بهبود \رفورمنس شبکه و سرعت پردازش میتونیم از شبکه unet هم به جای encoder-decoder استفاده کنیم . شبکه unet در واقع همون encoder-decoder است اما بصورت موازی هر لایه encoder را به لایه decoder مربوطه اش متصل میکند و سودش در این است که ممکن است به برخی از لایه ها احتیاجی نداشته باشیم و از آنها ب\ریم و گذر نکنیم .
Descriminator :

کار descriminator این است که دو عکس یکی از ورودی و یکی از خروجی یا عکس هدف میگیرد و تصمیم میگیرد که ایا عکس دوم توسط generator ساخته شده است یا خیر .

ساختار DISCRIMINATOR شبیه به ENCODER-DECODER به نظر میرسد اما فرق دارد .

خروجی اش یک عکس ۳۰ در ۳۰ باینری است که مشخص میکند چقدر قسمت های مختلف عکس دوم به اول شبیه هستند . در پیاده سازی PIX2PIX هر پیکسل ۳۰ در ۳۰ به یک قسمت ۷۰ در ۷۰ عکس ورودی مپ میشود .

How to train :

برای ترین این شبکه باید هم discriminator و هم generator را اموزش بدهیم .
برای اموزس دیسکریمینیتور ابتدا جنریتور خروجی را تولید میکند و دیسکریمینیتور هر دفه خروجی هارا با ورودی ها مقایسه میکند و یاد میگیرد و میتواند حدس بزند که چقدر آنها طبیعی هستند . پس وزن های دیسکریمینیتور براسا ورودی و خروجی های شبکه ی جنریتور ما تعیین میگردد .
همینطور وزن های جنریتور هم براساس خروجی های دیسکریمینیتور اپدیت میشود هر دفعه .

cyclegans :

pipx2pix میتواند خروجی های بینظیری را تولید کند . چالش اصلی در قسمت ترین است . قسمت لیبل زدن و دو عکسی برای عملیات ترینینگ باید به ورودی شبکه بدهیم به عنوان x و y .
که ممکن است کار را برا ی ما بسیار سخت و گاها غیر ممکن کند.
به خاطر همین از سایکل گن ها استفاده میکنیم .
نکته اصلی انها این است که میتوانند بر اساس معماری pix2pix هم پیاده سازی بشوند اما به شما اجازه دهند که به دو مجموعه از تصاویر اشاره کنید و فراخوانی کنید .
در اینجا بعنوان مثال فرض کنید دو دسته عکس از ساحل دارید یکی در زمان صبح و دیگری در عصر هنگام غروب . سایکل گن میتواند یادبگیرد که چگونه عکس های مربوط به صبح را به عصر تبدیل کند و برعکس بدون آنکه نیاز باشد تا بصورت یک در یک مقابل هم قرارشان دهیم . دلیل اصلی که سایکل را تا این حد قدرتمند کرده پیاده سازی این فرضیه است که بطور کامل تبدیل رفت و برگشتی صورت میپذیرد که باعث میشود هردو جنریتور هم بطور همزمان تقویت شوند .

Loss function :

قدرت سایکل گن در این است که loss function ای برای هر سایکل رفت و برگشت ست میکند و آن را به عنوان یک optimizer اضافی در مسله قرار میدهد .
در این قسمت نحوه ی محاسبه ی loss function برای generator را میبینیم :


g_loss_G_disc = tf.reduce_mean((discY_fake — tf.ones_like(discY_fake)) ** 2)
g_loss_F_dicr = tf.reduce_mean((discX_fake — tf.ones_like(discX_fake)) ** 2)


g_loss_G_cycle = tf.reduce_mean(tf.abs(real_X — genF_back)) + tf.reduce_mean(tf.abs(real_Y — genG_back))
g_loss_F_cycle = tf.reduce_mean(tf.abs(real_X — genF_back)) + tf.reduce_mean(tf.abs(real_Y — genG_back))

در این قسمت نحوه ی محاسبه ی loss function برای discriminator را بررسی میکنیم :


DY_loss_real = tf.reduce_mean((DY — tf.ones_like(DY))** 2)
DY_loss_fake = tf.reduce_mean((DY_fake_sample — tf.zeros_like(DY_fake_sample)) ** 2)
DY_loss = (DY_loss_real + DY_loss_fake) / 2
DX_loss_real = tf.reduce_mean((DX — tf.ones_like(DX)) ** 2)
DX_loss_fake = tf.reduce_mean((DX_fake_sample — tf.zeros_like(DX_fake_sample)) ** 2)
DX_loss = (DX_loss_real + DX_loss_fake) / 2

Trigger Word Detection

trigger word detection چیست؟

Trigger word کلمه ای است که با گفتن آن شروع به صحبت با voice assistant می کنیم. در حقیقت voice assistant ها در حال شنیدن صدا هستند و زمانی که ما یک trigger word خاص را می گوییم فعال می شوند.
به عنوان مثال با گفتن “?Hey Siri, what’s the weather like today”، ابزار siri متعلق به شرکت apple سعی در پیدا کردن وضعیت هوای امروز را می کند. در حقیقت ما در اینجا به نحوه ی trigger شدن اینگونه assistant ها می پردازیم.

برخی از voice assistant ها و trigger word های مربوط به آن ها را در زیر می بینیم:

ادامه خواندن Trigger Word Detection

music generation

اطلاعات کلی درباره موسیقی:

موسیقی چیست؟ به طور خلاصه موسیقی چیزی جز یک دنباله از نت های موسیقی نیست. ورودی ما به مدل، مجموعه ای از رویدادهای موسیقی / نت ها است.

تصویر بالا نمایشی از موسیقی است که به عنوان sheet شناخته می شود. در اینجا، موسیقی توسط یک دنباله از نت های موسیقی نشان داده شده است. هر نتموسیقی با یک spaceجدا شده است.

ABC Notation

نوع دیگر نت، با استفاده از abc است.که درواقع این نوع نت گذاری شامل دو بخش است:

بخش اول:

نشان دهنده meta data است.شامل:

x: نشان دهنده تعداد بخش های مختلف از لحاظ صدا در موسیقی است

T: عنوان آهنگ

M: علامت سری زمانی نواختن(time signiture)

L: طول زمانی پیش فرض نت ها

R: ژانر موسیقی

K: سر کلید

بخش دوم:

شامل نت ها به صورت abc است.

برای مثال در کلید sol:

a=la

b=si

c=do

d=re

e=mi

f=fa

g=sol

MIDI (Musical Instrument Digital Interface)

midi درواقع خودش صدا تولید نمیکند بلکه شامل یک سری از پیام ها مانند“note on,” “note off,” “note/pitch,” “pitch-bend,… است. این پیام ها توسط ابزار midi که ممکن است سخت افزاری و یا نرم افزاری باشد تفسیر می شوند.

تصویر بالا  یک موسیقی تولید شده با استفاده از Music21 که یک کتابخانه پایتون است که موسیقی فرمت MIDI تولید می کند را نشان می دهد.(درباره کتابخانه جلوتر توضیح داده شده است)

Event1: نت B را نشان میدهد.

Event2: آکورد E,A

Music generation

از آنجایی که Rnn خالی نمی تواند موسیقی قشنگی بنوازد ، ما نیاز به کلی preprocessing و postprocessing داریم.

Preprocessing: برای آنکه نت ها را دربیاورد

Postprocessing: شامل یک سری قوانین در علم موسیقی است مثل اینکه دو تا نت ممکن است پشت هم نتوانند بیایند،اما مدل rnn این دو نت را پشت هم قرار داده است.

از کتابخانه پایتونی music21 استفاده میکنیم که یک رابط ساده برای به دست آوردن نت های موسیقی فایل های MIDI را فراهم می کند. علاوه بر این، مابه اجازه می دهد که Note و Chord را ایجاد کنیم تا بتوانیم فایل های MIDI خودمان را به راحتی ایجاد کنیم. درواقع میتوان گفت یک language model است که به جای متن، نت های موسیقی را میگیرد و آن طرف هم به جای نت موسیقی تبدیل میکند به موسیقی. و درواقع یک مدل many to many  است.

shape of x بیانگر آن است که 60 تا sample داریم و 30 تا time step و 78 تا نت موسیقیایی مختلف توانسته استخراج کند.

مقدار y درواقع برعکس مقدار x می باشد که این به این دلیل است که ضرب و تقسیم های lstm به این صورت راحت تر بوده است. حالا درواقع مقدار 30 در y بیانگر time step و 60 نمایانگر mini batch می باشد.

N_values بیانگر تعداد نت های منحصر به فرد و indices_values درواقع شامل تبدیل آن 78  نت منحصر به فرد به زبان خاص خود کتابخانه است.

77: ‘S,0.250,<dd5,d1>’

شبکه:

یک one-hot 78 تایی می دهد که این one – hot در هر  time step  به یک  lstm می رود که این lstm درواقع یک softmax است. و یک a هم داریم که به hidden state ها وارد می شود و در هر time step  مقدار خروجی a(مقدار آپدیت شده)را به lstm بعدی می دهد.

ساختن model:

در این قسمت یک مدل می سازیم و train می کنیم که درواقع pattern های موسیقی را یاد میگیرد. برای انجام این کار، نیاز به ساخت یک مدل داریم که شامل X (𝑚,𝑇𝑥,78) و Y (𝑇𝑦، 𝑚، 78) است.

از LSTM با 64 تا  hidden stateاستفاده میکنیم.

حال سه object می سازیم:

reshapor ، ابعاد را 1*78 میکند.یعنی درواقع یک بعد می خواد اضافه کند.

Densor، که در واقع همان activation های softmax ای است که در شکل مدل دیده میشود.

چون در کراس نمی توانیم به روش many to many ، ترین(train) کنیم که بعد یک کاراکتر یک کاراکتر از آن سمپل گیری کنیم.درواقع در زمان تست چون many اش رو نداریم خودمون توی زمان بازش میکنیم و train میکنیم. بنابراین آبجکت lstm رو برای یک time step می سازیم و برای تایم استپ مثلا 30 تایی یه فور روی آن میزنیم. در واقع به این صورت که در تایم استپ اول activation یا  hidden_layer لایه های قبل را برابرصفر قرار میدهیم و ورودی آن را میدهیم که activation یا hidden layer برای استپ بعد رو میدهد و ورودی بعدی یا hidden state قبلیا رو بهش میدیم و وردی یا hidden state  بعدی رو میده.

یک تابع lambda تعریف کرده که در کل lambda  یک تابع بی نام است .که درواقع در این مثال یک mini batch ای است در تعداد time step در feature vector هایی که دارد است. که درواقع وقتی مثلا  t برابر 7 است ،n*78 برگردانده می شود.و وقتی n*30*78 است یعنی تمام mini batch در تایم استپ 7   را برمیگرداند.

مدل:

آرگومان ها شامل:

Tx : تعداد time step های ورودی

n_a : تعداد hidden state های lstm

n_values: تعداد نت های منحصر به فرد

X را با ابعاد Tx در n_values تعریف میکنیم. برای آنکه ورودی many بسازیم.

Hidden state های LSTM را می سازیم.a0,c0

به اندازه time step های ورودی (Tx) فور میزنیم.

lambda ای که توضیح دادیم را تعریف میکنیم در زمان t که در واقع زمان t آن زمانی هست که الان هستیم.

x مربوط به همان time step را برداشته و reshape میکنیم کهdimention  هایی برابر با mimibatch*1*78 داشته باشیم.

در مرحله بعد LSTM_cell را با مقادیر x,a,c فراخوانی میکنیم.به این صورت که a و c در مرحله اول مقداری برابر با 0  دارند و در دفعه های بعد خروجی این قسمت است.

حال مقدار a خروجی را به densor که شامل activation function است میدهیم. و خروجی آن را در outputs،append میکنیم.

حال تابع model را با a0,c0,X و خروجی outputs فراخوانی میکنیم:

حال مدل را با ویژگی های زیر می سازیم و train  میکنیم:

m برابر با تعداد time step است.

 Generating music

در generation، شبکه Lstm داریم که در واقع یک hidden state به آن پاس داده و یک رندم و یا صفر هم به عنوان ورودی به آن میدهیم، که در نتیجه آن یک softmax هفتاد هشت تایی داریم که index ماکسیمم را برداشته و یک one-hot هفتاد و هشت تایی دیگر درست کرده و آن را به عنوان ورودی به lstm بعدی می دهیم. مانند language model

در هر مرحله از sampeling، به عنوان ورودی activation  a و cell state c را از LSTM حالت قبلی ، به صورت مرحله به مرحله ارسال می شود و یک activation  خروجی جدید و همچنین cell state جدید دریافت می شود.

LSTM_cell,densor,n_values,n_a  را که قبلا تعریف کردیم که هرکدام چه هستند اما Ty بیانگر time step موزیک خروجی می باشد.

x0,a0,c0 را مانند قبل تعریف میکنیم و مقدار اولیه آنها را میتوان یا صفر گذاشت یا چند تا نت به عنوان ورودی به ان پاس داد.

به اندازه ty، فور میزنیم.که این ty درواقع می تواند مقدارهای بالاتر از مقداری که برای train داده ایم هم باشد.

در این قسمت x,a,c را به LSTM_cell میدهیم و مانند قبل a تولید شده را به densor میدهیم و خروجی آن را به outputs،append میکنیم و همچنین خروجی را به تابع one_hot میدهیم و خروجی را در x میریزیم.

تابع one_hot در music_utils تعریف شده است.

که درواقع 78  تا prediction میگیرد و argmax میزند و ایندکس بزرگترین prediction را میگیرد و دوباره one_hot 78 تایی  از آن می سازد و برای آن که dimention آن به dimention مدل جور در بیاد RepeatVector  روی آن میزنیم.

سپس inference_model  را با ورودی ها و خروجی ها میسازیم:

در مرحله بعد سه تا بردار صفر ساخته:

تابع زیر را صدا میزنیم که سه بردار بالا و inference_model را به عنوان آرگومان به آن پاس میدهیم.

تابع generate_music را بر روی inference_model صدا میزنیم.

Corpus: مجموعه 193 تا صدا به صورت

‘C,0.333,<P1,d-5>’

            abstract_grammars: لیست از grammer ها مانند:

‘S,0.250,<m2,P-4> C,0.250,<P4,m-2> A,0.250,<P4,m-2>’

            Tones:مجموعه ای صداهای منحصر به فرد:

‘A,0.250,<M2,d-4>’

            tones_indices: دیکشنری بین تن های منحصر به فرد از 0 تا 77

indices_tones: برعکس tones_indices

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

یک حلقه روی 18تا که در هر بار یک sequence صدا تولید میکند.

یک curr_chords می سازیم تا روی آن تغییرات ایجاد کرده و آن را به موزیک تبدیل میکنیم.

اضافه کردن آکورد به آکورد فعلی با آفست مناسب

حال تابع predict_and_sample  را روی inference_model صدا میزنیم تا یک sequence از صداهای مختلف ایجاد کنیم.

حال به جای A و X ، نت C را جایگذاری میکنیم.

ساده سازی و سلیس کردن

با استفاده از predicted_tones, curr_chords صدا تولید میکنیم و صداهای یکسان و نزدیک به هم را حذف میکنیم و out_stream را ساخته و روی my_music.midi صدا را ذخیره میکنیم.

 

تجربه شرکت در یکی از چالش‌‌های کگل (Kaggle)

نوشته‌شده توسط عاطفه ولی‌پور، المیرا قربانی، نفیسه داوری، مینا جی‌رودی، امیرمحمد قریشی و محمدحسن ستاریان

کگل (Kaggle) یکی از بزرگترین جامعه‌های مهندسان، محصلان و حتی شرکت‌های حوزه داده و یادگیری ماشین و یادگیری عمیق است که اصلی‌ترین و معروف‌ترین فعالیت آن بسترسازی برای برگزاری چالش‌های مختلف یادگیری ماشین است که در آن‌ها شرکت‌ها و موسسات مختلف این حوزه باهدف برطرف کردن مسائل مختلف، چالش‌هایی را تعریف می‌کنند و با در اختیار گذاشتن اطلاعات مربوط به مسئله، جوایزی را برای نفرات برتر حل‌کننده آن چالش‌ها انتخاب می‌کنند. از اقدامات دیگر کگل می‌توان به ارائه سرویس‌های محاسباتی ابری (کرنل کگل)، مجموعه داده‌های عمومی (Public Datasets) و آموزش‌های یادگیری ماشین هستند.

در این مقاله، تجربه شرکت در چالش طبقه‌بندی سوالات غیرعملی Quora را به اشتراک می‌گذاریم.

ادامه خواندن تجربه شرکت در یکی از چالش‌‌های کگل (Kaggle)

Connectionist Temporal Classification – CTC

CTC الگوریتمی است که در آموزش deep neural network ها در حوزه تشخیص گفتار و تشخیص دست خط و تشخیص عمل(action recognition) و  دیگر مسائل ترتیبی (sequence problems)  به عنوان loss function مورد استفاده قرار می گیرد. 

بطور کلی می توان گفت که CTC  قادر است تا خروجی deep neural network ها را گرفته و با محاسبه loss ، آموزش شبکه را ممکن سازد و همچین برای یک input sequence که تا به حال توسط شبکه رویت نشده خروجی تولید کند. بطور مثال برای یک ورودی صوتی بدون اینکه مشخص باشد چه کلمه ای بیان شده، کلمه را حدس بزند.

برای آشنایی  با  CTC در ادامه نحوه عملکرد آن بر روی صوت و دست نوشته بررسی خواهد شد

ادامه خواندن Connectionist Temporal Classification – CTC

Global & adaptive pooling

در شبکه های عمیق برای کاهش تعداد پارامتر ها  ازmax pooling  استفاده می شود به این صورت که بعد از چند لایه کانولوشنی ابعاد آن لایه های کانولوشنی را تغییر میدهد.

هایپرپارامتر هایی Pooling

  • stride
  • kernel size
  • average or max بودن تابع

درشبکه های عمیق و در لایه های fully connected پارامتر های این لایه ها  به سایز ورودی وابسته بود ولی در لایه های کانولوشنی تعداد پارامتر ها تنها به اندازه و تعداد فیلتر بستگی دارد. برای مثال وقتی مانند شکل زیر لایه آخر5 در 5 در 100 باشد (feature map تصویر) و به یک لایه fully connected صد تایی وصل میکنیم.اگر تصویر ورودی مقداری بزرگتر شود این لایه 100*5*5 تغییر می کند مثلا سایز آن 100*7*7 می شود ، پس تعداد وزن هایی که به نورون های لایه آخر وصل می شوند تغییر می کند.

مشکل : تعداد وزن های لایه flat  و fully conected

راه حل :  global average pooling(GAP)

روش کار

در مقاله [Lin et al., 2013. Network in network] به جای fully connected  ها در انتها global average pooling میزنیم تا future map ها را مستقیم به softmax وصل کنیم و از fully connected  استفاده نکنیم.

لایه آخر را pooling با kernel هم سایز  تصویر ورودی (activation map) میذاریم تا درانتها تنها یک کانال باقی بماند، یعنی طول و عرض هرچه باشد 1 شده و عمقش همان باقی می ماند. حال همین لایه را مستقیم به fully connected وصل می کنیم.

ResNet50 هم به صورت غیر مستقیم از average pooling استفاده کرده. به این صورت که لایه pooling آخرش اندازه خروجی (2048 * 1* 1) شده است ولی از  fully connected ها هم برای کلاس بندی انتهایی استفاده کرده است.

بررسی لایه های آخر  ResNet50

در لایه های انتهایی شبکه به دلیل وجود , Activation ، AveragePooling2D و لایه Dense  برای ما مهم هستند.

  • ابتدا  لایه activation  را بررسی می کنیم؛ این لایه شامل2048  نقشه فعال سازی (activation map )  که سایز آن (7 * 7) است، می باشد.در تصویر بالا k  همان تعداد activation map ها است.

k ={1, 2, 3, …., 2048}

  • لایه (GAP) AveragePooling2D   سایز هر کدام از این  activation map   ها را از (7 * 7) به (1 * 1) کاهش می دهد.
  • لایهDense  که صرفا ورودی را صاف کرده و بدون تغییر در اطلاعاتی که در لایه قبلی GAP ایجاد شده است  تنها دسته یا کلاس آن خروجی را مشخص می کند. حال برای اینکه شبکه هایی که طراحی می کنیم به سایز ورودی وابسته نباشند می توان از این لایه صرف نظر کرد و لایه GAP  را مستقیما به softmax  متصل کرد.

مزایا :

  • متناسب تر با شبکه های کانولوشنی است. زیرا با  ساختار convolution ها بیشتر دارد.  fully connected ساختار کانولوشن را به هم می ریزد. ارتباط بین دسته بندی لایه آخر و  feature map  ها حفظ می کند.
  • از overfitting جلوگیری می کند. : هیچ پارامتری برای بهینه سازی ندارد واز  overfitting  هم دراین لایه جلوگیری می کند. و می توان با کانولوشن بیشتر ، کاری کنیم عمق افزایش یافته و داده کمتری از دست برود.
  • به جابجایی حساس نیست. : نسبت به جابجایی های تصویر عملکرد بهتری دارد. مثلا شبکه ایی برای شناسایی سگ داریم و دیگر جایگاه سگ در هرجای تصویراهمیتی ندارد.

 

استفاده از global average pooling   در framework  های مختلف

در keras کد global average pooling  به صورت زیر است که تنها dataform را میگیرد و سایز ورودی نمی خواهد چون نسبت به سایز activation map سایز آن را انتخاب میکند.

 

pytorch

از بخوایم global pooling در pytorch داشته باشیم adaptivePooling با سایز یک را صدا میزنیم. اینگونه عمل می کند که سایز خروجی رابهش به عنوان پارامتر می دهیم.

 

 

fastai

به این صورت پیاده سازی شده است که AdaptiveAvgPool2d و AdaptiveMaxPool2d   را صدا میزند و خروجی این دو تابع را بهم متصل می کند.

 

مسئله : تشخیص نژاد های مختلف سگ

دیتا شامل پوشه عکس ها و یک فایل اکسل شامل نام عکس و نژادش است.

در کد بالا آدرس پوشه عکس ها را داده خط 2 سایز ورودی را مشخص کرده در خط 3 شبکه را resnex124 تعریف کرده ایم و خط 4  batch size رو هم 58 گذاشتم.

(اگر روی gpu کارکنید و 2 یا 3 گیگ رم دارید احتمالا باید تعداد batch size   را کم کنید.)

لیبل ها را از فایل csv خونده واون label  باز کن و لیستش کن و طول اون لیست رو به ما بعده منهای یک برای جدا کردن هدر لیست  که همان تعداده داده های ماست، توسط تابع get_cv_index(n)   ایندکس های cross validation را جدا می کند اینگونه که 20 درصد index ها را برای cross validation  جدا میکند.

 

 

کد بالا نشان می دهد تا اینجا دو پوشه train و test همراه با label ها جدا شده است.

فایل csv را با پاندا خونده و 5تای اولشو نمایش می دهد.

تعداد هر کلاس را پیدا کرده ایم.

تابع pivot_table   :

 

به تابع tfms_from_model معماری ، سایز ورودی، ارگومیشن هم میخواهیم به صورت side_on ، بیشترین زوم هم 1.1 باشه بر روی تصاویر(چقدر روی عکس هربار رندوم زون کند)

تابع ImageClassifierData.from_csv می گوید از همان ساختاری که عکس های توی یک پوشه هستند و لیبل ها در  csv استفاده  کن. مسیر پوشه ها و اسم پوشه های train و test  را گرفته و اگر valdation_index  بهش پاس بدیم توی train_set اونا رو در نظر نمیگیره. توی اکسل پسوند اسم عکس ها وجود نداشته و به عنوان suffix پسوند پاس داده شده.

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

سایز سطر و ستون را جدا کرده و به صورت هیستوگرام نمایش می دهد. که هیستوگرام نشان می دهد بیشتر تصاویر سایزی در اندازه 500 تا 1000 و کمتر از هزار هستند. پس تصاویر من در اندازه های بزرگ اند.

تابع فوق  داده ها را برمیگرداند با سایز تصویر و batch size ورودی دلخواه. هروقت تابع صدا شود یک trasformation میزند و سپس تصاویر را به اندازه batch size در متغییر data ریخته و در انتها قبل از بازگردانی تصاویر کوچکتر از 300 را ابتدا به 340 تبدیل کرده و سپس در پوشه tmp ذخیره میکند که حداقل تغییر اندازه از 340 باشد به اون سایز که cashing یک بارانجام شده باشد تا در تغییر اندازه تصاویر خیلی بزرگ به سایز کوچک overhead کمتری داشته باشیم و سرعت افزایش بیابد.(چون میخواهیم هر epoch را با یه سایزی پیش بریم)

 

از ConvLearner  متد pretrained را صدا زده و معماری و داده و پارامتر precompute هم true قرار میدهد.

متدpretrained  درای پارامتر ps است که بیانگر احتمال dropout است.

(در هنگام اجرای کد بالا با خطا مواجهه شدید وزن هارا دانلودکرده و در پوشه اشاره شده قرار دهید.)

 

با learning rate  ده به توان منفی 2 ، به تعداد 5 epoch می زند. با سایز وردوی 224 در 224

precompute را false کرده تا data argumation ما فعال بشه.

 

cycle_len= 1  بیانگر این است که یکی   یکی بره بالا

با set_data شبکه رو آگاه! میکنه که سایز عکس قراره تغییرکنه. سپس شبکه را فیریز می کند.

 

 

دیده می شود که بعد از adavtivePooling سایز ورودی از 2048 به سایز 4069 تغییر یافته است.

باTTA() می خواهد ببیند که می توان validation را بهتر کرد ..

مدل را ذخیره می کند.

مقدمه‌ای بر سیستم‌های توصیه‌گر (Recommender System)

سیستم‌های توصیه‌گر (Recommender Systems) با تحلیل رفتار کاربر، اقدام به پیشنهاد مناسب‌ترین اقلام (داده، اطلاعات، کالا و…) میکنه. این سیستم کمک زیادی به مشکلات سیستم‌های دارای حجم زیاد اطلاعات می‌کنه و به کاربرش کمک می‌کنه تا در بین حجم زیاد اطلاعات سریع‌تر به هدفش نزدیک بشه.

+ ویدیو آموزشی این مطلب

+ کد ها در Jupyter Notebook

مقدمه:

فرض کنید یک سایت شبیه GoodReads داریم که کاربران میتونند در مورد کتاب های مختلف در سایت نظرشونو بنویسند. ما اطلاعاتی در مورد اینکه هر کاربر به چه کتابی چه امتیازی داده داریم، فرض کنید کاربر الف به کتاب های a , b , c رای بالا داده، و ما میخوایم پیش‌بینی کنیم این کاربر به کتاب d احتمالا چه امتیازی میده، برای این‌کار با تحلیل داده‌های بقیه کاربرهایی که امتیازشون به a, b , c شبیه کاربر الف بوده میشه فهمید احتمالا کاربر الف به کتاب d چه امتیازی میده.

ادامه خواندن مقدمه‌ای بر سیستم‌های توصیه‌گر (Recommender System)

مقدمه ای بر شبکه‌های مولد تخاصمی (Generative Adversarial Networks)

یادگیری بدون نظارت (Unsupervised Learning)
همان‌طور که پیش‌تر بحث شده بود، یکی از حوزه های یادگیری ماشین، یادگیری بدون نظارت است که در آن داده‌ها برچسب ندارند. در یادگیری بدون نظارت هدف اصلی، یادگیری ساختار داده‌ها می‌باشد.

 

ادامه خواندن مقدمه ای بر شبکه‌های مولد تخاصمی (Generative Adversarial Networks)