<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های فائزه ثقفی</title>
        <link>https://virgool.io/feed/@faeze_saghafi</link>
        <description>برنامه نویس پایتون، عاشق کتاب، فیلم، روزنوشته و ... محمدحسین</description>
        <language>fa</language>
        <pubDate>2026-06-16 11:05:45</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/9532/avatar/7uHnIr.jpg?height=120&amp;width=120</url>
            <title>فائزه ثقفی</title>
            <link>https://virgool.io/@faeze_saghafi</link>
        </image>

                    <item>
                <title>پیش بینی کرایه تاکسی با استفاده از شبکه عصبی - قسمت چهارم</title>
                <link>https://virgool.io/@faeze_saghafi/full-ann-code-along-regression-and-classification-part4-pu83ilenrqgc</link>
                <description>برای اینکه بفهمید چی به چیه برید قسمتهای اول و دوم و سوم رو بخونین. توی این قسمت میخوایم از مدلمون یه instance بسازیم و حلقه train رو بنویسیم.برای ساخت یک نمونه از کلاس که کدش رو در قسمت قبل نوشتیم اول از همه برای تولید اعداد تصادفی یه seed برای torch ست میکنیم. و بعد یه ابجکت از کلاس TabularModel میسازیم. torch.manual_seed(33)
model = TabularModel(emb_szs, conts.shape[1], 1, [200,100], p=0.4)ورودی های کلاس همونطور که در قسمت قبل دیدیم. emb_szd تاپلهایی بود که اندازه متغیرهای categorical و سایز امبدینگهامون رو داشت. conts.shape[1] تعداد متغیرهای عددیمون بود. آرگومان بعدی سایز خروجی هست که گفتیم 1 میذاریم چون فقط میخوایم یه عدد رو پیش بینی کنیم. [100,200] تعداد نورونهای لایه های شبکه هست. ینی شبکه ما دو لایه داره. در لایه اول 200 نورون و در لایه دوم 100 تا نورون داره. و اون p هم نرخ دراپ اوت هست که برای لایه های شبکه عدد 0.4 رو ست میکنیم. مدلمون رو مرور کوچولو بکنیم :همونطور که میبینین یه مدل داریم که لایه هاش عبارتند از یه لایه 200 تایی بعد یه لایه 100 تایی و در نهایت هم یه لایه 1 نورونی مرحله بعدی تعریف criterion و optimiser هست:criterion = nn.MSELoss()  
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)برای criterion از MSELoss (میانگین مربع خطا) استفاده میکنیم. برای optimizer هم از Adam . آرگومان اولش که پارامترهای مدل هست و ارگومان دوم کهlearning rate مقدارش رو 0.001 میدیم. مرحله بعدی جداسازی دیتای train و test هست. که چون ما از اول داده های categorical و continius یا عددی رو جدا کردیم، اینجا هم همینکار رو میکنیم:batch_size = 120000
test_size = int(batch_size * .2)
cat_train = cats[:batch_size-test_size]
cat_test = cats[batch_size-test_size:batch_size]
con_train = conts[:batch_size-test_size]
con_test = conts[batch_size-test_size:batch_size]
y_train = y[:batch_size-test_size]
y_test = y[batch_size-test_size:batch_size]البته یادمون باشه که قبل از اسپیلیت باید یه دور دیتا رو شافل کنیم. مثلا انگار که بر بزنیم دیتا رو تا هیچ الگو یا سوگیری نداشته باشه.حالا رسیدیم به قسمت اصلی کار یعنی حلقه train :import time
start_time = time.time()
epochs = 300
losses = []
for i in range(epochs):
      i+=1
      y_pred = model(cat_train, con_train)
      loss = torch.sqrt(criterion(y_pred, y_train)) # RMSE
      losses.append(loss)
      if i%25== 1:
          print(f&#039;epoch: {i:3}  loss: {loss.item():10.8f}&#039;)
          optimizer.zero_grad()
          loss.backward()
          optimizer.step()

print(f&#039;epoch: {i:3}  loss: {loss.item():10.8f}&#039;)
print(f&#039;\nDuration: {time.time() - start_time:.0f} seconds&#039;)اون time رو صرفا برای این گذاشتم که مدت زمان رو چک کنم. تعداد epoch ها رو 300 قرار میدیم و داخل حلقه loss ها رو محاسبه میکنیم و اخر از همه هم چاپش میکنیم. اون if رو برای این گذاشتیم که lossهای epochها رو هر 25 تا یه بار چاپ کنهخروجی کار رو میبینین:نمودار loss بر حسب epoch رو که رسم کنیم روند نزولی اش رو میتونین ببینین:حالا چون که مرحله train مون تموم شد و دیگه نمیخوایم وزنها و پارامترهامون رو بهتر کنیم میایم torch.no_grad رو صدا میکنیم و مدل رو روی دیتای test اجرا میکنیم و loss اش رو درمیاریم:with torch.no_grad():
         y_val = model(cat_test, con_test)
         loss = torch.sqrt(criterion(y_val, y_test))
print(f&#039;RMSE: {loss:.8f}&#039;)مقدار lossچون پایتورچ متد mseاش جذر رو نگرفته خودمون دستی مجذور رو هم محاسبه میکنیم. این عدد 3.34 یعنی اینکه کرایه های پیش بینی شده ما به طور میانگین 3.34 تا از واقعی ها کمتر یا بیشتر هستند. حالا بیاید کرایه های پیش بینی شده امون رو خودمون ببینیم.حالا بیاید مقدار واقعی کرایه و مقداری که ما پیش بینی کردیم رو با هم مقایسه کنیم:print(f&#039;{&amp;quotPREDICTED&amp;quot:&gt;12} {&amp;quotACTUAL&amp;quot:&gt;8} {&amp;quotDIFF&amp;quot:&gt;8}&#039;)
for i in range(50):
       diff = np.abs(y_val[i].item()-y_test[i].item())
print(f&#039;{i+1:2}. {y_val[i].item():8.4f} {y_test[i].item():8.4f} {diff:8.4f}&#039;)کاری که اینجا میکنیم اینه که اول به چیزی که میخوایم چاپ کنیم یه فرمتی میدیم و 8 تا space فاصله بینشون میندازیم. بعد قدر مطلق تفاضلشون رو چاپ میکنیم. بعد هم فرمت چاپ اعداد رو 4تا عدد بعد از ممیز میذاریممیبینین که بعضی جاها خوب پیش بینی کردیم و بعضی جاها هم اصلا خوب نیست و خیلی تفاوتشون هست. میتونیم اخر کار این مدل با این وضعیت پارامترها و ... رو ذخیره کنیم و برای یه دیتای دیگه ازش استفاده کنیمtorch.save(model.state_dict(), &#039;TaxiFareRegrModel.pt&#039;)حالا شما میتونین یه نقطه جدید برای سوار شدن مسافر و پیاده شدنش بهش به این مدل بدین و ازش بخواین که کرایه رو پیش بینی کنه.خلاصه که همین.در قسمت بعد میریم سراغ classification و میبینیم که با همین دیتا چه طوری یه مسئله دسته بندی رو حل میکنیم. </description>
                <category>فائزه ثقفی</category>
                <author>فائزه ثقفی</author>
                <pubDate>Tue, 27 Feb 2024 03:28:55 +0330</pubDate>
            </item>
                    <item>
                <title>پیش بینی کرایه تاکسی با استفاده از شبکه عصبی - قسمت سوم</title>
                <link>https://virgool.io/@faeze_saghafi/full-ann-code-along-regression-and-classification-part3-cmlgjskfofom</link>
                <description>اگه تا اینجای کار اومدین معلومه که حتما این آموزشها براتون خوب بوده و یه سطحی از دانش شبکه های عمیق رو دارین و خوندن بخش های قبلی این آموزش ازتون وقتی نمیگیره. پس برین قسمت اول و قسمت دومش رو هم بخونین و سریع برگردین.توی قسمت قبل تا اینجا اومدیم که یه سری پیش پردازش اولیه دیتا رو انجام دادیم و از دیتاهای ورودی و لیبلها امبدینگ ساختیم. اگه قسمت قبل رو دیده باشین دو سری امبدینگ از ورودیها ساختیم. دیتاهای categorical جدا و دیتاهای عددی هم جدا. شما باید با این مفهوم امبدینگ (Embedding) آشنایی داشته باشین که میتونین از اینجا و اینجا با مفهوم اصلی آشنا بشین و از اینجا هم لایه امبدینگ پایتورچ رو توضیح داده. این هم خوبه. ببینین امبدینگ ساختن از دیتای ورودی شبکه یه مرحله خیلی مهم از ساخت مدلهای دیپ لرنینگ هست. مخصوصا اگه دیتامون متنی باشه. ولی اینجا که ما از دیتای عددی داریم استفاده میکنیم یه کم قضیه فرق میکنه. وقتی میخوان ساخت امبدینگ از دیتای متنی رو توضیح بدن، اولین و بدیهی ترین روش onehot هست که معمولا زود از روش رد میشن چون خیلی بیخود و بیمزه است. ولی اینجا ما ازش استفاده میکنیم. اول اینکه میخوایم ساده باشه و دوم اینکه ساختارش برامون مهم نیست. و از همون لایه امبدینگ پایتورچ استفاده میکنیم. ایده کلی وان هات اینه که یه جدولی میسازه (یا مثلا برای دیتای متنی شما یه چیزی شبیه دیکشنری فرض کن) بعد به مقادیرش یه ایندکسی میده و اون ایندکس ها رو تبدیل به بردار میکنه. ( اگه نفهمیدین ببخشین. خیلی ساده و مسخره اس. خودتون برید بخونین. منم بعدا یه پست راجع به لایه embedding در پایتورچ مینویسم) برای شروع کار میایم برای بردارهای امبدینگمون سایز در نظر میگیریم.cat_szs = [len(df[col].cat.categories) for col in cat_cols]
emb_szs = [(size, min(50, (size+1)//2)) for size in cat_szs]
emb_szsالان اینجا اومدیم سایز بردار امبدینگ رو نصف تعداد ورودی های منحصر به فرد به ازای هر فیچر در نظر میگیرن. الان emb_szs سه جفت عدد هست. به ازای سه تا فیچر categorical مون. و اندازه امبدینگهای مربوط به هر کدوم هم نصف مقادیرش در نظر گرفتیم. 24 تا برای hour . برای AMorPM هم 2 تا . برای Weekday هم 7 تا . اگه بیشتر از 50 بود هم که ولش کن و عدد 50 رو ست کن. اون // هم برای اینه که نتیجه تقسیم بر 2 رو اعشاری نکنه و جزء صحیحش رو بهمون بده.ساخت مدل Tabularدیتاستها از فیچرهای مختلفی تشکیل شدن. انواع داده ها در اون ها موجوده. داده های عددی و categorical و غیره. به این مدل دیتاستها معمولا میگن داده های جدولی یا tabular . برای کار با این دیتاستها میان مدلهای tabular میسازن. ساخت مدلهای tabular یه روال مشخصی داره که اینجا باهاش آشنا میشیماین مدلمون هست که مرحله به مرحله اش رو براتون توضیح میدم:class TabularModel(nn.Module):
        def __init__(self, emb_szs, n_cont, out_sz, layers, p=0.5):
               super().__init__()
               self.embeds = nn.ModuleList([nn.Embedding(ni, nf) for ni,nf in emb_szs])
               self.emb_drop = nn.Dropout(p) 
               self.bn_cont = nn.BatchNorm1d(n_cont)
               layerlist = []
               n_emb = sum((nf for ni,nf in emb_szs))
               n_in = n_emb + n_cont
               for i in layers:
                     layerlist.append(nn.Linear(n_in,i))
                     layerlist.append(nn.ReLU(inplace=True))
                     layerlist.append(nn.BatchNorm1d(i))
                     layerlist.append(nn.Dropout(p))
                     n_in = i
               layerlist.append(nn.Linear(layers[-1],out_sz))
               self.layers = nn.Sequential(*layerlist)
        def forward(self, x_cat, x_cont):
               embeddings = []
               for i,e in enumerate(self.embeds):
                     embeddings.append(e(x_cat[:,i]))
               x = torch.cat(embeddings, 1)
               x = self.emb_drop(x)
               x_cont = self.bn_cont(x_cont)
               x = torch.cat([x, x_cont], 1)
               x = self.layers(x)
               return xبرای ساخت مدلهای شبکه عصبی با استفاده از پایتورچ از کلاس nn.module ارث بری میکنیم. این کلاس دو تا متد مهم داره. متد init یا سازنده و متد forward . کار مهمی که توی متد سازنده انجام شده یکی محاسبه سایز ورودی شبکه اس که مجموع سایز امبدینگ های فیچرهای categorical هست به علاوه فیچرهای عددی :n_emb = sum((nf for ni,nf in emb_szs))
n_in = n_emb + n_contو دومی تعریف اجزای لایه های شبکه است. تعداد لایه ها رو هم از ورودی و هنگام تعریف آبجکت مشخص میکنیم:layerlist = []
for i in layers:
      layerlist.append(nn.Linear(n_in,i))
      layerlist.append(nn.ReLU(inplace=True))
      layerlist.append(nn.BatchNorm1d(i))
      layerlist.append(nn.Dropout(p))
      n_in = ilayerlist.append(nn.Linear(layers[-1],out_sz))
self.layers = nn.Sequential(*layerlist)همونطور که میبینین هر لایه تشکیل شده از یک لایه linrear به اندازه ای که بالا محاسبه کردیم. ینی 12+1+4+6 که این 6 تعداد فیچرهای عددی مون بود. بعد از لایه پرسپترون تابع فعالسازی میذاریم. بعد یه لایه نرمالیزاسیون و بعد هم دراپ اوت.  آخر از همه هم یه لایه linear دوباره اضافه میکنیم به عنوان لایه خروجی که اندازه اش رو از ورودی میگیریم. حالا چون مسئله امون رگرسیون هست و میخوایم یه عدد کرایه رو پیش بینی کنیم out_sz رو 1 میذاریم. بعد هم لیستی که ساختیم رو به nn.Sequential میدیم و self.layers میشه ساختار شبکه ما.یه layers هم ورودی سازنده بود که تعداد لایه ها بود و این با اون فرق داره. سه تا متغیر دیگه هم داریم : self.embeds ، self.emb_drop و self.bn_cont . که اینا جزو ساختار شبکه ما نیستن و بعدا در تابع forward ازشون استفاده میکنیم. داخل متد forward هم میایم دیتا رو اول میدیم به لایه امبدینگ که ساختیم. بعد میدیم به dropout . بعد از نرمالیزاسیون رد میکنیم. بعد همه رو ادغام میکنیم با هم. و آخرش میدیم به شبکه مون و خروجی اش رو میگیریم.def forward(self, x_cat, x_cont):
     embeddings = []
     for i,e in enumerate(self.embeds):
           embeddings.append(e(x_cat[:,i]))
      x = torch.cat(embeddings, 1)
      x = self.emb_drop(x)

    x_cont = self.bn_cont(x_cont)
    x = torch.cat([x, x_cont], 1)
    x = self.layers(x)
    return xالان این شد tabular model ما . که اگه دفه اولتون هست یه کم گیج میشین ولی به قول جادی خوبه که گیج بشین. ینی دارین چیز میزای جدید یاد میگیرین. پس یکی دو بار دیگه بخونین اوکی میشه همه چی. این مدلی که نوشتیم برای کار با  هر نوع دیتاست جدولی دیگه ای هم اوکیه و میتونین با دیتاست های دیگه هم تست کنین. حالا بیاید بریم سراغ train مدل  :)</description>
                <category>فائزه ثقفی</category>
                <author>فائزه ثقفی</author>
                <pubDate>Sun, 25 Feb 2024 02:17:50 +0330</pubDate>
            </item>
                    <item>
                <title>پیش بینی کرایه تاکسی با استفاده از شبکه عصبی - قسمت دوم</title>
                <link>https://virgool.io/@faeze_saghafi/full-ann-code-along-regression-and-classification-part2-kmuwtw5xcaks</link>
                <description>توی قسمت اول این آموزش اومدیم یه مثال ساده تعریف کردیم برای خودمون برای تمرین رگرسیون با دیتاست NYCTaxiFares و یه سری پیش پردازشهای اولیه روی دیتا انجام دادیم. توی این قسمت میخوایم یه ذره حرفه ای تر کار کنیم و توی کار با دیتامون عمیقتر بشیم.یه مفهوم اولیه ای که در مورد داده ها وجود داره تعریف انواع اونهاست.مثلا داده های اسمی، عددی گسسته، عددی پیوسته، boolean ، categorical و غیره. اگه میتونین اینجا رو بخونین.مثلا اسم رنگها میتونه یه متغیر اسمی باشه، نمره آدما توی هر درسی میتونه عددی پیوسته باشه. اینکه مبتلا به یه بیماری هستن یا نه داده بولین هست. یه نوع داده ی خیلی پرکاربرد داده های دسته بندی یا categorical هستن. که خب خیلی پراستفاده ان . وقتی مقادیر یه فیچر جوریه که میشه دیتا رو برحسب اون دسته بندی کرد بهش میگیم categorical . حالا جنسش میتونه هر چی باشه. string باشه، تاریخ باشه، یا حتی عدد باشه. منتها فرق این عدد با نوع داده عددی چیه؟ دیگه نمیشه کارای آماری روش انجام داد. مثلا رتبه بندی. مثلا نمیتونی میانگین رتبه آدما رو بگیری. بیمعنی میشه. یه چیز خوبی که این متغیرهای categorical دارن اینه که میشه روشون groupby زد با پانداس. و پلات کشید و خلاصه که چیزای خوبین :)حالا بیاید دیتای categorical رو از دیتای عددی جدا کنیم که برای مرحله بعد بهش احتیاج داریم.تا اینجای کار ستونهایی که داریم چیا هستن:df.columnsتاریخ و ساعت سوار کردن مسافر، مقدار کرایه، دسته بندی کرایه، مختصات سوار کردن و پیاده کردن مسافر، تعداد مسافرها، مسافت طی شده، ساعت به وقت نیویورک، ساعت، صبح و بعدازظهر بودن و روز هفته. الان متغیرهای categorical ما کدومان؟ ببینین . &#x27;fare_amount&#x27;, &#x27;fare_class&#x27; که بیشتر لیبل هستن و بعدا باهاشون کار داریم. &#x27;dist_km&#x27; هم که یه متغیر عددیه. چون مثلا میتونیم روش min و max بگیریم. یا مثلا &#x27;passenger_count&#x27;حالا ولی متغیرهایی مثل &#x27;AMorPM&#x27; و &#x27;Weekday&#x27; بیشتر به categorical میخورن چون میشه طبق اونها یه دسته بندی ای انجام داد. حالا پس بیاید یه متغیر جدید تعریف کنیم و اسم ستونهای categorical رو توش ذخیره کنیم. لیبلها رو جدا و متغیرهای عددی رو هم جدا سیو کنیم. cat_cols = [&#039;Hour&#039;, &#039;AMorPM&#039;, &#039;Weekday&#039;]
cont_cols = [&#039;pickup_latitude&#039;, &#039;pickup_longitude&#039;, &#039;dropoff_latitude&#039;, &#039;dropoff_longitude&#039;, 
passenger_count&#039;, &#039;dist_km&#039;]
y_col = [&#039;fare_amount&#039;]یه چیزی که جادی خیلی توی اموزشهای ماشین لرنینگش میگفت data experts بود. ینی کسانی که با دیتا آشنایی دقیقتر و بهتری دارن. ینی تشخیص داده ی عددی از categorical به این آسونیا نیست . گاهی توی یه پروژه یه دیتایی بهتون میدن که شما تا حالا به گوشتون هم نخورده و این متخصصهای داده هستن که بهتون میگن مثلا این فیچر عددیه یا چی.اگه از من میشنوین سعی کنین خودتون توی پروژه ها سریع آشنایی پیدا کنین با فضای کار و مسئله و خیلی سیس پیور دیولوپر ( pure developer ) برندارین چون برچسب خنگی روتون میمونه :)حالا چرا اینکار رو کردیم ؟ تا بتونیم با این مقادیر categorical کار کنیم. و برای اینکار باید تبدیلشون کنیم به عدد. ینی اینکه به am یا pm توی ستون AMorPM عدد تخصیص بدیم. کلا باید همه داده ها با هر نوعی رو به عدد تبدیل کنیم. این یکی از مراحل اولیه پیش پردازش دیتاس.حالا بیاید یه بار دیگه به انواع داده هامون یه نگاه بندازیم :df.dtypesمیبین که ستونهای categorical مون از نوع string هستند (object) و عددی ها float اند. پانداس یه نوع داده داره به اسم category . میایم تایپ اون سه تا ستون رو میذاریم category تا بتون از متدهای به دردبخور پانداس استفاده کنیم:for cat in cat_cols:
      df[cat] = df[cat].astype(&#039;category&#039;)با استفاده از متد astype نوع فیچرهایی که توی متغیر cat_cols ذخیره کرده بودیم رو گذاشتیم category . حالا نوع داده های دیتافریممون رو میبینیم که تغییر کرده :حالا بیاید ببینیم با تغییر نوع فیچرها از string به category مقادیرشون چی شد:df[&#039;AMorPM&#039;].head()خب میبینید که مقادیر موجود در این category فقط دو تا هست : am و pm .دو تا فیچر باقیمونده هم همینه. خودتون تست کنین. حالا مثلا یه چیزی که با تبدیل نوع داده به category اولین کار اینه که به ازای مقادیر یونیک ایندکس داریم. ینی الان برای am و pm مقدار  0 و 1 ست شده :df[&#039;AMorPM&#039;].head().cat.codesتبدیل دیتای جدولی به تنسورحالا بیاید از این مسخره بازیا رد بشیم و یه ذره موآپ کنیم. بیاید با استفاده از دیتای کتگوریکال ( از تغییر زبان کیبردم خسته شدم ) یه تنسور بسازیم. بعدا از این تنسور به عنوان امبدینگ دیتای ورودی به شبکه استفاده میکنیم.hr = df[&#039;Hour&#039;].cat.codes.values
ampm = df[&#039;AMorPM&#039;].cat.codes.values
wkdy = df[&#039;Weekday&#039;].cat.codes.values
cats = np.stack([hr, ampm, wkdy], 1)
cats[:5]اون 1 مقدار متغیر axis هست. توی متد stack مشخص میکنه ارایه ها سطری با هم ترکیب بشن یا ستونی . حالا برای تبدیل این ماتریس 3 در 120000  به تنسور خیلی ساده مینویسیم : conts = torch.tensor(cats, dtype=torch.float)این استک کردن آرایه های مقادیر رو میتونیم توی خط هم انجام بدیم. بنابراین برای مقادیر عددی پیوسته ساده تر مینویسیم : conts = np.stack([df[col].values for col in cont_cols], 1)
conts = torch.tensor(conts, dtype=torch.float)
conts[:5]آرایه cont_cols رو بالا تعریف کردیم و لیست فیچرهای عددی مون بود. ورودی متد stack رو ببینیند یه حلقه یه خطی نوشتیم برای فیچرهای عددی داخل لیست و valueهای داخلش رو گرفتیم. استک کردیم به صورت ستونی. در نهایت هم که ازش که تنسور ساختیمحالا بیاید لیبل ها رو تنسور کنیم : y = torch.tensor(df[y_col].values, dtype=torch.float).reshape(-1,1)
y[:5]این قسمت reshape(-1,1) برای اینه که مطمئن بشیم تنسور به صورت ستونی ذخیره شده و نه یک آرایه فلت ساده. ینی هر سطرش یه مقدار داره و 120000 تا سطر داره. خب این هم از این. تا اینجای کار فقط پیش پردازش دیتا انجام دادیم. از قسمت بعدی میریم سراغ طراحی شبکه که اون هم خیلی ساده است. </description>
                <category>فائزه ثقفی</category>
                <author>فائزه ثقفی</author>
                <pubDate>Wed, 21 Feb 2024 04:25:09 +0330</pubDate>
            </item>
                    <item>
                <title>پیش بینی کرایه تاکسی با استفاده از شبکه عصبی</title>
                <link>https://virgool.io/@faeze_saghafi/full-ann-code-along-regression-and-classification-c4hxsudsqsq5</link>
                <description>بیاید امروز بعد از مدتها براتون یه مثال ساده از پایتورچ بزنم که هم خودم چیزایی که یاد گرفتم تثبیت بشه هم شاید یه کسی واسه یه تمرین کلاسی کارش راحت تر بشه :)پروژه کوچیک امروز یه مثال ساده برای رگرسیون هست. اینکه ما بیایم با استفاده از یه شبکه عصبی چند لایه روی دیتاست NYCTaxiFares کرایه تاکسی رو پیش بینی کنیم. درواقع این دیتاست NYCTaxiFares یه داده جدولی هست که فیچرهاش مشخصات یه سفر درون شهری مثل زمان سوارکردن مسافر و پیاده کردنش یا مثلا مختصات سوار کردن و پیاده کردنش هست و لیبلش هم کرایه دریافتی هست. برای شروع کار بیاید importهامون رو انجام بدیم : import torch
import torch.nn as nn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inlineهمونطور که میدونین torch و قسمت torch.nn و numpy و pandas که از ملزومات کار با شبکه های عصبی و کار با دیتاست ها هستند. شاید بعدها یه سری اموزش برای numpy و pandas گذاشتم. کتابخونه matplotlib هم که برای رسم نمودار و ایناس. اون تیکه آخر matplotlib inline % هم برای اینه که پلاتها در محیط نوت بوک درست نمایش داده بشن.مرحله بعد لود کردن دیتاسته. برید از آدرسی که بالا گذاشتم فایل csv اش رو دانلود کنین. اگه کگل فیلتر بود (چون گاهی نصفه نیمه بالا میاد) خودتون سرچ کنین و فایلش رو دانلود کنین.پیشنهاد منم اینه فایلش رو بیارید کنار کدتون. از جای دیگه لود نکنین . کثیف کاریه .  بعد با پانداس دیتافریم رو لود کنین: df = pd.read_csv(&#039;NYCTaxiFares.csv&#039;)حالا اگه بخوایم یه ذره بازی کنیم با این دیتافریممون، میتونیم یه ذره دستکاریش کنیم. مثلا بیایم فاصله دو نقطه سوار شدن و پیاده شدن مسافر رو با استفاده از مختصاتش حساب کنیم و به جدول اضافه کنیم. چون اینجوری ربط کرایه دریافتی با مسافت طی شده بهتر مشخص میشه. به اینکار میگن feature engineering برای محاسبه فاصله دو نقطه روی کره زمین از فرمول هاورساین استفاده میکنیم : Haversine formulaپیاده سازیش هم به این صورته :def haversine_distance(df, lat1, long1, lat2, long2):
     r = 6371 # average radius of Earth in kilometers
     phi1 = np.radians(df[lat1])
     phi2 = np.radians(df[lat2])
    delta_phi = np.radians(df[lat2]-df[lat1])
    delta_lambda = np.radians(df[long2]-df[long1])
    a = np.sin(delta_phi/2)**2 + np.cos(phi1) * np.cos(phi2) * np.sin(delta_lambda/2)**2
    c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a))
    d = (r * c) # in kilometers
    return dپس میایم مختصات سوارشدن و پیاده شدن مسافر رو از جدول برمیداریم و فاصله اشون رو حساب میکنیم و بعد توی یه ستون به دیتافریم اضافه میکنیم :df[&#039;dist_km&#039;] = haversine_distance(df,&#039;pickup_latitude&#039;, &#039;pickup_longitude&#039;, &#039;dropoff_latitude&#039;, dropoff_longitude&#039;)
df.head()و اینجوری دیتافریممون این شکلی میشه:ستون dist_km رو اضافه کردیم به جدول اگه بیایم یه ()df.info روی دیتاست بگیریم. میبینیم که تایپ ستون pickup_datetime از جنس object هست. درواقع به شکل string ذخیره شده. میتونیم اون رو تبدیل به datetime پانداس کنیم و خیلی اطلاعات دیگه ازش بگیریم. مثل کدوم روز هفته بوده؟ صبح بوده یا بعدازظهر؟ اختلاف زمانی utc با شهر نیویورک رو حساب کنیم و از این قبیل کارها.اینجوری میتونیم ستون pickup_datetime رو از string به datetime تبدیل کنیم:df[&#039;pickup_datetime&#039;] = pd.to_datetime(df[&#039;pickup_datetime&#039;])خروجی ای که میبینم به این صورته که تفاوتش با حالت string مشخصه :حالا میتونیم از داده های این ستون یه سری اطلاعات جدید به دست بیاریم. مثلا اینکه مشخص کنیم اختلاف زمانی سوار شدن مسافر رو درست کنیم. چون زمان اینجا utc هست با ساعت نیویورک حدود 4 ساعت اختلاف داره: df[&#039;EDTdate&#039;] = pd.to_datetime(df[&#039;pickup_datetime&#039;]) - pd.Timedelta(hours=4)بعد مثلا میتونیم ساعت رو مشخصا در یه ستون جدا ذخیره کنیم:df[&#039;Hour&#039;] = df[&#039;EDTdate&#039;].dt.hourیا مثلا بگیم زمان سوار شدن مسافر صبح بوده یا عصر:df[&#039;AMorPM&#039;] = np.where(df[&#039;Hour&#039;]&lt;12,&#039;am&#039;,&#039;pm&#039;)برای اینکار میایم از np.where استفاده میکنیم. خیلی روشهای دیگه هم هست ولی این روش هم باحال و سرراسته. اینجوریه که ارگومان اول شرطه مونه . الان چون df[&#x27;Hour&#x27;] مقداری که داره 24 ساعته است میتونیم بگیم اگه کمتر از 12 هست یعنی قبل از ظهره و مقدار df[&#x27;AMorPM&#x27;] در اون سطر رو بذار am و اگه بیشتره بعد از ظهره. پس بذار pm.کار باحال بعدی ای که میتونیم انجام بدیم اینه روز هفته رو دربیاریم:df[&#039;Weekday&#039;] = df[&#039;EDTdate&#039;].dt.strftime(&amp;quot%a&amp;quot)اینو دیگه حوصله ندارم . برید خودتون از داکیومنت پانداس بخونید. البته متدهای ساده تری هم توی همین پانداس هست مثل day_of_weak.در نهایت دیتاستمون این شکلی شد:خب تا اینجای کار یه سری feature engineering انجام دادیم و با داده های ورودیمون بازی کردیم . کلا 80 درصد پروژه های ماشین لرنینگ تمیزکاری و هندل کردن دیتاس که برای اینکار لازمه که توی کار با numpy و pandas مهارت داشته باشین.خب دیگه بسه . بریم سراغ قسمت بعدی :)</description>
                <category>فائزه ثقفی</category>
                <author>فائزه ثقفی</author>
                <pubDate>Tue, 20 Feb 2024 02:10:08 +0330</pubDate>
            </item>
                    <item>
                <title>کاربرد انتگرال های فازی در دسته بندی طبقه بندی کننده ها</title>
                <link>https://virgool.io/@faeze_saghafi/choquet-integral-zkizfpworsrw</link>
                <description>بیاید یه پروژه خیلی بیمزه براتون تعریف کنم. آقا این ترم ما یه درس داغون داشتیم به اسم «ترکیب اطلاعات» که حتی کتاب هم نداشت. استادمون هم ادعاش میشه گفت این خیلی مبحث جدیده و این صحبتا و کلا از روی مقاله درس میداد. قضیه اش هم اینه که چه طور منابع مختلف رو با هم ترکیب کنیم. حالا این منابع هر چی میتونه باشه. مثلا سنسورهای یه ماشین، دوربینای مداربسته یا حتی نظرات افراد مختلف راجع به یه چیز خاص. ینی میخواد چند تا تصمیم راجع به یه چیزی رو ترکیب کنه و به بهترین تصمیم و نتیجه گیری برسه. خب این نحوه ترکیب، نحوه تصمیم گیری و یه عالمه المان دیگه خودش کلی بحث میشه راجع بهش کرد. ولی خب کلا بیمزه است. خیلی زیاد آکادمیکه و اصلا کاربرد رایج و روزمره و پروژه های معمولی نداره. ینی حتی کوچکترین و کلی ترین اصطلاحی رو هم سرچ میزدی برات مقاله میاورد. ینی بدبختا وقت و حوصله نکرده بودن یه صفحه ویکی پدیا بسازن. آخه چه کاریه؟ عححالا دیگه ما کج دار و مریض کلاسا رو رفتیم و تمرینا رو دادیم و پروژه اش رو هم حتی زدیم. بعد هیشکی از بچه ها هم حوصله اش رو نداشت. ینی توی کلاس 11 نفره فقط من و یه نفر دیگه بودیم که واسه این پروژه وقت گذاشتیم. حالا من اینجا مینویسم چیه قضیه اش و اینا. شاید به درد یکی خورد. کلا قضیه «ترکیب اطلاعات» یا data fusion اینه که چه طوری یه سری چیز رو با هم ترکیب کنیم :)) البته این مبحث جدیدی نیست و توی ماشین لرنینگ ترکیب یه بحث جدیه ولی خب تحت عناوین دیگه و با نگاه های دیگه . مثلا یه بحث داریم به اسم ensemble learning. اینکه چه طوری بیایم الگوریتم های مختلف ماشین لرنینگ رو ترکیب کنیم که به عملکرد بهتری برسیم. یا مثلا Feature fusion. اینکه ویژگی های لایه های مختلف رو چه طوری با هم ترکیب کنیم. اینجا هم مسئله ترکیب مطرحه ولی با یه نگاه دیگه. توجه به منابع اطلاعاتیروشهای ترکیب هم خیلی مختلفن. انواع و اقسام روش های میانگین گیری وزن دار و سیگما و روش های مرتب سازی و ضریب دهی و این حرفا. حالا منطق فازی هم توی روش ها مطرحه. منطق فازی ینی اینکه همه چی رو دقیق نبینیم. ینی چی؟ مثلا توی منطق دودویی یا حساب مجموعه ها، یه عضو یا به یه مجموعه ای تعلق داره یا نداره. مثلا یه عدد یا زوجه یا فرد. غیر از این حالت نداریم. البته صفر هست ولی خب یه جوری ماست مالیش میکنن. یا مجموعه مضرب های یه عدد. همه چی خیلی دقیقه. ولی یه سری مفهوم هم داریم که حدودی ان. مثل چی؟ مثال معروفش تب داشتنه. دما طبیعی بدن انسان 37 درجه است. حالا اگه یکی 38 درجه بود تب داره، یکی که 40 درجه هم بود بازم بهش میگن تب داره. ولی اولی تبش خیلی شدید نیست. دوم دیگه داره میمیره. بنابراین هر دوشون به مجموعه تب دارها تعلق دارن ولی درجه تعلقشون انگار یه کم فرق داره. حالا توی این منطق ما میتونیم محاسبات کنیم. یکی از عملهایی که توی این منطق تعریف میشه انتگرال تعریف کرد. همونطور که میدونین انتگرال بسط تعریف سیگماس. یعنی جمع یه مجموعه اعداد پیوسته. دو تا انتگرال معروف داریم که عملیات ترکیب رو شبیه سازی میکنن. 1. انتگرال choquet و 2.انتگرال sugeno.پروژه ای که من زدم این بود که یه دیتاست معروفی داریم به اسم webspam-uk2007 .  اومدن یه عالمه سایت رو دادن به یه سری آدم و گفتن نظرتون رو راجع به اسپم بودن یا نبودن این سایتا بگین. حالا از روی اسم دامین. چون بعضیاش واقعا ضایعه یا اینکه مثلا از محتوای سایت و اینا. همه هم راجع به همه سایتا نظر ندادن و این یه نکته ای بود که یه کم کار برد تا بشه هندلش کرد. خب پروژه ما این بود که بیایم نظراتی که راجع به هر سایت داده شده بود رو ترکیب کنیم با این انتگرالا و بعد بیایم با لیبل نهایی که از روی میانگین به هر سایت داده شده بود مقایسه کنیم. برای محاسبه انتگرالها هم خیلی کد آماده پیدا نمیشه.چون یه موضوع خیلی آکادمیکه. و از اونجایی که واقعا لازم نیست ادم خودش بشینه این چیزای معروف رو پیاده سازی کنه. من یه پکیج نسبتا کامل به زبان پایتون پیدا کردم به اسم fancy-aggrigation. که خیلی از متدهای ترکیبی رو پیاده سازی کرده بود و با اون کار کردم. نکته ای از این پروژه که زمان گرفت مچ کردن دیتاست و الگوریتم ترکیب بااستفاده از انتگرال choquet بود. اول از همه که باید کتابخونه های numpy و pandas و یه سری کتابخونه دیگه رو import کنیم :اون re چیز مهمی نیست و integral هم فایلی هست که انتگرالها توش پیاده سازی شده. مرحله بعد پیش پردازش دیتاست. اول اینکه بیایم لیبل ها رو تبدیل به عدد کنیم که بتونیم بدیمشون به انتگرال. چون مثلا فرمت دیتا ست اینجوریه :ینی ارزیاب 1 و ارزیاب 2 به سایت شماره 5 برچسب non spam دادن. بخاطر همین اومده میانگین گرفته و در نتیجه این سایت غیر اسپم تشخیص داده شده. به هر لیبل یه عدد اختصاص دادیم. اسپم بودن 1، اسپم نبودن 0 ، حالت مرزی بین این دو تا 0.5 و اینکه طرف ندونه یا unknown رو 1- در نظر میگیریم. گفتم که دیتاست یه مشکلی که داشت این بود تعداد ثابتی به هر سایت رای نداده بودن. مثلا به یه سایت 2 نفر رای دادن. به یکی 5 نفر. من اومدم اول این تعداد رو ثابت کردم. یعنی بیشتری رایی که به هر سایت داده شده بود رو در نظر گفتم و به تعداد اون به بقیه اضافه کردم. حالا این اضافه کردن چه عددی باشه بماند. این دو تا نکته پیش پردازش رو اینجوری پیاده سازی کردم :البته راه حل های بهتری هم هست برای ثابت کردن تعداد رای دهنده ها. مثلا همه رو یه تعداد ثابتی بگیریم و بیشترین ها حذف کنیم به عنوان outlier درنهایت هم دو تا تابع از همون پکیج رو کال میکنیم و درصد خطای نتایج رو با لیبلهای توی فایل محاسبه میکنیم :حالا چون اینا عکسه ، کدش رو هم میذارم. و اینکه یه لینک یوتیوب هم میذارم که الگوریتم ترکیب با استفاده از الگوریتم choquet رو خیلی خوب توضیح میده و من خودم از اون یاد گرفتم و هر چی بگم، تکرار حرفای اونهاین کدها و اینم لینک یوتیوب:) </description>
                <category>فائزه ثقفی</category>
                <author>فائزه ثقفی</author>
                <pubDate>Sun, 16 Jan 2022 11:38:35 +0330</pubDate>
            </item>
                    <item>
                <title>هوش مصنوعی اصلا ینی چی؟</title>
                <link>https://virgool.io/@faeze_saghafi/%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%A7%D8%B5%D9%84%D8%A7-%DB%8C%D9%86%DB%8C-%DA%86%DB%8C-gpqdlo2f2aqh</link>
                <description>هوش مصنوعی چیه؟کلا انسانها به چی خودشون پز میدن؟ ینی چی دارن که خودشون رو از بقیه جاندارا جدا میکنن؟ بله. درسته. انسانها فکر میکنن.توی فلسفه به انسان میگن حیوان متفکر. خب این واژه تفکر یه کم انتزاعیه. انتزاعی بودن ینی اینکه یه مفهومه. عینیت نداره. ینی اینکه یه چیزیه که توی مغز ماست. مثلا شی نیست. نمیتونیم نشونش بدیم. باید توضیحش بدیم.برای اینکه بیایم مفهوم تفکر رو توضیح بدیم، یه راهش اینه توصیفش کنیم. ینی بگیم چیکار کنیم ینی داریم فکر میکنیم؟ قبلنا وقتی میخواستن کامپیوترها رو تعریف کنن میگفتن یه ماشینه که سرعت و دقتش خیلی زیاده ولی خنگه. ینی میتونه یه انتگرال رو تا چندین رقم حساب کنه ولی اگه بهش نگی که وقتی که انتگرال رو حساب کردی حالا نشونش بده، خودش نمیفهمه که بعدش باید نشون بده. باید همه چی رو بهش بگی. اگه اون فیلم imitation رو دیده باشین که خیلیم قشنگ بود، اونجا یه مرده ای بود بنده خدا همجنسگرا بود . خیلیم اذیت شد. اون اومد و توقع آدما رو کامپیوترا بالا برد. ینی حد اعلای یه کامپیوتر رو تعریف کرد. گفت یه کامپیوتر باید اینقدر خفن باشه که بتونه همه کارای مغز انسان رو انجام بده. تا جایی که اگه مثلا بذاریش توی یه اتاق و بگی بشین با یکی حرف بزن، اون آدم نفهمه که داره با یه انسان حرف میزنه یا یه ماشین. حالا پس هوش مصنوعی ینی بیایم همچنین نرم افزاری بنویسم.اگه که دارین این مطلبو میخونین و بلدین الگوریتم بنویسین که هیچی اگه هم بلد نیستین الان من بهتون میگم که اصل و اساس نوشتن یه نرم افزار ، خرد کردن کارهاست. اصلا جلسه اول مبانی کامپیوتر استاد ما از خواب بیدار شدن رو مثال زد. گفت اول از پا میشین از جاتون . دست و صورتتون رو میشورین. بعد مسواک میزنین. بعد صبحونه میخورین . همینجور تا آخر. یعنی بیای یه کار کلی به اسم شروع کردن روز رو تقسیم کنی به چند تا کار کوچیک. حالا من از این مثال میخواستم به این نتیجه برسم که برای اینکه یه نرم افزار شبیه مغز انسان بسازیم، باید بیایم مهمترین کاری که مغز انجام میده رو اول تعریف کنیم. یعنی فکر کردن. خب این فکر کردن شامل چه کارهایی میشه؟ مثلا ساده سازی، تحلیل، پیش بینی، دسته بندی، شبیه سازی و مهمتر از همه یادگرفتن. ینی لازم نباشه همه چی رو بهش بگی. خودش بفهمه و خطاهاش رو درست کنه. حالا بیاید از این بحثهای کلی بیایم بیرون و یه مثال بزنیم. فرض کنید میخوایم یه نرم افزار داشته باشیم که مثلا بتونه چند تا شکل رو دسته بندی کنه. این یه بازی ذهنی خیلی ابتداییه. یادمه چند سال پیش واسه برادرزاده 2 ساله ام یه اسباب بازی چوبی خریدم که 3 تا میله داشت و چند تا دایره و مربع و مثلث که خب باید اینا رو دسته بندی میکرد و اینا. نوشته بود مخصوص کودکان 1 تا 3 سال. خواستم بگم مثلا دیگه خیلی مثالم پایه ای بود. :)خلاصه اینکه بیایم چند تا عکس به برنامه بدیم بهمون بگه دایره است یا مربع و اینکه قرمزه یا آبی. باید چیکار کنیم؟ الان مثلا فرض کنید میخواید به همون بچه 2 ساله اینا رو یاد بدید. اول از همه باید بهش بگید که عزیزم این شکلی که میبینی دایره است،  این یکی مربع. یا مثلا این یکی آبیه و اون قرمز. پس باید بهش نشون بدیم. قبلش باید این نشون دادن رو برای کامپیوتر تعریف کنیم. یعنی دیتا رو جوری که برای کامپیوتر اوکیه بهش بدیم. نمیتونیم که مثلا عکس رو قلفتی بدیم به نرم افزار!!! اینجاست که ریاضیات وارد میشه. همه چی رو تبدیل میکنیم به عدد. البته عبارت درست ترش ماتریسه. ینی یه عدد خالی نه. یه سری عدد به هم مرتبط. پس جبر خطی اومد وسط. حالا بعضی وقتا میخوایم چند تا عدد رو تبدیل کنیم به یه عدد. یا یه عدد رو از بین چند تا عدد انتخاب کنیم. پس اینطوری آمار و احتمال و بعد از اون هم حساب دیفرانسیل به عنوان ابزار کار مطرح میشن. بعد از مرحله تعریف نشان دادن، میرسیم به اینکه چند تا شکل بدیم ، داداش این مربعه این یکی دایره. ینی دیتا بدیم . اینجا میشه بحث علوم داده البته به صورت خیلی کلی. چون که یکی دو تا که نیست. مثلا 1000000 تا عکس دایره بهش میدیم که دیگه خوب شیرفهم بشه. پس باید بتونیم این داده ها رو هندل کنیم. داده ی زیاد تمیزکاری میخواد. مرتبسازی میخواد. کلی ادا و اصول داره. پس اینم از بحث داده ها که نیاز به آشنایی با مباحث کلی علوم داده و البته ابزارهاش داره. حالا بعد از همه اینا باید بهش بگیم اونایی که شبیه هم ان دایره ان. و خب قبلش شبیه هم بودن ینی چی ؟ ینی اصل کار . که خب میشه ماشین لرنینگ عزیز که بیشتر کار و مهمترین کار رو برامون میده. کند و زمانبره. الگوریتم ها و شاخه ها و انواع مختلف داره. در نهایت میرسیم به اینکه حالا که یاد گرفتی نشون بده ببینم بلد شدی یا نه؟ چقدر زمان برد؟ چند درصد درست میگی و چند درصد غلط و از این حرفا . یعنی مرحله نمایش داده . حالا من یه عکس جدید که قبلش تا حالا ندیدیش رو بهت میدم بگو ببینم دایره است یا مربع. و خب اون میگه و این میشه یاد گرفتن. ببینید نکته هوش مصنوعی اینجاست : عکس جدید بهش دادیم. قبلا ندیده بود.یادش گرفت. حالا دیگه هر چی عکس از هر جا بهش بدیم میفهمه که مربعه یا دایره. حالا ادامه این فرآیند میشه یادگیری عمیق. که خب باید شبکه های عصبی بلد بشیم . و به همین ترتیب می تونیم  مسایل خفن تر رو حل میکنه.خلاصه که اینجوری.</description>
                <category>فائزه ثقفی</category>
                <author>فائزه ثقفی</author>
                <pubDate>Sun, 02 Jan 2022 15:34:36 +0330</pubDate>
            </item>
                    <item>
                <title>ماشین لرنینگ #2 : پیش بینی نژاد سگ</title>
                <link>https://virgool.io/coderlife/%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D9%84%D8%B1%D9%86%DB%8C%D9%86%DA%AF-2-%D9%BE%DB%8C%D8%B4-%D8%A8%DB%8C%D9%86%DB%8C-%D9%86%DA%98%D8%A7%D8%AF-%D8%B3%DA%AF-ezzsygej4tfz</link>
                <description>از این یکی پروژه خوشم میاد. توی این یکی پروژه میخوایم بیایم با استفاده از TensorFlow و Keras که پکیج های اصلی و بسیار مهم پایتون برای یادگیری ماشین هستن، یه شبکه convolutional  بسازیم. ما عکسای سگ های مختلف رو بهش میدیم و این شبکه مون میاد نژادش رو تشخیص میده. کلا این شبکه کانوولوشنال معمولا برای طبقه بندی استفاده میشه.حالا طبقه بندی میتونه بین دو دسته باشه یا چندتا. این قضیه خیلی مهمه و خیلی از مسائل ماشین لرنینگ این مدلین. این چیزی که ما الان داریم multi-class classification problem هستش.کارهایی که هم باید بکنیم ایناس: اول اینکه یه دیتاست لازم داریم که مجموعه ای از تصاویر سگها باشه، نژادشون رو هم نوشته باشه. سایت kaggle یه دیتا ست معروف داره. که باید از طریق کد توی colab دانلود کنیم و همونجا ازش استفاده کنیم. اول دیتا یعنی تصاویر و لیبل هاش رو میکنیم و تبدیلشون میکنیم. بعد شبکه رو میسازیم. بعد دیتا رو مدل یا همون شبکه امون میدیم. البته فقط قسمت train رو. بعدش قسمت test رو میدیم و دقت پیش بینی شبکه یه نمره ای میدیم و اگه خوب بودیم ، برای پیش بینی از این مدل استفاده میکنیم. حالا برای شروع باید بریم توی حساب colabمون و برای استفاده از دیتاست سگهای kaggle این دو تا حسابمون رو به هم وصل کنیم. البته kaggle فیلتره . اولش میریم توی حساب kaggleمون. حساب ساختنش هم کاری نداره. همینطوری با حساب گوگل هم میشه واردش شد. بعد میریم از گوشه بالا سمت راست، روی اون اردکه کلیک میکنیم. بعد میریم قسمت account و از قسمت API روی اون باتن create new API token میزنیم و یه فایل json دانلود میشه. حالا میایم این دو تا خط رو اجرا میکنیم تا بذاره اون token مون رو بذاریم روی پروژه کولب.from google.colab import filesfiles.upload()خروجیش این شکلی میشه که یه پنجره باز میشه تا فایلتون رو انتخاب کنیم و بعد آپلود هم فوری میشناسدتون و پایینش مینویسه :حالا مرحله بعد اینه که بیایم Kaggle API رو نصب کنیم توی colab . دستورش همون pip معمولیه :!pip install -q kaggleحالا بعدش میایم اون فایل json رو میریزیم توی یه فولدر توی پروژه . پس اول میایم یه فولدر میسازیم. بعدش هم اون فایله رو آپلود میکنیم توی فولدرمون . البته باید پرمیشن هم ست کنیم که دیگه کولب بهمون وارنینگ نده.!mkdir -p ~/.kaggle!cp kaggle.json ~/.kaggle/
!chmod 600 ~/.kaggle/kaggle.jsonپس تا اینجا اومدیم kaggle API رو نصب کردیم. حالا باید بیایم یه فولدر بسازیم تا دیتاست سگها رو توش بریزیم بعد هم با دستور cd فولدرمون رو میکنیم فولدر جاری. چیزی بازه:!mkdir dog_dataset%cd dog_datasetحالا باید بریم kaggle رو بگردیم و دیتاستمون رو پیدا کنیم:!kaggle datasets list -s dogbreedidfromcompخب وقتی پیداش کرد خروجی رو نشون میده :سایزش هم زیاده خداییخب حالا که پیداش کردیم باید دانلود کنیم و بریزیم توی همون فولدرمون که ساختیم. اسم کاملش catherinehorng/dogbreedidfromcomp !kaggle datasets download catherinehorng/dogbreedidfromcomp%cd ..حالا مرحله بعدی چیه؟ بیایم unzip کنیم، بعدشم فایلایی که استفاده ندارن رو پاک کنیم. مثله فایل زیپ اصلی و اینا!unzip dog_dataset/dogbreedidfromcomp.zip -d dog_dataset!rm dog_dataset/dogbreedidfromcomp.zip!rm dog_dataset/sample_submission.csvخب حالا تازه برنامه نویسی شروع میشه و میریم سراغ import هاimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom tqdm import tqdmfrom keras.preprocessing import imagefrom sklearn.preprocessing import label_binarizefrom sklearn.model_selection import train_test_splitfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2Dfrom tensorflow.keras.optimizers import Adamخب numpy و pandas و matplot که خیلی معروفن.tqdm یه کتابخونه اس که میذاره توی خروجی یه progress-bar نشون بدیم. حالا اومدیم معماری شبکه یا مدلمون رو ترتیبی قرار میدیم. خیلی ساده است. یه مدل ترتیبی یه ترتیب خطی از لایه ها داره. یه استک از لایه ها و وقتایی استفاده میشه که هر لایه فقط یه ورودی و فقط یه خروجی داره. در پلتفرم کرس، پایه ای ترین واحد سازنده یه شبکه عصبی، لایه ها هستند. که مجموعه ای از نورونها هستند و یه ورودی و یه خروجی دارن و یه تابع هم دارن. این لایه ها انواع مختلف دارن که توضیحشون نمیدم فقط مدل شبکه رو میگم.مرحله بعد از import ها، لود کردن دیتا و لیبل هاست.labels_all = pd.read_csv(&amp;quotdog_dataset/labels.csv&amp;quot)print(labels_all.shape)labels_all.head()اینجا 10222 تا سطر و 2 تا ستون id و breed حالا بیایم value انواع breed رو ببینیمbreeds_all = labels_all[&amp;quotbreed&amp;quot]breed_counts = breeds_all.value_counts()breed_counts.head()حالا برای اینکه یه کم خلاصه تر بشه، میایم فقط سه تا نژاد رو انتخاب می کنیم. CLASS_NAMES = [&#039;scottish_deerhound&#039;,&#039;maltese_dog&#039;,&#039;bernese_mountain_dog&#039;]labels = labels_all[(labels_all[&#039;breed&#039;].isin(CLASS_NAMES))]labels = labels.reset_index()labels.head()خب ، چون که میخوایم عکسها رو طبقه بندی کنیم، باید بیایم اون خروجی که مطلوبمون هست رو one hot encode کنیم. وان هات رو اینجا توضیح داده. کلا سرچ هم بکنیم زیاد هست. # Creating numpy matrix with zerosX_data = np.zeros((len(labels), 224, 224, 3), dtype=&#039;float32&#039;)# One hot encodingY_data = label_binarize(labels[&#039;breed&#039;], classes = CLASS_NAMES)# Reading and converting image to numpy array and normalizing datasetfor i in tqdm(range(len(labels))):       img = image.load_img(&#039;dog_dataset/train/%s.jpg&#039; % labels[&#039;id&#039;][i], target_size=(224, 224))       img = image.img_to_array(img)       x = np.expand_dims(img.copy(), axis=0)       X_data[i] = x / 255.0# Printing train image and one hot encode shape &amp; sizeprint(&#039;\nTrain Images shape: &#039;,X_data.shape,&#039; size: {:,}&#039;.format(X_data.size))print(&#039;One-hot encoded output shape: &#039;,Y_data.shape,&#039; size: {:,}&#039;.format(Y_data.size))اول میایم برای اینکه میخوایم عکسا رو نرمالایز کنیم، میخونیمشون بعدم تبدیلشون میکنیم به یه آرایه numpy .این از آرایه x_data . یه آرایه y_data هم داریم که با استفاده از متد label_binirized مقداردهیش میکنیم. توی اون حلقه هم عکسا رو میخونیم، بعد آرایه اش می کنیم. بعد هم تقسیم بر 255 میکنیم که نرمالایز بشه. اون کتابخونه tqdm برای همین کاره. برای پری پراسس دیتا و اینا. 357 تا عکس داریم با سایز 224 در 224 و در چنل 3 یعنی RGB. ,وان هات هم 357 تا عکس داریم و 3 تا کلاس برای طبقه بندیحالا رسیدیم به ساخت مدل. model = Sequential()model.add(Conv2D(filters = 64, kernel_size = (5,5), activation =&#039;relu&#039;, input_shape = (224,224,3)))model.add(MaxPool2D(pool_size=(2,2)))
model.add(Conv2D(filters = 32, kernel_size = (3,3), activation =&#039;relu&#039;, kernel_regularizer = &#039;l2&#039;))model.add(MaxPool2D(pool_size=(2,2)))
model.add(Conv2D(filters = 16, kernel_size = (7,7), activation =&#039;relu&#039;, kernel_regularizer = &#039;l2&#039;))model.add(MaxPool2D(pool_size=(2,2)))
model.add(Conv2D(filters = 8, kernel_size = (5,5), activation =&#039;relu&#039;, kernel_regularizer = &#039;l2&#039;))model.add(MaxPool2D(pool_size=(2,2)))
model.add(Flatten())model.add(Dense(128, activation = &amp;quotrelu&amp;quot, kernel_regularizer = &#039;l2&#039;))model.add(Dense(64, activation = &amp;quotrelu&amp;quot, kernel_regularizer = &#039;l2&#039;))model.add(Dense(len(CLASS_NAMES), activation = &amp;quotsoftmax&amp;quot))model.compile(loss = &#039;categorical_crossentropy&#039;, optimizer = Adam(0.0001),metrics=[&#039;accuracy&#039;])model.summary()اول گفتم که مدلمون ترتیبیه. لایه Conv2D یه لایه کانوولوشنال دو بعدیه که معمولا برای طبقه بندی تصاویر استفاده میشه. ینی وقتی بخوان دقت رو بالا ببرن توی طبقه بندی تصاویر از این استفاده میکنن. لایه pooling معمولا بعد از یه لایه کانوولوشن قرار میگیره و کارش اینه که بیاد اندازه نقشه های ویژگی رو کم کنه. max pooling کارش اینه که بیاد از هر منطقه (region) مثلا ماکزیمم مقدار رو انتخاب کنه. مدلای دیگه هم داره.  لایه بعدی flatten هست. میاد داده ها رو فلت میکنه. یعنی میاد برای انتقال به لایه بعد یک بعدیشون میکنه. لایه های آخر هم dence یا همون fully connected هست. این لایه ها میان نتیجه شبکه رو در قالب یه بردار با اندازه مشخص ارائه می دن. از این بردار می توان برای دسته بندی استفاده کرد و یا اینکه از آن جهت ادامه پردازش های بعدی بهره برد.البته من همه پارامتراش رو بررسی نکردم. کلا همه تابعای فعالسازی به جز لایه آخر relu بود. آخرین لایه هم softmax بود که چون میخواستیم احتمال متعلق بودن هر عکس رو به یه نژاد بگیم از این استفاده کردیم. تابع اتلافمون هم categorical_crossentropy میگیریم که معمولا برای مسائل طبقه بندی استفاده میشه. از یه optimizerهم استفاده میکنیم به اسم adam. سرچ بزنین مفصل راجع بهش مطلب هست. خودم حوصله نداشتم. حالا بعدا اگه احتیاج داشتم میخونم. حالا اجرا که بزنیم ویژگی های شبکه به طور خلاصه میگه. حالا مرحله بعدی تقسیم بندی دیتا به train  و validation و test هست. # Splitting the data set into training and testing data setsX_train_and_val, X_test, Y_train_and_val, Y_test = train_test_split(X_data, Y_data, test_size = 0.1)# Splitting the training data set into training and validation data setsX_train, X_val, Y_train, Y_val = train_test_split(X_train_and_val, Y_train_and_val, test_size = 0.2)حالا میخوایم مدل رو fit کنیم. یعنی تعداد تکرار و تعداد اینکه هر بار روی چه تعداد داده کار کنه. اجرای مدل طول میکشه.# Training the modelepochs = 100batch_size = 128history = model.fit(X_train, Y_train, batch_size = batch_size, epochs = epochs,validation_data = (X_val, Y_val))آخرین سطر خروجی ، نتیجه نهایی ماس.حالا بیایم ویژوالایز کنیم.plt.figure(figsize=(12, 5))plt.plot(history.history[&#039;accuracy&#039;], color=&#039;r&#039;)plt.plot(history.history[&#039;val_accuracy&#039;], color=&#039;b&#039;)plt.title(&#039;Model Accuracy&#039;)plt.ylabel(&#039;Accuracy&#039;)plt.xlabel(&#039;Epochs&#039;)plt.legend([&#039;train&#039;, &#039;val&#039;])plt.show()دقت به مرور بالا رفتهحالا باید بیایم مدل رو روی داده های تست امتحان کنیم.ینی عملیات پیش بینی رو انجام بدیم. Y_pred = model.predict(X_test)score = model.evaluate(X_test, Y_test)print(&#039;Accuracy over the test set: \n &#039;, round((score[1]*100), 2), &#039;%&#039;)میبینیم که دقت خیلی بالایی داریم. یعنی 80 درصد از پیش بینی های مدل صحیح بودهبیایم یه نمونه تصویری هم مقایسه کنیم. # Plotting image to compareplt.imshow(X_test[1,:,:,:])plt.show()# Finding max value from predition list and comaparing original value vs predictedprint(&amp;quotOriginally : &amp;quot,labels[&#039;breed&#039;][np.argmax(Y_test[1])])print(&amp;quotPredicted : &amp;quot,labels[&#039;breed&#039;][np.argmax(Y_pred[1])])درست پیش بینی کرده اینجاس کدا.تمام.</description>
                <category>فائزه ثقفی</category>
                <author>فائزه ثقفی</author>
                <pubDate>Sun, 03 Oct 2021 15:45:53 +0330</pubDate>
            </item>
                    <item>
                <title>ماشین لرنینگ #1 : مقایسه دو تصویر</title>
                <link>https://virgool.io/@faeze_saghafi/%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D9%84%D8%B1%D9%86%DB%8C%D9%86%DA%AF-1-%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-%D8%AF%D9%88-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-wxqpyqtujrcy</link>
                <description>پروژه اول مقایسه و تطبیق دو تا تصویر هستش که یه مثال برای computer vision هست. مثلا اینجوری که یه تصویر از یه کارت شناسایی درست و خوب داریم. بعد می خوایم یه عکس از یه کارت شناسایی دیگه رو باهاش مقایسه کنیم ببینیم تصویر دوم جعلیه یا واقعیه؟ این مقایسه چند تا مرحله داره: اول بیایم عکسا رو از کاربر بگیریم. بعد سایز و فرمت و shape اشون رو مقایسه کنیم. بعد سایز رو تغییر بدیم و دو تا تصویر رو عین هم کنیم. بعد بیایم عکسها رو سیاه و سفید کنیم. بعد بیایم similarity index یا میزان شباهت رو پیدا کنیم. بعد threshold ، بعد contour و grab رو دربیاریم. بعد دور اون contour ها یه مستطیل بکشیم و مشخصشون کنیم. بعد تفاوتها رو رسم کنیم. بعد با توجه به همه اینا یه امتیاز شباهت بدیم که دو تا عکس چقدر به هم شبیهن و اون عکس دومیه فیکه یا نه؟ حالا دونه دونه توضیح میدم.  اول چیکار میکنیم؟ میایم لایبرری هایی که نیاز داریم رو ادد میکنیم:from skimage.metrics import structural_similarityimport imutilsimport cv2from PIL import Imageimport requestsمتد structural_similarity از ماژول skimage.metrics برای پردازش تصویر استفاده میشه. میاد اون similarity index رو محاسبه میکنه که در واقع شباهتهای ساختاری و مهم دو تا تصویره. imutils یه مجموعه ای از متدهاس که میاد کارای اصلی و اساسی پردازش تصویر رو برامون انجام میده مثل resize و rotate و اینا. cv2 هم که همون openCV عه . البته جمع وجورش. برای کامپیوتر ویژن. باز PIL هم یه کتابخونه پردازش تصویر توی پایتونه. request هم که برای دانلوده. !mkdir pan_card_tampering!mkdir pan_card_tampering/imageبا این دو تا دستور هم میایم دو تا فولدر توی هم میسازیم که وقتی تصویرا رو دانلود کردیم بره توی اینجا. original = Image.open(requests.get(&#039;https:// ... &#039;, stream=True).raw)tampered = Image.open(requests.get(&#039;https://...&#039;, stream=True).raw)این دو تا دستور هم میان از یه آدرس دو تا عکس دانلود میکنن و میریزن توی دو تا متغیر. که خب از request برای دانلود و از Image برای خوندن دو تا عکس و ریختنشون توی متغیرها استفاده کردیم. اولیش اون اصلیه اس. دومیش هم اونیه که میخوایم فیک بودنش رو حساب کنیم. حالا آدرسش مهم نبود. چون طولانی میشد پاکش کردم. کد اصلی رو آخرش میذارم. اول عکسا رو ببینیم چه شکلین. همینطوری اسمش رو بنویسم تصویر رو نمایش میده :میخوایم این دو تا رو مقایسه کنیم. عکس سمت چپ تصویر اصلی و درستهحالا کار شروع میشه. اول میایم سایز و فرمت دو تا تصویر رو میبینیم :print(&amp;quotOriginal image format : &amp;quot,original.format)print(&amp;quotTampered image format : &amp;quot,tampered.format)print(&amp;quotOriginal image size : &amp;quot,original.size)print(&amp;quotTampered image size : &amp;quot,tampered.size)الان غیر از اینکه تصویرها هم اندازه نیستن، تصویر اصلی خیلیم بزرگه. بخاطر همین میایم ریسایز میکنیم. بعد هم توی دو تا متغیرها میریزیم. هم اینکه توی اون دو تا فولدری که ساختیم ذخیره اشون میکنیم. original = original.resize((250, 160))original.save(&#039;pan_card_tampering/image/original.png&#039;)tampered = tampered.resize((250,160))tampered.save(&#039;pan_card_tampering/image/tampered.png&#039;)با استفاده از اون cv2 عکسا رو میخونیم، میریزیم توی همین دو تا متغیر که بعدا لازمشون داریم. این متد imread میاد عکسا رو به صورت ماتریس ذخیره می کنه. original = cv2.imread(&#039;pan_card_tampering/image/original.png&#039;)tampered = cv2.imread(&#039;pan_card_tampering/image/tampered.png&#039;)مرحله بعدی اینه که برای پردازش بهتر و همینطور ساده کردن ماتریس عکسا و سبک کردنش، بیایم چیکار کنیم؟ عکسا رو سیاه و سفید کنیم. اول اینکه با اینکار لبه های قسمتهای مختلف تصویر بهتر مشخص میشه. بعد هم اینکه یه عکس رنگی 3 تا مقدار rgb داره ولی یه عکس سیاه و سفید 1 دونه مقدار داره برای هر پیکسل. گفتیم که میخوایم یه عدد در نظر بگیریم و به میزان شباهت دو تا تصویر امتیاز بدیم. این کار با استفاده از از متد structural_similarity انجام میشه که یه عدد SSIM برمیگردونه . این میزان شباهته . که خب هر چیم عددش کمتر باشه، میزان شباهت کمتره:(score, diff) = structural_similarity(original_gray, tampered_gray, full=True)print(&amp;quotSSIM: {}&amp;quot.format(score))مال این دو تا تصویر که بالا نشون دادم زیاد نیستSSIM: 0.3167879033273942تازه از اینجا پردازش تصویر شروع میشه. اول میایم آستانه گذاری میکنیم یا همون threshold. تقریبا میشه گفت یه روش ساده سازی تصویره. میاد تصویر رو باینری میکنه. یعنی یه پیکسل یا سفیده و 1 مدارش ، یا سیاه و 0 . البته این ساده ترین تعریفشه. یعنی اول اومدیم تصویر رو از حالت رنگی تبدیلش کردیم به gray-scale. این سیاه و سفید نیست. خاکستری طوره. یعنی هنوزم طیف رنگ داریم. یه جاهایی پر رنگتر از جاهای دیگه اس. سایه و این حرفا رو داریم. حالا میخوایم با threshold بیایم و کاملا تصویر رو سیاه و سفید کنیم. یه مثال از آستانه گذاری. توضیح فارسی خوب پیدا نکردم. برید از ویکی پدیا بخونیدکار بعدی پیدا کردن contour هاس. کلا کلمه contour یعنی خط. یه contour یه خط بسته اس در تصویر که یه رنگ دارن یا مثلا یه قطر دارن. خلاصه مشخصه که در امتداد هم اند. اون خط سبزاحالا این دو تا کار پایه ای رو از کتابخانه cv2 که همون openCV هست بر میداریم:thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)این دو تا متد این کارا رو برامون انجام میدن. یعنی اول آستانه گذاری و تبدیل عکس به عکس باینری. بعد هم چی؟ پیدا کردن خطوط که برای تشخیص اشیا در تصویر ضروریه. خروجی اش هم یه آرایه است.حالا کار بعدی اینه که بیایم دور اشیاء موجود در تصویر یه مستطیل بکشیم. یعنی ناحیه ای که اون contour توش قرار داره رو تشخیص بدیم و یه مستطیل دورش بکشیم. این کار برای مقایسه دو تا تصویر استفاده میشه. یعنی میتونیم بزرگی و کوچیکی آبجکتهای موجود در تصویر رو با هم مقایسه کنیم. مثلا اینکه سایز شماره ID موجود در دو تا کارت یکیه؟for c in cnts:      (x, y, w, h) = cv2.boundingRect(c)      cv2.rectangle(original, (x, y), (x + w, y + h), (0, 0, 255), 2)      cv2.rectangle(tampered, (x, y), (x + w, y + h), (0, 0, 255), 2)حالا کارایی که کردیم رو نمایش میدیمprint(&#039;Original Format Image&#039;)Image.fromarray(original)خطوط یا contourهای تصویر اصلیprint(&#039;Tampered Image&#039;)Image.fromarray(tampered)خطوط یا contourهای تصویری که میخوایم صحتش رو بسنجیمprint(&#039;Different Image&#039;)Image.fromarray(diff)تفاوت دو تا عکس که با قسمتای سیاه نشون داده شدنprint(&#039;Threshold Image&#039;)Image.fromarray(thresh)تفاوت دو تا عکس که با threshold نشون داده شدن و قسمتای سفید هستنخب این از قسمت اول. کدهاش رو هم میذارم اینجا</description>
                <category>فائزه ثقفی</category>
                <author>فائزه ثقفی</author>
                <pubDate>Tue, 28 Sep 2021 13:34:45 +0330</pubDate>
            </item>
                    <item>
                <title>مقدمه یا چرا می نویسم؟</title>
                <link>https://virgool.io/@faeze_saghafi/%D9%85%D9%82%D8%AF%D9%85%D9%87-%DB%8C%D8%A7-%DA%86%D8%B1%D8%A7-%D9%85%DB%8C-%D9%86%D9%88%DB%8C%D8%B3%D9%85-mhklpwklv7el</link>
                <description>خب قضیه از اونجا شروع شد که من بعد از 7 سال از شرکت اومدم بیرون. اونجا اپ اندروید میزدم.چون 2-3 سال آخر دیگه هیشکی نمونده و فقط من و یه نفر دیگه بودیم، تقریبا اونجا سوپروایزر بودم و همه بیشتر روی من حساب میکردن تا خانم x. ( همکارم که اتفاقا کارش از من بهتر بود ) در نتیجه فازم این بود که خیلی خفنم و دیگه این شرکت به درد نمیخوره و این حرفا. برم که پیشرفت کنم. هیچی از اونجا اومدم بیرون. خیلیم بهم اصرار کردن که نرو ولی جو گرفته بودم. در نتیجه در سال 98 اومدم تا ادامه تحصیل بدم و احتمالا یه شرکت برم و کار پیدا کنم و از اونجایی که خیلی عجله داشتم دیگه صبر نکردم که اول یه کار پیدا کنم بعد برم. یه دفه زدم زیر میز و دیگه قرارداد نبستم! آقا شش ماه (از فروردین تا مهر) استراحت کردم. مهر ازدواج کردم و از حدود آبان شروع کردم به درس خوندن برای کنکور ارشد. با وجود داشتن یه ارشد فلسفه. به خاطر کرونا چندین بار کنکور عقب افتاد و در نهایت دانشگاه تهران رشته مهندسی کامپیوتر گرایش هوش مصنوعی قبول شدم. از مهر 99 شروع کردم پایتون کار کردن. البته نه از پایه. همون پروژه های دانشگاه رو فقط. و هوا برم داشت که منم پایتون بلدم. متاسفانه! و در نهایت از فروردین 1400، وقتی عروسی گرفتم و ستل داون شدم، گفتم دیگه وقتشه که بری سراغ کار. و دیگه توی سایتا و اینا پلاس بودم.همون موقعا از طرف همون آقای y یه شرکت یه پروژه بایننس بهم دادن. خیلیم تعریفمو کرده بود ولی چنگی به دل نمیزد. آخرشم بعد از دوماه پروژه اشون تموم شد و دیگه برای ادامه کار باهام تماس نگرفتن. اونجا اولین تلنگر بهم بود. بخاطر اینکه سوتی زیاد میدادم. البته اونا برنامه نویس نبودن و حالیشون نبود تقریبا. ولی خب باگ هام رو درمیآوردن و این مسئله تبعات داشت. فکر کنم بخاطر همین بود که وقتی سر قیمت یه کم باهاشون چونه زدم کلا دیگه تماس نگرفتن. لابد پیش خودشون و احتمالا اون آقای y میگن که همچین تحفه ای هم نبود این دختره. ولش کن. فکر میکنم بهش اعصابم خرد میشه.بعد از اون قضیه، توی دانشگاه هم خیلی تاپ کلاس نبودم و در حد بقیه بودم. حتی اونایی که سرکار میرفتن و کاملا مشخص بود که پروژه ها و امتحانا رو سمبل می کنن. نمره هامون عین هم میشد. بعدشم حدودا سه چهار ماه یه سره توی جابینجا و جاب ویژن و ... گشتم ولی کار پیدا نمیشد. کلا یا دات نت میخواستن یا جاوااسکریپت. اگر هم برای پایتون کار آگهی می زدن، جنگو می خواستن. در کل سه بار مصاحبه داشتم. یکیش واسه همین جنگو بود که باز بهم پیشنهاد پروژه دادن ولی چون صادقانه گفتم که وب کار نکردم و اگه بهم وقت بدن یاد میگیرم، بیخیال شدن. یکیش هم متفرقه بود. یکیش هم مال یه سایت معروف بود و من آرزوم بود که اونجا کار کنم. مخصوصا ماشین لرنینگ یا دیتاساینس. واسه کارآموز تحلیلگر داده آگهی کرده بودن و منم رزومه ام رو فرستادم. بعد از سه روز رزومه ام رو دیدن و بهم وقت مصاحبه دادن. منم خوشحال از اینکه حتما قبول میشم. فکر میکردم دیگه کارآموزیو حتما میارم. آخه یه بار همون سال 98 رزومه ی اندرویدمو براشون فرستادم و اونا همون رزومه رو به دلیل «کمبود دانش فنی» رد کرده بودن. گفتم اینبار که رزومه ام رو دیدن حتما میارم. بخاطر اینکه من برنامه نویسی بلدم. کار حرفه ای کردم. حالا توی یه زمینه دیگه. حتماااااا قبولم میکنن. مخصوصا اینکه مصاحبه گر مال HR بود. یعنی منابع انسانی و اصلا مصاحبه فنی نداشتن. ولی خب همونم رد شدم. اینجا بود که بیخیال کار توی شرکت شدم. چون شهر ما خیلی پایتون کار نمیخوان انگار. همه آگهی ها مال وبه. بعد هم دیدم واقعا رزومه ای ندارم. بیشتر مهارتایی که توی رزومه ام زده بودم، فقط در حد اسم و یه سری مفاهیم کلی ازشون می دونستم و پروژه هام همون آشغالایی بودن که توی شرکت زده بودم. که حتی اونا هم قابل اتکا نبودن. الانم میخوام بچسبم به تکمیل رزومه. حداقل پس فردا که سرمو گذاشتم زمین، با خودم بگم من عمرم رو توی این راه گذاشتم. یه تخصصی چیزی دارم حداقل. عمرمو به کیک پختن و لباس شستن نگذروندم. چمیدونم. شاید هم کار احمقانه ایه. حالا فعلا که تصمیم دارم مراحل نوشتن پایان نامه و مقاله هایی که میخونم به علاوه دوره هایی که می بینم رو اینجا بذارم. البته فکر نکنم به درد کسی بخوره. اول اینکه کسی که برنامه نویس یادگیری ماشین و دیتا و اینا هست، اصلا فارسی سرچ نمیکنه و حتما زبانش در حد منه و کورسای انگلیسی و اصلی رو می بینه ، دوما هم چرا بیاد پست های منو بخونه اصلا؟ میره منابع اصلی که من دارم از روشون یاد میگیرم رو میبینه :| بیشتر به خاطر خودم می نویسم. که یاد بگیرم و برام درونی سازی بشه. خلاصه که این بود قضیه اشیه کورس 21 ساعته یادگیری ماشینه. مال یه هندیه اس. 30 تا پروژه کاربردی توی حوزه های مختلف هوش مصنوعی میزنه. البته خیلی سطحی و صرفا در حد آشنایی. بیشتر با لایبرری ها آشنا میشین. از git.ir به قیمت 8 هزار تومن خریدمش :)) و اونو میبینم و اینجا توضیح میدم. دو تا دوره طولانی دیتا هم دارم. اونا رو هم میخوام اینجا بذارم. یه سری دوره های دیگه هم هستن مثل گیت و ربات تلگرام و این حرفا. اونا رو دوست دارم بذارم. ضمن اینکه مراحل پایان نامه ام رو هم میذارم. راجع به کاربرد یادگیری عمیق توی سیستم های توصیه دهنده است. البته این عنوان خیلی خیلی کلی و کلیشه ایه. یه مقاله خفن 2020 انتخاب میکنم و میرم توی کارش. هنوز دارم می خونم. ایشالا که بشه</description>
                <category>فائزه ثقفی</category>
                <author>فائزه ثقفی</author>
                <pubDate>Sun, 26 Sep 2021 01:32:15 +0330</pubDate>
            </item>
            </channel>
</rss>