<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امیرعباس</title>
        <link>https://virgool.io/feed/@AmirAbbas8</link>
        <description>https://amirabbas.me</description>
        <language>fa</language>
        <pubDate>2026-06-07 06:32:43</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/11692/avatar/YEdL9H.jpeg?height=120&amp;width=120</url>
            <title>امیرعباس</title>
            <link>https://virgool.io/@AmirAbbas8</link>
        </image>

                    <item>
                <title>تنسورفلو ۱۳: دسته بندی ویدئو</title>
                <link>https://virgool.io/dataio/tf-pk40sassimmw</link>
                <description>سلامبعد از چند ماه یه آموزش جدید به سری تنسورفلو اضافه می کنم :-)در این آموزش می خواهیم ویدئو های دیتاست IXMAS Actions رو دسته بندی کنیم.این دیتاست یکی از دیتاست های مورد استفاده در زمینه HAR یا تشخیص فعالیت های انسانی هستنمونه ای از داده های IXMAS در این دیتاست تعدادی ویدئو از چند فرد با چند دوربین در جهت های مختلف ضبط شده که افراد ۱۱ تا فعالیت مختلف رو انجام می دن.قدم اولدیتاست رو از اینجا دانلود کنید و محیط توسعه رو فراهم کنید :)قدم دومدر این قدم قصد داریم ویدئو رو به یک سری فریم تبدیل کنیم برای اینکار از  openCV استفاده می کنیمبرای نصب openCV از خط زیر استفاده کنید:pip install opencv-pythonیک فایل پایتون به اسم vid-img-convertor.py بسازید و تکه کد زیر رو داخلش قرار بدید این کد کمک می‌کنه تا چند فریم از هر کدوم از clip ها استخراج کنیم:import cv2
from os import listdir
folder_name = &amp;quotnixmas&amp;quot


def getFrame(sec, vid_name):
    vidcap.set(cv2.CAP_PROP_POS_MSEC, sec*1000)
    hasFrames, image = vidcap.read()
    if hasFrames:
        # save frame as JPG file
        cv2.imwrite(folder_name+&amp;quot-img/&amp;quot+vid_name+&amp;quot_&amp;quot+str(count)+&amp;quot.jpg&amp;quot, image)
    return hasFrames


for item in listdir(folder_name):
    print(item)
    if item.endswith(&#039;.avi&#039;):
        vidcap = cv2.VideoCapture(folder_name+&#039;/&#039; + item)
        vid_name = item.replace(&#039;.avi&#039;, &#039;&#039;)
        sec = 0
        frameRate = 0.5  # //it will capture image in each 0.5 second
        count = 1
        success = getFrame(sec, vid_name)
        while success:
            count = count + 1
            sec = sec + frameRate
            sec = round(sec, 2)
            success = getFrame(sec, vid_name)
        vidcap.release()قدم سوماز الان می‌تونیم شروع کنیم که با تنسورفلو کار کنیم. ابتدا کتاب‌خانه های لازم رو وارد می ‌کنیمimport tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.models import Model

from sklearn.preprocessing import LabelEncoder

import matplotlib.pyplot as plt

from PIL import Image
import os
import numpy as np

colors = plt.rcParams[&#039;axes.prop_cycle&#039;].by_key()[&#039;color&#039;]یک تابع تعریف می کنیم که تغییرات loss function رو چاپ کنیمdef plot_loss(history, label, n):
  # Use a log scale to show the wide range of values.
  plt.semilogy(history.epoch,  history.history[&#039;loss&#039;],  color=colors[n], label=&#039;Train &#039;+label)
  plt.semilogy(history.epoch,  history.history[&#039;val_loss&#039;], color=colors[n], label=&#039;Val &#039;+label, 
                       linestyle=&amp;quot--&amp;quot)
  plt.xlabel(&#039;Epoch&#039;)
  plt.ylabel(&#039;Loss&#039;)
  
  plt.legend()بعد دیتا ها رو load می کنیمdata_x = []
data_y = []
for path in os.listdir(&#039;./nixmas-img&#039;):
    img = Image.open(&#039;nixmas-img/&#039;+path)
    data_x.append(np.array(img))
    data_y.append(path.split(&#039;_&#039;)[3])
print({i:data_y.count(i) for i in data_y})
le = LabelEncoder()
a = le.fit_transform(data_y)
b = np.zeros((a.size, a.max()+1))
b[np.arange(a.size),a] = 1
data_y = aفرمت دیتا ها رو اطلاح می کنیم و همچنین دیتا ها رو تقسیم بر 255 می کنیم چون هر پیکسل مقداری بین 0 تا 255 داره و می خواهیم مقادیر بین 0 تا 1 قرار بگیرهdata_x = np.array(data_x)
data_x = data_x.astype(np.float32)
data_x /= 255.0دیتا ها رو به فرمت دیتاست تنسورفلو تبدیل می کنیمdataset = tf.data.Dataset.from_tensor_slices((data_x, data_y))
dataset = dataset.cache().shuffle(10000)دیتاستمون رو به چند قسمت برای test, validate و train تقسیم می‌کنیمtest_dataset = dataset.take(30).batch(10)val_dataset = dataset.skip(30).take(100).batch(10)train_dataset = dataset.skip(130).batch(100)حالا که دیتا آماده است سعی می کنیم مدل رو بسازیم. برای این تسک از الگوریتم CNN استفاده می‌کنیم توی این پست در مورد CNN صحبت کردمmodel = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation=&#039;relu&#039;, input_shape=(64, 48, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation=&#039;relu&#039;))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation=&#039;relu&#039;))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation=&#039;relu&#039;))
model.add(layers.Dense(11))الان دیگه می‌تونیم مدل رو compile کنیم و نتیجه ساختار مدل رو مشاهده کنیمmodel.compile(optimizer=&#039;adam&#039;, 
               loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),       
               metrics=[&#039;accuracy&#039;])
model.summary()Model: &quot;sequential&quot;_________________________________________________________________Layer (type)                 Output Shape              Param #   =================================================================conv2d (Conv2D)              (None, 62, 46, 32)        896       _________________________________________________________________max_pooling2d (MaxPooling2D) (None, 31, 23, 32)        0         _________________________________________________________________conv2d_1 (Conv2D)            (None, 29, 21, 64)        18496     _________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 14, 10, 64)        0         _________________________________________________________________conv2d_2 (Conv2D)            (None, 12, 8, 64)         36928     _________________________________________________________________flatten (Flatten)            (None, 6144)              0         _________________________________________________________________dense (Dense)                (None, 64)                393280    _________________________________________________________________dense_1 (Dense)              (None, 11)                715       =================================================================Total params: 450,315Trainable params: 450,315Non-trainable params: 0خب بالاخره می‌تونیم مدل رو train کنیمhistory = model.fit(train_dataset, validation_data=val_dataset, epochs=60)بیایید نمودار بکشیم :-)plot_loss(history, &amp;quothistory&amp;quot, 1)نمودار loss functionببینید نمودار نزولی هست و همزمان ‌‌loss دیتاست validate و train در حال کاهش هست. نکته مهم اینه که نمودار val تقریبا همزمان با train در حال کاهش هست و معنی این رو میده که مدل overfit نشده اما نوسانات آخر می‌تونه معنی بده شاید چون دیتا کمه. شاید اگه از الگوریتم دیگه مثل RNN استفاده کنیم چونکه ورودی ما ویدئو هست نتیجه بهتر هم بشهدر آخر هم بر روی دیتاست تست خروجی رو تست می کنیمmodel.evaluate(test_dataset)خروجی که من از این مدل گرفتم به صورت زیر است:train_loss: 0.0541 - train_accuracy: 0.9819val_loss: 0.0097 - val_accuracy: 1.0000test_loss: 0.0829 - test_accuracy: 0.9667</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Sun, 16 Aug 2020 12:16:29 +0430</pubDate>
            </item>
                    <item>
                <title>نه به سرور؟ Serverless</title>
                <link>https://virgool.io/@AmirAbbas8/faas-gxi9qxmhdqzp</link>
                <description>در این مقاله قرار هست کلی درباره Serverless صحبت کنم، اینکه چی هست؟ چرا هست؟ و چرا بهتره استفاده کنیم؟ همچنین اینکه کجا استفاده نکنیم در آخر هم یک نمونه عملی از فایربیس رو باهم می‌بینیممعماری سرورلس آمازونآیا با یک مفهوم جدید روبرو هستیم؟خب نه! توی حوزه علوم کامپیوتر یک مفهومی که همیشه وجود داره عدم انجام کار های تکراری هست، به طور مثال شما وقتی با یک کد متن باز روبرو می شید اگه ایده جدیدی به ذهنتون رسید خیلی راحت اون ایده رو پیاده می کنید و نیاز نیست از ابتدا شروع کنید کار هایی که قبلا انجام شده را انجام بدید یا به اصطلاح عدم اختراع مجدد چرخ، یا مثلا درفرآیند DevOps سعی می کنیم کار های تکراری رو اتوماتیک کنیم و از چرخه های وقت گیر خودمون نجات بدیم.هرچیزی به DevOps می‌رسه :Dپس به طور خلاصه میشه گفت که هدف ساده سازی فرآیند توسعه، افزایش انتزاع و کاهش کارهای عملیاتی هست.سرورلس هم در ادامه همین مفهوم هست و قراره به شما کمک کنه تمرکزتون رو روی توسعه ایده خودتون بزارید تا سایر موارد که در توسعه یک نرم افزار نیاز به انجام داره مثل تنظیم سرور و ...سرورلس چی هست؟سرورلس یک روش هست که منابع سروری که شما نیاز دارید رو یک خدمت دهنده برای شما فراهم می کنه و زحمت تنظیمات یک سرور رو از روی دوش شما بر می‌داره.شما وقتی یک پروژه نرم افزاری رو شروع می کنید علاوه بر فرآیند کد زنی، نیاز دارید که نرم افزار خودتون رو روی یک سروری مستقر کنید و به کاربرانتون خدمت بدید.پس شما علاوه بر توسعه محصول خودتون باید با مفاهیم سرور هم آشنا بشید، بتونید امنیت سرور خودتون رو تامین کنید، همچنین باید با مفاهیم مقیاس پذیری و مدیریت سرور هم حتی آشنا بشید.تازه روز به روز با افزایش کاربرانتون با چالش های جدیدی هم روبرو می شید. شما هدفتون توسعه ایده خودتون بود ولی الان کلی چالش دیگه هم در مسیر دارید که باید پاسخ بدید. تازه شما گاهی وقت ها هزینه منابعی رو پرداخت می کنید که بعضی مواقع بدون استفاده هستند.در روز های اولیه اینترنت هرکسی که می خواست یک خدمتی بده باید یه سرور می خرید و همه کار های فنی رو انجام می داد. حتی کار هایی مثل اتصال به برق، خنک‌سازی و...بعد از این قضیه ابر ها یا Cloud ها اومدن که خیلی از کار رو راحت کردن. شما سرور های مورد نظر خودتون رو اجاره می کنید و استفاده می کنید ولی اتفاقی که میفته شما اغلب مواقع منابعی که خریدید رو استفاده نمی کنید و اون منابع برای مواقعی هست که بار زیادی روی سرور شما هست.در سرورلس خدمتی که شما می گیرید در پرداخت انعطاف پذیر هست و شما فقط هزینه استفاده واقعی خودتون رو از منابع می پردازید و شاید یکمی معنی این کلمه &quot;بی سرور&quot; گیج کننده باشه ولی به این معنی هست که تمام دغدغه های مدیریت زیرساخت و سرور با خدمت دهنده هست و شما تمرکز خودتون رو بر روی توسعه محصول خودتون قرار می دید.سرویس دهنده ها: IaaS, PaaS, SaaS, FaaSسطح انتزاع در aaS  هازیرساخت به عنوان خدمتدر ایران اکثر این خدمت رو می بینیم که شما یک سرور مجازی یا سرور اختصاصی می گیرید و استفاده می کنید.در این خدمت همه تنظیمات سرور با خودتون هست. البته بعضی از خدمات رو مثل DNS و CDN رو می تونید از خدمت دهنده های موجود استفاده کنید.از خدمات دهنده های داخلی میشه به زیرک، پارس پک، آروان و... اشاره کرد.سکو به عنوان خدمتدر این خدمت به‌جای اینکه یک سرور کامل بگیرید یک سکو ابری آماده می شه و استفاده می کنید. مثلا می شه پلتفرم ابری آروان رو نام برد که شما با یک کانفیگ ساده k8s ازش استفاده کرد. نرم افزار به عنوان خدمتدر این خدمت شما یک نرم افزاری را به مخاطب ارائه میدید. مثلا انتشارات ویرگول رو می تونیم یک SaaS بشناسیم.تابع به عنوان خدمتسرورلس اینجا قرار می گیره در این بخش شما یک سری تابع می نویسید و هر تابع یک رخدادی رو پاسخ میده. مثلا یک رخداد می تونه درخواست post به یک API باشه.سایر موارد مثل مقیاس پذیری و... کلا با خودشونه :دیدر این مورد متاسفانه نمونه داخلی فعلا نداریم ولی در این مقاله قصد داریم با FireBase کار کنیم.سرورلس چه مزایایی داره؟هزینه کمترشما فقط هزینه منابع مصرفی در زمان رو پرداخت می کنید.مقیاس پذیری راحت ترنگرانی درباره مقیاس پذیری ندارید و وقتی که کاربرانتون زیاد میشه منابع افزایش پیدا می کنه و وقتی کاربران کم می شند منابع کم میشه.همچنین چونکه کد صرفا بر روی یک سرور اصلی قرار نداره میشه توابع رو در سرور های مختلفی نزدیک به کاربران اجرا کرد و اینکار باعث میشه تاخیر کمتر بشهکد بک اند ساده ترتمرکزتون رو روی توابع می گذارید و نیاز نیست خیلی از موارد رو کدش رو بزنید.استقرار سریعترخیلی سریع تغییرات رو انتشار می دید و کاربران می تونن استفاده کننسرورلس چه معایبی داره؟برای فرآیندهای طولانی مدت ساخته نشده استالبته باید دقت کنید که سرورلس برای پروسس های طولانی مناسب نیست زیرا زمان زیادی کد شما در حال اجرا هست و باعث نمیشه منابع آزاد بشه که هزینه هاتون کم بشه.آزمایش و اشکال زدایی چالش برانگیز تر می شودبه دلیل اینکه توابع نوشته شده توابع کوچک و جداشده ای هستند و برنامه نویس ها هم دیدی به فرآیند سمت سرور ندارند یک مقدار اشکال زدایی سخت میشهعملکرد ممکن است تحت تأثیر قرار گیردچونکه یک تابع همیشه اجرا نمیشه دفعات اولی که یک تابع فراخوانی میشه نیاز هست که تابع اصطلاحا &quot;boot up&quot; بشه و این یه مقدار زمان اجرا رو کند تر میکنه درخواست برای اجرای یک تابع آماده شروع گرم شناخته می شه و درخواست برای تابعی که مدت زمانی هست فراخوانی نشده شروع سرد شناخته میشه. در شروع سرد نیاز به زمان boot up هست.تفاوت Serverless و Containerکانیتنر ها مثل داکر و یا سرورلس ها مثل فایربیس هدفشون اینه که سربار کارای نگه داری رو کم کنن و شما توجهتون رو بزارید روی نوشتن کد.تفاوت هم اینکه وقتی از کانتینر ها استفاده می کنید یک سری از منابع صرف آپ بودن کانتینر میشه درسته که کانتینر ها به اندازه VM ها منابع استفاده نمی کنند ولی بازم یک سری منابع نیاز دارند. اما سرورلس تو فقط یک سری تابع می نویسی و منابعی که استفاده می کنی در حد همون توابعه و این باعث کاهش هزینه ها و تقسیم هزینه های مشترک بین افراد مختلف میشه.یه تفاوت دیگه هم هست وقتی شما از کانتینر ها استفاده می کنی فرآیند scale یا مقیاس پذیری باز هم با خودتوهن، درسته خیلی راحت تره ولی شما باید تصمیم بگیرید منابع رو کم و زیاد کنید اما در سرورلس این کار ها هم با ارائه دهنده خدمته.فایربیسفایربیس یکی از سرویس های گوگل هست که استفاده های مختلف و باحالی داره از استفاده های تحلیلی تا دیتابیس، پوش ناتیفیکیشن، گزارش خطا و...یکیش هم خدمات FaaS هست که می خوام یه نمونه نشونتون بدم :-)اول باید بریم به آدرس فایربیس و یک پروژه جدید بسازیم ساخت پروژه در کنسول فایربیستنظیمات پروژه در کنسول فایربیسباید npm رو نصب داشته باشیمبعد فایربیس رو به وسیله ترمینال نصب کنیم و یک پروژه جدید بسازیمnpm install -g firebase-tools
firebase login
mkdir test
cd test
firebase init             ایجاد پروژهنوشتن تابعاستقرار تابعتابع رو در این لینک ببینید البته با IP خارج از ایران...شاد باشید :-)منبع: CloudFlare</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Fri, 05 Jun 2020 18:17:25 +0430</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۱۲ : RNN</title>
                <link>https://virgool.io/dataio/tf-qvrexxyrr7pb</link>
                <description>چرا به RNN نیاز داریم؟ساختار شبکه عصبی معمولی نسبتا ساده هست و اصولا کاری که می کنه ضرب ماتریس هاست. ابتدا ورودی ها در یک سری  وزن های رندم ضرب میشند و این فرآیند طی میشه تا وزن ها تصحیح بشن معیار استفاده شده loss هست که هرچی بیشتر باشه مدل ضعیف تره  یک سری فعالیت انجام میشه تا معیار بهبود پیدا کنه.مشکل این مدل ها اینکه حافظه ای ندارن به این معنی که ورودی و خروجی از هم مجزا هستند ولی خب وقتی محاسبات با سری های زمانی درگیر بشه یا جملات که یک سری کلمات پشت سر هم هستند چی؟ اینجا قضیه فرق میکنه . مثلا اگه ی مدل قرار باشه نقش کلمه در جمله رو تشخیص بده نیاز داره بقیه کلمات رو هم بدونه نمیتونه فقط با یک کلمه این کار رو کنه.راه کار استفاده از شبکه های عصبی بازگشتی هست شبکه عصبی بازگشتی چیست؟یک شبکه عصبی بازگشتی تقریبا شبیه شبکه های عصبی معمولی هستند با این تفاوت که هر نرون یک واحد حافظه اضافی دارد. یک مدل ساده که فقط یک نرون دارد رو تصور کنید. در شبکه عصبی معمولی خروجی به وسیله ضرب ورودی در وزن و تابع فعال سازی بدست می آید.اما در RNN خروجی به عنوان ورودی به نرون برمی گردد.برای مثال در تصویر زیر مشاهده می کنید که شبک از یک نرون ایجاد شده است و در پایان خروجی به عنوان ورودی مرحله بعدی استفاده می شود.کاربرد های RNNاز کاربرد های  RNN می توان به کاربرد هایی اشاره کرد که در رابطه با پیش بینی آینده هست. مثلا در صنعت اقتصاد با RNN می توان قیمت سهام و جهت گیری بازار بورس را پیش بینی کرد.همچنین با پیش بینی مسیر خودرو می تواند از تصادفات خودرو های خودران پیشگیری کند.از استفاده های اصلی این مدل می توان تحلیل متن،نوشتن عنوان برای تصاویر، تحلیل احساسات،ترجمه متون و... اسم برد. برای مثال یک شرکت سازنده فیلم می تواند با تحلیل نظرات کاربران اجساسات آن ها را نسبت به فیلم تولیدی خود کشف کند.محدودیت های RNNدر تئوری RNN وظیفه داره اطلاعات رو در طول زمان منتقل کنه ولی در عمل اننقال اطلاعات به قدم های جلو تر با چالش روبرو هست. به این مشکل اضمحلال یا ناپدید شدن گرادیان گفته میشه. اگه یادتون باشه شبکه های عصبی به وسیله گرادیان وزن های خود رو بروز میکنن و در طول زمان گرادیان وقتی به لایه های پایین تر میرسه کاهش پیدا میکنه .در مجوع این به این معنی هست که گرادیان ثابت می مونه و جایی برای بهبود باقی نمی مونه. مدل از تغییر در گرادیان یاد می گیره و این تغییرات خروجی مدل رو مورد تاثیر قرار میده. وقتی تغییرات خیلی کوچک باشه شبکه زیاد نمی تونه یاد بگیره و یک مدلی که با مشکل ناپدید شدن گرادیان برخورد کنه نمی تونه یک راه حل خوب ارائه بدهبهبود با LSTMبرای مقابله با مشکل ناپدید شدن گرادیان، ساختار RNN بهبود پیدا کرد و با اسم حافظه کوتاه مدت طولانی شناخته میشه :دی LSTMبه طور خلاصه lstm از معماری بهتری برای انتخاب و انتقال داده های قبلی استفاده میکنه.سخن پایانیخب ی سری نکات هست ک بهتون بگماولا سپاس :) که این سری آموزشی رو مطالعه کردید امیدوارم مفید بوده باشه سعی کردم ساده بگم یجوری که دید بده و بتونید شروع کنید ولی خب برای اینکه دستتون راه بیفته باید خودتون پروژه بزنیددوما اینکه در زمان شروع این آموزش تنسورفلو نسخه ۲ هنوز رسمی منتشر نشده بود ولی الان شده و خب فکر کردم دیدم بهتره بخش کد زدن آموزش های بعد از انتشار رسمی نسخه ۲ با نسخه ۲ باشه که اولیش CNN بود و دومی که این باشه رو میخوام لینک بدم به گوگل کُلب که باهاش کار کنید و تجربه یادگیری از منبع رسمی تنسورفلو رو هم بدست بیارید که هیچ آموزشی به کاملی داکیومنت های رسمی احتمالا نیستلینک آموزشیدر پناه حق باشید :)</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Fri, 15 Nov 2019 23:18:56 +0330</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۱۱ : CNN</title>
                <link>https://virgool.io/dataio/tf-rsktokkuw0r1</link>
                <description>شبکه عصبی پیچشی چیست؟شبکه عصبی پیچشی یا CNN یک متد شناخته شده در برنامه های بینایی ماشین هست که اهدافی از قبیل تشخیص اشیا در تصاویر یا ویدیو ها دارند.قراره یاد بگیریم چگونه یک CNN بسازیم با TF که تصاویر CIFAR  رو دسته بندی کنه :)ساختار یک شبکه عصبی همگشتیاگه با فیس بوک کار کرده باشید اوایل در هر تضویر مشخص می کردید چه کسانی حضور دارند ولی الان به وسیله CNN خودش به صورت هوشمند این کار رو انجام میدهیک CNN معمولی می تونه در تصویر زیر خلاصه بشه. ابتدا یک تصویر به شبکه داده میشه به عنوان ورودی. بعد تصویر ورودی وارد تعدادی قدم محدود میشه که این بخش همگشت ماجراست و در انتها وارد شبکه عصبی میشه که شماره عدد مشخص بشه.CNNیک تصویر از آرایه ای از پیکسل ها تشکیل شده و یک تصویر سیاه و سفید یک کانال داره در حالی که تصویر رنگی سه کانال داره متشکل از رنگ های اصلی قرمز سبز و آبی.عمل همگشت:جز اصلی این مدل لایه همگشت هست که سعی می کنه با کاهش اندازه تصویر سرعت محاسبات را افزایش بده و در عمومی سازی مدل کمک کنه. در طول قسمت همگشت شبکه اجزا اصلی تصویر را حفظ می کنه و اجزا غیر مفید تصویر را خارج می کنه. مثلا در تشخیص فیل از پس زمینه  اگه از شبکه های عصبی سنتی استفاده کنید به پس زمینه تصویر هم وزن هایی داده میشه که شاید حتی شبکه گمراه بشه جدا از سرعت کمتر.در حالی که یک شبکه همگشتی از تکنیک های ریاضی استفاده می کنه که فقط پیکسل های مرتبط را خارج کنه.اجزا شبکه همگشتیهمگشتعمل غیر خطی (ReLU)جمع آوری یا زیر نمونه برداریطبقه بندیهمگشتهدف همگشت استخراج ویژگی های شی داخل تصویر هست به این معنی که شبکه یاد میگیره پترن های خاص داخل تصویر رو تشخیص بده و هرجای دیگه پیدایش کنه.همشگت یک ضرب جز به جز است. مدل هر قسمت از تصویر رو اسکن می کنه عموما با ابعاد 3*3 و در فیلتری ضرب می کنه. خروجی یک نقشه ویژگی یا feature map میشه. این مراحل طی میشه تا تمام تصویر اسکن بشه و پس از همگشت اندازه تصویر نیز کاهش پیدا می کنه.همگشتبرخی از فیلتر ها رو در زیر ببینید:محاسبات همگشتبرای اینکه با جزییات بیشتر ببینید همگشت چجوری کار می کنه به تصویر زیر دقت کنید.Border effectتصویر 5*5 هست ولی فیلتر 3*3 اگه دقت کنید خانه وسط مربع فیلتر بر روی خانه اولی مربع تصویر هیچوقت قرار نمی گیره. حالا اگه بخواهیم این اتفاق بیفته کاری که می کنیم اطراف تصویر یک سطر و ستون عدد 0 قرار میدیم تا این اثر رو جبران کنیم. و این کار باعث میشه ابعاد تصویر ورودی و خروجی یکی بشه.وقتی شبکه رو می سازید ویژگی های تحت عمل همگشت به وسیله سه عامل کنترل میشه:عمق: بیان کننده تعداد فیلتر های اعمالی هست که در مثال قبلی عمق یک بود چون فقط یک فیلتر اعمال شد.اندازه جابه جایی: این معیار تعداد پیکسل هایی که هربار فیلتر بر روی آن ها جا به جا می شود رو تعیین می کنه. مثلا وقتی یک هست در هر مرحله فقط یک خانه جلو میره و اگه ۲ باشه هر مرحله ۲ خانه جلو میره. هرچی stride بیشتر باشه نقشه ویژگی ها کوچکتر میشه.  stride = 1stride = 2صفر گذاری: افزودن سطر و ستون صفر به اطراف نقشه ویژگی هاتابع فعال سازی (ReLU)در پایان هم خروجی به یک تابع فعال سازی داده می شود تا نتیجه غیر خطی شود. عموما در CNN از ReLU استفاده میشه.عملیات جمع حداکثریهدف از این مرحله کاهش اندازه ابعاد تصویر ورودی است برای کاهش پیچیدگی محاسبات و جلوگیری از overfittingیک سری روش ها برای این کار وجود داره مثل انتخاب بزرگترین عدد یا اینکه میانگین گیریلایه های کاملا متصلو آخرین قسمت استفاده از سایر شبکه های عصبی برای پیش بینی نتیجه می باشدتعلیم CNN با TFالتدا تنسورفلو رو وارد می کنیم:from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf

from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as pltدیتاست رو بارگذاری می کنیم :(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

# Normalize pixel values to be between 0 and 1
train_images, test_images = train_images / 255.0, test_images / 255.0یک نگاهی اول کار به داده های می اندازیم:class_names = [&#039;airplane&#039;, &#039;automobile&#039;, &#039;bird&#039;, &#039;cat&#039;, &#039;deer&#039;, &#039;dog&#039;, &#039;frog&#039;, &#039;horse&#039;, &#039;ship&#039;, &#039;truck&#039;]
plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    # The CIFAR labels happen to be arrays, 
    # which is why you need the extra index
    plt.xlabel(class_names[train_labels[i][0]])
plt.show()ساختار مدل رو می سازیم:model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation=&#039;relu&#039;, input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation=&#039;relu&#039;))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation=&#039;relu&#039;))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation=&#039;relu&#039;))
model.add(layers.Dense(10, activation=&#039;softmax&#039;))ساختار مدل رو بررسی می کنیم:model.summary()مدل رو می سازیم و شروع به تعلیم می کنیم:model.compile(optimizer=&#039;adam&#039;,loss=&#039;sparse_categorical_crossentropy&#039;,metrics=[&#039;accuracy&#039;])

history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))نمودار نتیجه رو بررسی می کنیم:plt.plot(history.history[&#039;accuracy&#039;], label=&#039;accuracy&#039;)
plt.plot(history.history[&#039;val_accuracy&#039;], label = &#039;val_accuracy&#039;)
plt.xlabel(&#039;Epoch&#039;)
plt.ylabel(&#039;Accuracy&#039;)
plt.ylim([0.5, 1])
plt.legend(loc=&#039;lower right&#039;)

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)و میزان دقت رو چاپ می کنیم:print(test_acc)منابعwww.tensorflow.orgguru99.com</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Sat, 19 Oct 2019 17:43:28 +0330</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۱۰ : شبکه های عصبی</title>
                <link>https://virgool.io/dataio/tf-l92cwkuz7uiv</link>
                <description>شبکه های عصبی مصنوعی چیست؟یک شبکه عصبی مصنوعی  از چهار قسمت تشکیل شده است.لایه ها: تمام یادگیری داخل لایه ها شکل می گیرد. سه نوع لایه وجود داره 1) ورودی 2) مخفی و 3) خروجیویژگی ها و برچسب ها: ورودی های شبکه و خروجی آنتابع کاهش: معیار اندازی گیری در فاز یادگیریبهبود دهنده: بهبود یادگیری با افزایش دانش در شبکهبا توجه به تصویر بالا برنامه با گرفتن ورودی ها آن ها رو به دو لایه کاملا متصل وارد می کنه.مثلا فرض کنید یک مشکل ریاضی دارید اولین کاری که می کنید صورت سوال رو می خونید. دانش های خودتون رو برای حل سوال به کار می برید و احتمالا حل نمیشه :دی برای شبکه هم همینطوره سپس مثلا با مطالعه بیشتر سعی می کنید دانشتون رو بهبود بدید. برنامه هم همین کار رو می کنه تا وقتی که خطاش به کمترین حد ممکن برسه. و مثلا اگه به جایی برسه که نتونه بهبود بده مثل اینه که یک کتاب رو هزار بار خوندید فایده نداشته مثلا می تونید یک کتاب دیگه رو تست کنید. - چه مثالی شد!ساختار شبکه های عصبیلایه هایک لایه جایی هست که تمام یادگیری شکل می گیره. داخل یک لایه تعدادی نورون وجود داره. یک نوع از شبکه های عصبی شبکه های عصبی هست که تمام نورون های دو لایه همسایه بهم دیگه متصل میشند.یک شبکه عصبی معمولی یک آرایه از ورودی ها میگیره و یک مقدار عددی به عنوان خروجی یا برچسب. یک نمونه راحت دسته بندی دوگانه با شبکه عصبی هست. شبکه ورودی ها رو دریافت می کنه به تمام ند ها می فرسته و سیگنال خروجی رو به وسیله یک تابع فعال سازی محاسبه می کنهتصویر بالا نشون میده که لایه اول ورودی داده هاست و لایه دوم لایه مخفی هست که ورودی های وزن دار رو از لایه قبلی دریافت کرد.ند های اولی ورودی هستندهر نورون به بخش های ورودی و تابع فعالسازی تقسیم میشه. قسمت چپ ورودی ها رو از لایه قبل می گیره و قسمت راست مجموع قسمت ورودی رو به تابع فعالسازی میده. مقدار خروجی از لایه مخفی محسابه میشه. و برای دسته بندی برابر با تعداد دسته هاست. برای رگرسیون فقط عدد تخمین زده میشه.تابع فعالسازیتابع فعالسازی یک ند خروجی آن ند رو مشخص می کنه. شما برای یادگیری الگو های غیر خطی به تابع فعالسازی نیاز دارید. یک فعال ساز معرو Relu هست یا Rectified linear unit که برای اعداد منفی مقدار صفر رو بر می گردونه.توابع فعال سازی دیگه مثل:Piecewise LinearSigmoidTanhLeaky Reluتصمیات حساس در زمان ساخت شبکه عصبی این هست کهتعداد لایه هاچه تعداد ند در هر لایهالبته هرچی لایه ها و ند ها بیشتر باشه می تونه پترن های پیچیده ای یاد بگیره ولی هزینه یادگیری زیاد میشه و در نتیجه زمان بیشتری باید سپری بشه.تابع کاهشبرای دسته بندی دوگانه می تونید از تابع کاهش زیر استفاده کنیدcross entropy loss functionو برای رگرسیون خطی از:mean square errorتابع کاهش معیار مناسبی برای تخمین میزان کارآیی بهبود دهنده هست و در طول یادگیری کاهش پیدا می کنه و باید به دقت بر اساس نوع مسئله انتخاب بشه.بهبود دهندهتابع کاهش یک اندازه گیری برای کارایی مدل هست. بهبود دهنده کمک می کنه با بهبود وزن ها هزینه مدل رو کاهش بده.برخی  از بهبود دهنده ها در زیر می تونید ببینید:Stochastic Gradient DescentMomentum optimization,Nesterov Accelerated Gradient,AdaGrad,Adam optimizationمحدودیت شبکه های عصبیبیش برازش (Overfitting)یک مشکل رایج در شبکه های عصبی پیچیده مشکل تعمیم مدل به داده های مشاهده نشده هست. یک شبکه عصبی با وزن های زیاد می تونه به خوبی داده های داخل مجموعه یادگیری رو به خوبی تشخیص بده ولی داده های دیگه رو به سمت over fitting میره.مخصوصا وقتی که داده ها به طور مساوی بین دسته های مختلف تقسیم نشده باشند.اینجا یک کم و زیاد کردنی بین بهبود و تعمیم مدل وجود داره که بهبود برای کاهش تابع هزینه مدل و تعمیم برای چگونگی برخورد مدل با داده های مشاهده نشده هست.برای اینکه مدل یک سری از الگو های ناخواسته رو داخل داده ها کشف نکنه و دچار مشکل overfit نشه یک سری راهکار تحت عنوان regularization وجود دارهاندازه شبکهیک راه برای کاهش هزینه تعلیم و بیش برازش کاهش اندازه مدل هست در واقع  قانونی برای  اندازه و تعداد لایه ها وجود نداره ولی شما می تونید با مدل های کوچک شروع کنید تا وقتی که به over fit نخوردید.تنظیم وزن هایک راه استاندارد برای مقابله با overfitting افزودن یک سری ثابت به وزن های شبکه هست. مثلاL1: Lasso: متناسب با قدر مطلق وزن هاL2: Ridge: متناسب با مربع وزن هالایه خارج کنندهاگه یک لایه drop put داشته باشه ینی به صورت رندم با یه احتمال که بهش میدیم بعضی از وزن ها ۰ میشه.تعلیم یک شبکه عصبی با تنسورفلوخب می خواییم به وسیله DNNClassifier یک شبکه عصبی بر روی مجموعه داده MNIST بسازیم. خیلی ساده:البته این رو با کراس می زنیم import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer=&#039;adam&#039;,
              loss=&#039;sparse_categorical_crossentropy&#039;,
              metrics=[&#039;accuracy&#039;])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)خلاصهیک شبکه عصبی شامل موارد زیر هست:تعداد لایه های مخفیتعداد ند های کاملا مرتبطتابع فعال سازیبهبود دهندهتعداد دسته ها</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Mon, 15 Jul 2019 19:10:51 +0430</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۹‌ : متد های کرنل</title>
                <link>https://virgool.io/@AmirAbbas8/tf-cjxr5xfle1nx</link>
                <description>هدف این آموزش این است که یک مجموعه داده رو به صورت خطی جدا کنیم و به دو قسمت تقسیم میشهتبدیل ویژگی هاآموزش یک دسته بندی با کرنل به وسیله تنسورفلودر قسمت اول در مورد ایده پشت یک دسته بند کرنل آشنا میشیم و در قسمت دوم ازش استفاده می کنیم. از مجموعه داده بزرگسالان استفاده می کنیم و هدف اینه ک درآمد رو زیر و بالای 50k تقسیم کنیم.چرا به متد های کرنل نیاز داریم?هدف هر دسته بند پیش بینی دسته به صورت درست هست. برای همین داده ها باید از هم جدا شده باشند. به نمودار زیر نگاه کنید خیلی ساده مشاهده می کنید که داده های بالای خط مربوط به یک دسته و داده های پایین مربوط به یک دسته دیگه هستند. البته این نمونه بیش از اندازه ساده هست و در واقعیت داده ها اینگونه جدا نیستند و دسته بندی رو برای رگرسیون منطقی سخت می کنند.یا مثلا داده های زیر رو نمیشه با یک خط صاف دسته بندی کردیک راه برای کنار اومدن با این مشکل تبدیل داده هاست .مثلا داده های بالا دو بعدی هست ولی اگه سه بعدی بشه احتمالا بتونیم با یه خط راست دسته بندی کنیمیک فرمول برای تبدیل داده هاخب الان بهتر شد ولی اگه جهت نمودار رو عوض کنیم جداگانه بودن نمودار بهتر قابل مشاهده هستبرای یک مجموعه داده بزرگ که احتمالا بیشتر از دو بعد داده داره مشکل بزرگی هست که به وسیله شیوه بالا داده ها تبدیل بشن و مشکلاتی از قبیل کمبود حافظه این کار رو عملا غیر ممکن کنهرایج ترین کار برای غلبه بر این مشکل استفاده از کرنل هستدر یادگیری ماشین کرنل چیست؟ایده ما این هست که از یک بعد بیشتر برای فضای ویژگی ها استفاده کنیم تا داده ها تقریبا خطی بشند مثل مثالی که در بالا نشان داده شد.قدرت کرنل این هست که یک تابعی پیدا کنه که تمام مشکلاتی که توسط محاسبات یک بعد بیشتر ایجاد میشه رو حل کنه. خروجی یک کرنل خطی هست یا به عبارتی بر می گردیم به تک بعد. بعد از این که این تابع رو پیدا کردید شما می تونید در دسته بند خطی استاندارد ازش استفاده کنید.انواع متد های کرنلانواع مختلفی از متد های کرنل وجود داره که ساده ترین کرنل خطی هست که برای دسته بندی متن ها خوب عمل می کنه و دو نوع دیگه:کرنل چند جمله ایکرنل گاوسیدر مثال با تنسورفلو از فوریه تصادفی استفاده می کنیم. تنسورفلو یک سری تخمین گر داره که فضای ویژگی های جدید را می سازه.یک تقریب از تابع کرنل گاوسی که شباهت را بین نقطه های داده ها در ابعاد بزرگتر پیدا می کنه.آموزش کرنل دسته بندی گاوسی با تنسورفلوهدف الگوریتم تخمین این که حقوق زیر ۵۰ ک هست یا بیشتر از  آن.از رگرسیون خطی استفاده می کنیم و بعد از آن با استفاده از دسته بند کرنل سعی می کنیم نتایج بهتری بگیریممرحله ۱) ورود کتابخانه ها#import numpy as np
from sklearn.model_selection import train_test_split
import tensorflow as tf
import pandas as pd
import numpy as npمرحله ۲) ورود داده ها## Define path data
COLUMNS = [&#039;age&#039;,&#039;workclass&#039;, &#039;fnlwgt&#039;, &#039;education&#039;, &#039;education_num&#039;, &#039;marital&#039;, &#039;occupation&#039;, &#039;relationship&#039;, &#039;race&#039;, &#039;sex&#039;, &#039;capital_gain&#039;, &#039;capital_loss&#039;, &#039;hours_week&#039;, &#039;native_country&#039;, &#039;label&#039;]
PATH = &quot;https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data&quot;
PATH_test =&quot;https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test&quot;
## Import 
df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False)
df_test = pd.read_csv(PATH_test,skiprows = 1, skipinitialspace=True, names = COLUMNS, index_col=False)تغییر برچسب ها از متن به عددlabel = {&#039;&lt;=50K&#039;: 0,&#039;&gt;50K&#039;: 1}
df_train.label = [label[item] for item in df_train.label]
label_t = {&#039;&lt;=50K.&#039;: 0,&#039;&gt;50K.&#039;: 1}
df_test.label = [label_t[item] for item in df_test.label]	
df_train.shape	مرحله ۳) آماده سازی داده هاداده ها ویژگی های پیوسته و گسسته دارند. یگ کار خوب استاندارد سازی مقادیر متغیر های پیوسته هست. از توابع سایکیت برای این کار استفاده می کنیم.COLUMNS_INT = [&#039;age&#039;,&#039;fnlwgt&#039;,&#039;education_num&#039;,&#039;capital_gain&#039;, &#039;capital_loss&#039;, &#039;hours_week&#039;]
CATE_FEATURES = [&#039;workclass&#039;, &#039;education&#039;, &#039;marital&#039;, &#039;occupation&#039;, &#039;relationship&#039;, &#039;race&#039;, &#039;sex&#039;, &#039;native_country&#039;]
from sklearn.preprocessing import StandardScaler
from sklearn import preprocessing
def prep_data_str(df):
    scaler = StandardScaler() 
    le = preprocessing.LabelEncoder() 
        df_toscale = df[COLUMNS_INT]
        df_scaled = scaler.fit_transform(df_toscale.astype(np.float64)) 
        X_1 = df[CATE_FEATURES].apply(le.fit_transform) 
        y = df[&#039;label&#039;].astype(np.int32) 
        X_conc = np.c_[df_scaled, X_1].astype(np.float32)
        return X_conc, yو اعمال تبدیل داده هاX_train, y_train = prep_data_str(df_train)
X_test, y_test = prep_data_str(df_test)
print(X_train.shape)مرحله ۴) ساخت مدل منطقی : مدل پایهساخت ستون ویژگی هاfeat_column = tf.contrib.layers.real_valued_column(&#039;features&#039;, dimension=14)		ساخت برآوردگرestimator = tf.estimator.LinearClassifier(feature_columns=[feat_column],n_classes=2,model_dir = &quot;kernel_log&quot; )ساخت تابع ورود داده ها# Train the modeltrain_input_fn = tf.estimator.inputs.numpy_input_fn(x={&quot;features&quot;: X_train}, y=y_train, batch_size=200, num_epochs=None,shuffle=True)	آموزش مدلestimator.train(input_fn=train_input_fn, steps=1000)مرحل ۶) ارزیابی مدل# Evaluation
test_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={&quot;features&quot;: X_test},
    y=y_test,
    batch_size=16281,
    num_epochs=1,
    shuffle=False)
estimator.evaluate(input_fn=test_input_fn, steps=1)دقت اولیه که بدست آوردیم ۸۲ درصد و خب سعی کنیم بهبودش بدیممرحله ۷) ساخت کرنل دسته بندیساخت برآوردکننده کرنل زیاد با  ساخت دسته بند خطی فرق نداره.در قسمت اول یاد گرفتید که باید به وسیله تابع کرنل از بعد کم به بعد بیشتر تبدیل انجام بدید. قراره از تابع  RandomFourierFeatureMapper استفاده کنیم و به وسیله KernelLinearClassifier مدل رو بسازیم.برای ساخت مدل باید قدم های زیر رو برداریمتعریف تابع کرنلتنظیم پارامتر L2ساخت مدلآموزش مدلارزیابی مدلمرحله الف) تنظیم تابع کرنلمجموعه داده کنونی ۱۴ ویژگی داره که می خواییم به بعد بالاتر ۵۰۰۰ تبدیل کنیم.### Prep Kernel
kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name=&#039;rffm&#039;)			### Map Kernel
kernel_mappers = {feat_column: [kernel_mapper]}			مرحله ب) تنطیم پارامتر L2 (برای مقابله با overfitting)optimizer = tf.train.FtrlOptimizer(learning_rate=5, l2_regularization_strength=0.1)مرحله پ) ساخت مدل### Prep estimator
estimator_kernel = tf.contrib.kernel_methods.KernelLinearClassifier(
    n_classes=2,
    optimizer=optimizer,
    kernel_mappers=kernel_mappers, 
    model_dir=&quot;kernel_train&quot;)مرحله ت) آموزش مدل### estimate 
estimator_kernel.fit(input_fn=train_input_fn, steps=2000)مرحله ث) ارزیابی مدلtest_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={&quot;features&quot;: X_test},
    y=y_test,
    batch_size=16281,
    num_epochs=1,
    shuffle=False)
# Evaluate and report metrics.
eval_metrics = estimator_kernel.evaluate(input_fn=test_input_fn, steps=1)خلاصهکرنل ابزار مناسبی برای تبدیل داده های غیر خطی به داده های خطی هست که عملی زمان بر هست.</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Fri, 12 Jul 2019 19:56:04 +0430</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۸ : دسته بندی خطی</title>
                <link>https://virgool.io/dataio/tf-rucnh5xf5o0q</link>
                <description>دسته بندی خطی چیست؟در یادگیری تحت نظارت رگرسیون خطی و دسته بندی خطی رایج ترین الگوریتم ها هستند. رگرسیون خطی یک مقدار رو تخمین می زنه و دسته بندی خطی یک دسته رو.دسته بندی میزان احتمال اینکه ورودی متعلق به چه دسته ای هست رو بر میگردونه. و برچسب یک مقدار گسسته هست که نمایانگر یک دسته هست.اگه دو برچسب داشته باشیم دسته بندی دوگانه هست و در غیر این صورت چندگانهمثال دسته بندی دوگانه این هست که آیا یک مشتری برای بار دوم خرید می کند یا نمی کند. و تشخیص نوع حیوان موجود در تصویر چند گانه هست.دسته بندی دوگانه چگونه کار می کند؟همونطور که قبلا یاد گرفتیم یک تابع از دو نوع متغیر  ساخته شده متغیر مستقل و متغیر وابسته. در رگرسیون خطی یک متغیر وابسته یک عدد حقیقی بدون مرز هست و هدف اصلی تخمین این عدد با کاهش میانگین مربع خطا هست.در یک دسته بندی دوگانه برچسب دو عدد صحیح مختلف می تونه باشه. مثلا ۰ یا ۱. که مثلا صفر ینی خرید مجدد انجام نمیده و یک ینی خرید مجدد انجام میده.احتمال موفقیت به وسیله &lt;&lt;رگرسیون منطقی&gt;&gt; تشخیص داده میشهتابع به دو قسمت تقسیم میشهمدل خطیتابع منطقیمدل خطیشما از قبل با اینکه چجوری وزن ها محاسبه میشه آشنا هستید وزن ها نمایانگر نحوه ارتباط متغیر های x و y هست. مدل خطی در پایان یک عدد حقیقی بر میگردونه که به وسیله تابع منطقی به صفر یا یک تبدیل میشه.تابع منطقیتابع منطقی یا تابع سیگموئید شکلی شبیه به S داره که خروجی تابع همیشه بین صفر و یک هست و اگه عدد خروجی بین ۰ تا ۰.۴۹ بود مثلا میگیم در دسته ۰ و اگه بین ۰.۵ تا ۱ بود در دسته ۱ قرار می گیره.چگونه کارایی یک مدل دسته بندی خطی را بسنجیم؟دقت مدلکارایی  کلی یک دسته بند به وسیله میزان دقت اندازه گرفته می شه. برای محاسبه دقت تعداد پاسخ های درست رو بر تعداد کل مشاهدات  تقسیم می کنیم. مثلا دقت ۸۰٪ ینی مدل برای ۸۰ درصد داده ها به درستی تخمین زده.البته یک نکته ای که باید دقت کنیم تعادل داشتن پایگاه دانش هست. مثلا اگه ما یه دیتاستی داشته باشیم درباره تعداد مرگ و میر و ۹۵ ٪ داده ها عضو دسته مرگ باشند و بقیه عضو دسته کسایی که فوت نکردن. اگه مدل ما همیشه فوت کردن رو پیش بینی کنه می تونه دقت ۹۵ ٪ داشته باشه!!!!ماتریس درهم‌ریختگیماتریس درهم‌ریختگی دقت یک دسته بند رو بر اساس مقایسه مقدار واقعی و مقدار تخمین زده شده محاسبه می کنه و دارای اجزا زیر هست:مثبت درست: TP : مقدار تخمین زده شده به درستی به عنوان درست تخمین زده شده استمثبت نادرست: FP : مقدار تخمین زده شده به اشتباه به عنوان درست تخمین زده شده استمنفی نادرست : FN: مقدار تخمین زده شده به اشتباه به عنوان نادرست تخمین زده شده استمنفی درست: TN : مقدار تخمین زده شده به درستی به عنوان نادرست تخمین زده شده استدقت و حساسیتبه وسیله ماتریس درهم‌ریختگی میشه به طور دقیق تر کارایی رو محاسبه کرد.صحت (Precision)معیار صحت نشان می دهد پیش بینی کلاس های مثبت چه تعداد درست است.وقتی که مدل به درستی تمام مقادیر مثبت را پیش بینی کرده مقدار یک هست.این معیار به تنهایی کافی نیست زیرا مقادیر منفی را در نظر نمی گیرد عموما با معیار حساسیت باهم بررسی می شود.حساسیت(Recall)حساسیت نسبت مقادیر مثبت درست تخمین شده رو نشون میده. این معیار نشان می دهد که چه مقدار یک مدل در تشخیص اعضا کلاس مثبت خوب عمل می کند.دسته بندی خطی با TensorFlowبرای  این  آموزش از داده های سرشماری استفاده می کنیم. هدف این است که با استفاده از مقادیر دیتاست سرشماری سطح درآمد فرد رو تخمین بزنیم که خروجی دوگانه هست. برای مقادیر بیشتر از 50k یک و در غیر این صورت صفر بر می گرداند.دیتاست شامل مقادیر زیر می شود:محل کارتحصیلاتوضعیت ازدواجاشتغالرابطهنژادجنسیتکشور اصلیو مقادیر پیوسته:agefnlwgteducation_numcapital_gaincapital_losshours_weekبا این آموزش قراره با دسته بندی توسط تنسورفلو آشنا بشیم و اینکه چجوری دقت مدل رو افزایش بدیم.مرحله ۱) ورود داده هاابتدا لایبرری ها رو وارد می کنیمimport tensorflow as tf
import pandas as pdسپس دیتا ها رو وارد می کنیم.## Define path data
COLUMNS = [&#039;age&#039;,&#039;workclass&#039;, &#039;fnlwgt&#039;, &#039;education&#039;, &#039;education_num&#039;, &#039;marital&#039;,
&#039;occupation&#039;, &#039;relationship&#039;, &#039;race&#039;, &#039;sex&#039;, &#039;capital_gain&#039;, &#039;capital_loss&#039;,
&#039;hours_week&#039;, &#039;native_country&#039;, &#039;label&#039;]
PATH = &quot;https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data&quot;
PATH_test = &quot;https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test&quot;df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False)
df_test = pd.read_csv(PATH_test,skiprows = 1, skipinitialspace=True, names = COLUMNS, index_col=False)print(df_train.shape, df_test.shape)
print(df_train.dtypes)تنسورفلو برای تعلیم مدل نیاز به یک مقدار Boolean داره برای کلاس بندی داده ها. و باید string ها رو به int تبدیل کنیمlabel = {&#039;&lt;=50K&#039;: 0,&#039;&gt;50K&#039;: 1}
df_train.label = [label[item] for item in df_train.label]
label_t = {&#039;&lt;=50K.&#039;: 0,&#039;&gt;50K.&#039;: 1}
df_test.label = [label_t[item] for item in df_test.label]print(df_train[&quot;label&quot;].value_counts())
### The model will be correct in atleast 70% of the case
print(df_test[&quot;label&quot;].value_counts())
## Unbalanced label
print(df_train.dtypes)مرحله ۲) تبدیل داده هاباید داده ها رو برای ورود به مدل آماده کنیم. تخمین گر نیاز به لیست ویژگی ها برای تعلیم مدل داره و از این رو باید داده ستون ها به tensor تبدیل شود.یک کار خوب تعریف دو لیست از مقادیر بر حسب نوع آن هاست (پیوسته و گسسته)و سویژگی های این دیتاست از دو نوع هستند.IntegerObjectویژگی های مختلف بر حسب گروه آن ها در زیر می بینید:## Add features to the bucket: 
### Define continuous list
CONTI_FEATURES = [&#039;age&#039;, &#039;fnlwgt&#039;,&#039;capital_gain&#039;, &#039;education_num&#039;, &#039;capital_loss&#039;, &#039;hours_week&#039;]
### Define the categorical list
CATE_FEATURES = [&#039;workclass&#039;, &#039;education&#039;, &#039;marital&#039;, &#039;occupation&#039;, &#039;relationship&#039;, &#039;race&#039;, &#039;sex&#039;, &#039;native_country&#039;]در کد زیر مقادیر پیوسته رو به تنسور های با مقادیر عددی تبدیل می کنیم.این کار برای ساخت مدل اجباریه. همه مقادیر مستقل باید به نوع تنسور صحیح خود تبدیل شود.def print_transformation(feature = &quot;age&quot;, continuous = True, size = 2): 
    #X = fc.numeric_column(feature)
    ## Create feature name
    feature_names = [
    feature]

    ## Create dict with the data
    d = dict(zip(feature_names, [df_train[feature]]))

    ## Convert age
    if continuous == True:
        c = tf.feature_column.numeric_column(feature)
        feature_columns = [c]
    else: 
        c = tf.feature_column.categorical_column_with_hash_bucket(feature, hash_bucket_size=size) 
        c_indicator = tf.feature_column.indicator_column(c)
        feature_columns = [c_indicator]
    
## Use input_layer to print the value
    input_layer = tf.feature_column.input_layer(
        features=d,
        feature_columns=feature_columns
        )
    ## Create lookup table
    zero = tf.constant(0, dtype=tf.float32)
    where = tf.not_equal(input_layer, zero)
    ## Return lookup tble
    indices = tf.where(where)
    values = tf.gather_nd(input_layer, indices)
    ## Initiate graph
    sess = tf.Session()
    ## Print value
    print(sess.run(input_layer))
print_transformation(feature = &quot;age&quot;, continuous = True) continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]برای تبدیل داده های گسسته راه های مختلفی وجود داره یکی اینکه مثلا اگه داده ها محدود هستن تبدیل به id شود مثلا همسر، شوهر،مجرد بشه ۱ ۲ ۳یک راه دیگه اینه که هر متغییری یک ستون جدا بشه و مقدار صفر یا یک داشته باشه مثلا ستون مرد و ستون زن بجای تک ستون جنسیتprint_transformation(feature = &quot;sex&quot;, continuous = False, size = 2)relationship = tf.feature_column.categorical_column_with_vocabulary_list(
&#039;relationship&#039;, [
&#039;Husband&#039;, &#039;Not-in-family&#039;, &#039;Wife&#039;, &#039;Own-child&#039;, &#039;Unmarried&#039;,
&#039;Other-relative&#039;])خود تنسورفلو یک متد خوب برای تبدیل متغیر های گسته داره که در زیر می بینید. تعداد باکت هم ینی این که تنسورفلو در کل چه تعداد گروه می تونه بسازه:categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]مرحله ۳) یادگیری مدلبرای تعریف مدل از کد زیر استفاده می کنیم که ورودی ها به ترتیب تعداد کلاس های طبقه بندی، دایرکتوری مدل و ستون های مدل هستmodel = tf.estimator.LinearClassifier(
n_classes = 2,
model_dir=&quot;ongoing/train&quot;, 
feature_columns=categorical_features+ continuous_features)و در کد های زیر تابع ورودی داده ها رو می سازیمFEATURES = [&#039;age&#039;,&#039;workclass&#039;, &#039;fnlwgt&#039;, &#039;education&#039;, &#039;education_num&#039;, &#039;marital&#039;, &#039;occupation&#039;, &#039;relationship&#039;, &#039;race&#039;, &#039;sex&#039;, &#039;capital_gain&#039;, &#039;capital_loss&#039;, &#039;hours_week&#039;, &#039;native_country&#039;]
LABEL= &#039;label&#039;
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
    return tf.estimator.inputs.pandas_input_fn(
       x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)و با کد های زیر شروع می کنیم مدل رو تعلیم بدیمmodel.train(input_fn=get_input_fn(df_train, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)برای تخمین میزان کارایی مدل از کد زیر استفاده می کنیمmodel.evaluate(input_fn=get_input_fn(df_test, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)اگه دقت کنید دقت مدل زیاده این هم بخاطر اینه که مدل حتی اگه شانسی هم تخمین بزنه چون دیتا ها متعادل نیستن می تونه تخمین خوبی داشته باشه ولی اگه دقت کنید مقادیر صحت و حساسیت پایینه که یعنی مدل مشکل داره و باید بهبودش داد.مرحله ۴) بهبود مدلخب توی آموزش قبل یاد گرفتید چگونه با استفاده از اثر تعاملی دقت رو بهبود ببخشیم توی این قسمت قراره متغیر های چند جمله ای رو امتحان کنیم و به این دلیل هست که شاید بین متغیر ها و خروجی شاید ارتباط خطی نباشه. دو راه برای بدست آوردن غیری خطی بودن در مدل هستافزودن متغیر چند جمله ایدسته بندی مقادیر پیوسته در بسته های گسستهمتغیر چند جمله ایگاهی برای مدل کردن و تخمین برخی از داده ها مدل به صورت خطی با نتیجه مرتبط نیست مثلا در تصویر زیر بجای یک خط صاف یک خط خمیده بهتر بر روی داده ها قرار می گیره برای همین نیاز هست از متغیر های چند جمله ای مثل X^3 و.... استفاده کنیمدر مثال ما سن با میزان درآمد رابطه خطی نداره. مثلا در بچگی میزان درآمد صفر هست و کم کم بیشتر میشه و در سنین پیری و بازنشستگی کمتر میشه. حدودا مثل یک U برعکس هست.مثلا میشه یک توان دو به مدل اضافه کرد و ببینیم دقت چه تغییری می کنه.یک تابع می سازیم که دیتاست آموزش و آزمون و نام متغیر رو بگیره و توان دو رو به دیتاست ها اضافه کنه:def square_var(df_t, df_te, var_name = &#039;age&#039;):
    df_t[&#039;new&#039;] = df_t[var_name].pow(2) 
    df_te[&#039;new&#039;] = df_te[var_name].pow(2) 
    return df_t, df_te
سپس تابع رو صدا می زنیم.df_train_new, df_test_new = square_var(df_train, df_test, var_name = &#039;age&#039;)			print(df_train_new.shape, df_test_new.shape)	و به لیست متغیر های پیوسته اضافه می کنیمCONTI_FEATURES_NEW  = [&#039;age&#039;, &#039;fnlwgt&#039;,&#039;capital_gain&#039;, &#039;education_num&#039;, &#039;capital_loss&#039;, &#039;hours_week&#039;, &#039;new&#039;]
continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]
و بعد مدل جدید رو می سازیم البته model_dir رو عوض باید کنیم model_1 = tf.estimator.LinearClassifier(
    model_dir=&quot;ongoing/train1&quot;, 
    feature_columns=categorical_features+ continuous_features_new)سپس آموزش میدیمmodel_1.train(input_fn=get_input_fn(df_train, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)و سپس ارزیابیmodel_1.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)دقت از ۷۶ شد ۷۹ :دی با دسته بندی مقادیر پیوسته و استفاده از اثر متقابل میشه بهترش کردفشرده سازی و اثر متقابلخب تا اینجا مدل نتونست بازم رابطه سن و درآمد رو درست تشخیص بده یک قدم دیگه اینه که سن ها رو به یک سری مرز سنی تبدیل کنیم برای این کار از کد زیر استفاده می کنیمage = tf.feature_column.numeric_column(&#039;age&#039;)
age_buckets = tf.feature_column.bucketized_column(
    age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])یک راه دیگه برتی بهبود مدل استفاده از اثر متقابل متغیر هاست که تنسورفلو یک راهکاری در اختیار ما قرار میده تحت عنوان feature crossing که راهی هست برای ساخت متغیر های جدید از متغیر های موجود که برای مدل دسته بندی خطی که نمی تونه اثر متقابل رو تشخیص بده مفید هست.education_x_occupation = [tf.feature_column.crossed_column(
    [&#039;education&#039;, &#039;occupation&#039;], hash_bucket_size=1000)]
age_buckets_x_education_x_occupation = [tf.feature_column.crossed_column(
    [age_buckets, &#039;education&#039;, &#039;occupation&#039;], hash_bucket_size=1000)]ورودی hash_bucket_size تعداد کلاس های مختلف ایجاد شده هستbase_columns = [
    age_buckets,
]

model_imp = tf.estimator.LinearClassifier(
    model_dir=&quot;ongoing/train3&quot;, 
    feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation)FEATURES_imp = [&#039;age&#039;,&#039;workclass&#039;, &#039;education&#039;, &#039;education_num&#039;, &#039;marital&#039;,
                &#039;occupation&#039;, &#039;relationship&#039;, &#039;race&#039;, &#039;sex&#039;, &#039;native_country&#039;, &#039;new&#039;]

def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
    return tf.estimator.inputs.pandas_input_fn(
       x=pd.DataFrame({k: data_set[k].values for k in FEATURES_imp}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)
آموزش و ارزیابی مدل جدیدmodel_imp.train(input_fn=get_input_fn(df_train_new, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)model_imp.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)خب الان دقت شد ۸۳.۵۸در پایان با جلو گیری از over fit شدن مدل رو بهبود میدیم.مرحله ۵) بهبود پارامتر ها: Lasso &amp; Ridgeیک مدل با دو مشکل می تونه روبرو بشه overfitting یا underfitting.اولی Overfitting: مدل قابلیت تعمیم به داده های جدید برای تخمین زدن رو ندارهدومی Underfitting: وقتی که مدل قابلیت پیدا کردن الگو داده ها رو نداره مثلا استفاده از رگرسیون خطی برای داده های غیر خطیبرای جلوگیری از overfitting و عمومی تر کردن مدل تکنیک هایی وجود داره مثل:L1: LassoL2: Ridgeداخل تنسورفلو شما می تونید این دو بهبود دهنده رو به مدل اضافه کنید.البته خودتون با تغییر این دو پارامتر سعی کنید مدل رو بهبود بدید ببینید چقدر میشه بهتر کردmodel_regu = tf.estimator.LinearClassifier(
    model_dir=&quot;ongoing/train4&quot;, feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation,
    optimizer=tf.train.FtrlOptimizer(
        learning_rate=0.1,
        l1_regularization_strength=0.9,
        l2_regularization_strength=5))

model_regu.train(input_fn=get_input_fn(df_train_new, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)model_regu.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
در آموزش بعدی با متد های کرنل سعی می کنیم دقت رو افزایش بدیمخلاصهبرای آموزش یک مدل باید:تعریف ویژگی ها: متغیر های مستقل : Xتعریف برچسب: Dependent variable: yساخت مجموعه های آموزش و آزمونتعریف وزن های ابتداییتعریف تابع کاهش: MSEبهبود مدل: Gradient descentتعریف:نرخ یادگیریتعداد ایپاکاندازه دسته هاتعداد کلاس هابرا استفاده از تنسورفلو باید مقادیر زیر رو تعریف کنید:ستون های ویژگی ها. tf.feature_column.numeric_column برآوردگر tf.estimator.LinearClassifier(feature_columns, model_dir, n_classes = 2)یک تابع برای ورود داده ها اندازه دسته ها و ایپاک ها: input_fn()سپس آموزش و ارزیابی مدلبرای بهبود مدل:استفاده از متغیر های چند جمله ایاثر متقابل: tf.feature_column.crossed_columnاضافه کردن پارامتر تنظیم</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Wed, 10 Jul 2019 23:54:46 +0430</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۷ : بررسی داده ها</title>
                <link>https://virgool.io/@AmirAbbas8/%D8%AA%D9%86%D8%B3%D9%88%D8%B1%D9%81%D9%84%D9%88-%DB%B7-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7-donshkwonsi4</link>
                <description>در این قسمت قراره  درباره آماده سازی دیتا صحبت کنیم در قسمت قبلی از دیتاست بوستون استفاده کردیم که قیمت یک خانه رو تخمین بزنیم. یک مدل الگوی داده ها رو تعمیم میده. برای استفاده کردن از این الگو ابتدا باید پیداش کنیم بهترین کار اینه که قبل از اجرا الگوریتم یک تحلیل داده انجام بدیم.انتخاب ویژگی های درست در موفقیت مدل موثر هست راه دیگه برای بهبود مدل یافتن همبستگی بین متغیر های مستقل هست. مثلا تخمین درآمد افراد به متغیر های میزان تحصیلات و وضع اشتغال وابسته هست، در حالی که وضع اشتغال به میزان تحصیلات هم میتونه وابسته باشه. این وابستگی رو تحت عنوان interaction یا اثر متقابل می شناسیماثر متقابل تحصیلات و موقعیت شغلی در این قسمت قراره بررسی کنیم که با استفاده از اثر متقابل متغییرها میشه تخمین رو بهتر کرد یا نهخلاصه آمارچند قدم وجود داره که می تونید قبل از تعلیم مدل انجام بدید. همونطور که قبلا گفته شد هر مدل تعمیمی بر روی دیتا ها هست. پس بهترین کار برای تخمین بهینه فهمیندن دیتاهاست. اگه دیتا ها رو نشناسید شما شانس کمی برای بهبود مدل دارید.ابتدا به وسیله pandas دیتاست برای مجموعه های آموزش و ارزیابی وارد کنید.به لایبرری های matplotlib و seaborn نیاز داریم.! pip install seabornبرای رسم گراف: Matplotlib برای تجسم آماری: Seabornوارد سازی کتابخانه های لازم:import pandas as pd
from sklearn import datasets
import tensorflow as tf
from sklearn.datasets import load_boston
import numpy as npکتابخانه sklearn دیتاست بوستون رو داره و می تونید از طریق زیر بهش دسترسی داشته باشید:    boston = load_boston()
    df = pd.DataFrame(boston.data)برای مشاهده نام ویژگی ها:boston.feature_namesبرای تغییر نام ویژگی ها:df.columns = boston.feature_names
df[&#039;PRICE&#039;] = boston.target
df.head(2)شما می تونید متغیر CHAS به متن تبدیل کنید وقتی که ۱ هست yes و وقتی که ۰ هست no :df[&#039;CHAS&#039;] = df[&#039;CHAS&#039;].map({1:&#039;yes&#039;, 0:&#039;no&#039;})
df[&#039;CHAS&#039;].head(2)و برای تقسیم دیتاست به مجموعه های آموزش و ارزیابی به این صورت که ۸۰٪ در مجموعه آموزش و مابقی در مجموعه تعلیم باشند:df_train=df.sample(frac=0.8,random_state=200)
df_test=df.drop(df_train.index)
print(df_train.shape, df_test.shape)df_test.head(5)خب در اصل دیتا تمیز نیست و برای تمیز کردن باید اول بفهمیم چی نیاز به تمیز کردن داره. این کار یک مقدار نیاز به مهارت داره مخصوصا برای اینکه قابل تعمیم باشه.محققین گوگل یک ابزاری توسعه دادن به اسم Facets که کمک می کنه داده ها رو مجسم کنید و به ترتیب های مختلف تقسیم بندی کنید. این نقطه خوبی برای شروع بررسی داده هاست.Facets به شما اجازه می ده ببینید کجا اطلاعات به شیوه ای که شما فکر می کنید نیست.Facets Overviewیک بررسی اجمالی از مجموعه داده رو انجام میده. به این صورت که اطلاعات زیر هر ستون رو نمایش میده:درصد اطلاعات گم شدهکمینه و بیشینهآمار هایی از قبیل میانه، میانگین، انحراف معیارتعداد اطلاعات صفرمشاهده نحوه توزیع اطلاعات در داده های آموزش و ارزیابیFacets Deep Diveاین ابزار کمک می کنه وضوح بیشتری بر روی اطلاعات دیتاست داشته باشید. همچنین می تونید برای هر ستون و سطر ویژگی های دیتاست رو  مشاهده کنید.نصب Facetابتدا خط زیر رو وارد ترمینال کنیدpip install jupyter_contrib_nbextensionsسپس پروژه رو کلون کنیدgit clone https://github.com/PAIR-code/facetsسپس نصبش کنیدjupyter nbextension install facets-dist/Overviewimport sys
sys.path.append(&#039;~/facets/facets_overview/python&#039;)
from generic_feature_statistics_generator import GenericFeatureStatisticsGeneratorimport base64
gfsg = GenericFeatureStatisticsGenerator()
proto = gfsg.ProtoFromDataFrames([{&#039;name&#039;: &#039;train&#039;, &#039;table&#039;: df_train},                                                          {&#039;name&#039;: &#039;test&#039;, &#039;table&#039;: df_test}])
protostr = base64.b64encode(proto.SerializeToString()).decode(&quot;utf-8&quot;)from IPython.core.display import display, HTMLHTML_TEMPLATE = &quot;&quot;&quot;&lt;link rel=&quot;import&quot; href=&quot;/nbextensions/facets-dist/facets-jupyter.html&quot; &gt;        &lt;facets-overview id=&quot;elem&quot;&gt;&lt;/facets-overview&gt;                  document.querySelector(&quot;#elem&quot;).protoInput = &quot;{protostr}&quot;;        &quot;&quot;&quot;html = HTML_TEMPLATE.format(protostr=protostr)display(HTML(html))Graphپس از بررسی داده ها و توزیعشون می تونید یک ماتریس کوواریانست رسم کنید که ضریب پیئرسون رو حساب می کنه.این ضریب یک عدد بین -۱ و ۱ هست که مثبت بودن به معنی همبستگی مثبت هست و بالعکس.این کار برای پیدا کردن وابستگی بین متغیر ها هست.%matplotlib inline  
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style=&quot;ticks&quot;)
# Compute the correlation matrix
corr = df.corr(&#039;pearson&#039;)
# Generate a mask for the upper triangle
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(11, 9))

# Generate a custom diverging colormap
cmap = sns.diverging_palette(220, 10, as_cmap=True)

# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,
            square=True, linewidths=.5, cbar_kws={&quot;shrink&quot;: .5})از ماتریس مشاهده میشه که متغیر های LSTAT و RM بیشترین همبستگی را با قیمت دارند یا مثلا NOX و INDUS همبستگی مثبت قویی با همدیگه دارند برای همین مثلا مناسب هستند برای متغیر های وابستهیک نوع دیگه هم Pair grid هست .attributes = [&quot;PRICE&quot;, &quot;INDUS&quot;, &quot;NOX&quot;, &quot;RM&quot;, &quot;LSTAT&quot;]

g = sns.PairGrid(df[attributes])
g = g.map_upper(sns.regplot, color=&quot;g&quot;)
g = g.map_lower(sns.kdeplot,cmap=&quot;Reds&quot;, shade=True, shade_lowest=False)
g = g.map_diag(sns.kdeplot)
خروجیاز قسمت سبز متوجه میشیم که :قیمت با INDUS NOX LSTAT همبستگی منفی داره و با RM همبستگی مثبت. قیمت و LSTAT ارتباط خطی ندارند.وقتی قیمت ۵۰ هست یک خط صاف مشاهده میشه که طبق توضیحات دیتاست قیمت truncate شده هست.قطر نمودار:به نظر می رسد NOX دو خوشه داره یکی حدود ۰.۵ یکی حدود ۰.۸۵از قسمت پایین هم تراکم برداشت میشه. برای مثال وقتی منطقه صنعتی تر میشه غلظت اکسید نیتریک بیشتر از ۰.۶ میشهبرای بررسی اینکه دو متغیر مرتبط چه ارتباطی با قیمت دارند نیاز به نمودار سه بعدی هست و بخاطر محدودیت نیاز به راه حل دیگه ای هست مثلا:## Check non linearity with important features
df[&#039;Q_PRICE&#039;] = pd.qcut(df[&#039;PRICE&#039;], 4, labels=[&quot;Lowest&quot;, &quot;Low&quot;, &quot;Upper&quot;, &quot;upper_plus&quot;])
## Show non linearity between RM and LSTAT
ax = sns.lmplot(x=&quot;DIS&quot;, y=&quot;INDUS&quot;, hue=&quot;Q_PRICE&quot;, data=df, fit_reg = False,palette=&quot;Set3&quot;)
Facets Deep Diveبرای اینکه ارتباط چند متغیر با هم و قیمت رو مشاهده کنید می تونید از این امکان استفاده کنید ولی بخاطر کوتاهی و اختصار از این بخش گذر می کنم...</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Mon, 01 Jul 2019 18:40:54 +0430</pubDate>
            </item>
                    <item>
                <title>چگونه مدرن شد؟</title>
                <link>https://virgool.io/devAndroid/android-uuzfytw6kew3</link>
                <description>Androidاین روز ها اگه Modern Android Development رو سرچ کنید مقالات و ویدیو های خوبی می بینید. من هم مدتی بود که با این مقالات آشنا شده بودم ولی بر روی پروژه ای کار می کردیم که علاوه بر بزرگ بودن و هیجان انگیز بودنش پر شده بود از یک سری کار های تکراری که از شیرینی توسعه کم می کرد. همیشه صحبت این بود که یک تغییر اساسی داخل پروژه بدیم ولی هیچوقت وقت کافی پیدا نمی شد. تا اینکه یک جایی تصمیم گرفتم این تغییرات باید شروع بشه (و خداروشکر موافقت شد). چرا؟ چونکه علاوه بر اینکه به نتیجه رسیدن مهمه انجام کار با بهترین روش هم مهمه. این مهمه که توسعه پروژه راحت بشه مخصوصا برای اعضای جدیدی که وارد تیم توسعه میشن، باید کاری کنیم سریع تر بتونن روی پروژه سوار بشن. برای مثال تا قبل از این تغییرات توسعه دهنده جدید باید اول مثلا با شیوه بایندینگ ما توی پروژه آشنا می شد ولی الان می تونه خیلی راحت لایو دیتا رو یاد بگیره با کلی منبع آموزش که توی نت موجوده.توی این راه چندتا قدم طی کردیم که به ترتیب براتون می نویسم البته نکته مهم اینه که هیچکدوم از این تغییرات باعث نشد پروژه متوقف بشه یعنی اینکه هر مرحله با کد های قبلی سازگاری داشت و این دلیلی شد که این فرآیند به صورت عالی طی بشه.پیش به سوی تغییراتThe business changes. The technology changes. The team changes. The team members change. The problem isn&#x27;t change, per se, because change is going to happen; the problem, rather, is the inability to cope with change when it comes. -kent beckAndroidXاولین تغییری که انجام دادیم و خیلی هم به موقع بود مهاجرت از لایبرری های ساپورت به اندروید x بودهمچنین شروع به استفاده از کامپوننت های متریال این باعث شد که در طراحی برنامه نیاز نباشه همه کامپوننت ها رو خودمون طراحی کنیم و یک سری کامپوننت های خوشگل دریافت کردیم.Kotlinدومین تغییری که دادیم شروع به کد زنی با کاتلین بود و مسئله ای که وجود داشت این بود که این یه تغییر مهم بود ولی ما شدیدا درگیر توسعه بودیم یجورایی یک تصمیم گرفتم و خب موافقت شد اینکه کد های تست برنامه با کاتلین نوشته بشه و این باعث شد کاتلین وارد پروژه بشه البته ما هنوز نتونسته بودیم برای توسعه سراغ کاتلین بریم تا اینکه شروع کردیم به استفاده از جت پک!!!JetPackاین قسمتی هست که خیلی دوست دارم جت پک یک سری کامپوننت هست که توسعه اندروید رو واقعا راحت می کنه ما هم چندتاش رو استفاده کردیم و مزیتی که داشت تا قبل از استفاده از این کامپوننت ها توسعه معماری برنامه به مراتب سخت تر از طراحی ui برنامه بود چونکه دیتابیس رو خودمون باید sql خام می زدیم البته یک سری orm وجود داشت ولی برای هرکدوم یک سری دلایلی داشتیم که استفاده نکنیم. برای بایند کردن دیتا ها به ویو ها کد هایی داشتیم که باید همیشه کپی پیست می کردیم و اگه باگی پیدا می شد یک فرآیند دیباگ وحشتناکی داشت و مورد بعدی باید چرخه برنامه رو حواسمون بهش می بود این ها باعث شد که به سمت کامپوننت هایی از جت پک بریم.این تغییر یک مزیتی که داشت این بود که ما از کدهایی استفاده می کردیم که وقت توسعه و بهبودش پیدا نمی شد ولی الان از جت پک استفاده می کنیم که توسط گوگل در حال توسعه هست و بهبود پیدا می کنه:)Roomاولین کامپوننتی که استفاده کردیم روم بود روم یک orm هست که به راحتی با annotation یک سری کد می زنیم و خودش کد های لازم برای sqlite رو تولید می کنه شاید تا قبل استفاده از روم قسمت ذخیره سازی دیتا ترسناک ترین جای پروژه بود :)Live Dataکامپوننت بعدی لایو دیتا بود که باعث شد بایند کردن دیتا به ویو ها به شدت راحت بشه و به شدت میزان خط کد ها کم شد و سرعت توسعه رو افزایش داد. تا قبل از استفاده از این کامپوننت مجبور بودیم برای هر ساب سیستم کار های بایندینگ رو خودمون انجام بدیم و وحشتناک بود.چند تا کار دیگه هم کردیم که به جذابیت کمک این ها شاید نبود یکی استفاده از کوروتین ها بود که خب ما همه جا از پرامیس یا کال بک استفاده می کردیم که استفاده از این کامپوننت ها در جای مناسب خودش باعث راحت تر شدن فرآیند توسعه شد و تغییر بعدی استفاده از کامپوننت پیجینگ بود.راستی یک چیز دیگهما توی فرآیند جذب نیرو های جدید یک کار مفیدی که کردیم این بود که پروژه های تستی تعریف کردیم که باید با استفاده از کاتلین و کامپوننت های جت پک می زدن این کار رو کردیم چونکه اکثر کسایی که میومدن با کاتلین یا به خصوص جت پک آشنایی نداشتن این کار رو کردیم که حداقل بتونیم مهارت همکارامون رو ارتقا بدیم هرجایی که باشن :)خلاصه توصیه ای که می تونم بکنم اینه که نسبت به تغییر مقاومت نکنید:) </description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Fri, 14 Jun 2019 10:42:38 +0430</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۶ - رگرسیون خطی ۱</title>
                <link>https://virgool.io/dataio/tf-t1molsna5wnn</link>
                <description>تنسورفلو یک سری api سطح پایین داره که به شما اجازه میده کنترل کامل بر روی محاسبات داشته باشید. یک سری api  سطح بالا هم داره که به شما اجازه میده اکثر الگوریتم های هوش مصنوعی رو اجرا کنید مثلا estimators.API سطح پایین: ساخت و بهبود مدل از پایه که برای افراد مبتدی استفاده ازش سختهAPI سطح بالا: الگوریتم تعریف می کنیم و تنسورفلو estimator رو می سازه تعلیم می کنه و ارزیابی میکنه.در این قسمت قراره از estimator استفاده کنیم. ابتدا درباره کاهش گرادیان صحبت می کنیم و سپس با استفاده از دیتاست بوستون به وسیله تنسورفلو قیمت خانه رو تخمین می زنیم.دانلود دیتاست بوستونچگونه یک مدل رگرسیون خطی رو تعلیم دهیمابتدا این که بدونیم رگرسیون خطی چی هست؟فرض کنید که یک نمودار x و y دارید که وقتی به اون دقت می کنید می بینید وقتی که x افزایش پیدا می کنه y هم افزایش پیدا می کنه.مثلا وقتی که x=1 هست y تقریبا 6 هست یا وقتی که x=2 هست y تقریبا برابر 12 هست. همینطور که می بینید شما می تونید یک خط روی این دیتا ها رسم کنید که دقیق شاید نباشه ولی یک روند کلی از دیتا ها رو به شما نشون میده.این خطی که کشیدید یک معادله داره و کار رگرسیون خطی بدست آوردن این معادله هست. به این صورت که متغیر y به وسیله تعدادی متغیر ساخته می شه که در مثال ما فقط به x مربوطه. پس معادله ما به صورت زیر میشه:به این صورت که:متغیر اول b بایاس هست ینی وقتی که x صفر باشه y این مقدار رو داره.متغیر a وزن x هست.متغیر e ارور هست و شامل اطلاعاتی میشه که مدل نمی تونه یاد بگیره.برای مثال اگه متغیر ها به صورت زیر باشهb = 3.8a = 2.78معادله به صورت زیر میشه:y= 3.8 + 2.78xالان شما می تونید هر مقداری رو به جای x قرار بدید و y را پیش بینی کنید.خط قرمز نشان دهنده مقدار نسبت داده شده به y هست به ازای هر x. الان می تونید حتی برای x های بزرگتر از ۲ نیز مقدار y رو تخمین بزنید.برای اینکه مدل دقیق تر باشه میشه بهش متغیر های بیشتری اضافه کرد مثلا می خواییم میزان فروش یک بستنی فروشی رو پیش بینی کنیم. دیتاست ما شامل اطلاعاتی از قبیل آب و هوا، اطلاعات مشتریان مثل حقوق و جنسیت میشهدر تحلیل های سنتی مثلا از متغیر های مختلف میانگین می گرفتیم و سعی می کردیم برای سناریو های مختلف تخمین بزنیم که البته پیش بینی ها دقیق نبوده و به سناریو های موجود محدود می شدیم اما با استفاده از رگرسیون خطی شما می تونید معادله زیر رو داشته باشید:الگوریتم بهترین وزن ها رو برای معادله بالا پیدا میکنه ینی اینکه سعی میکنه هزینه رو کاهش بده (هزینه تفاوت قیمت واقی با قیمت تخمین زده شده هست)الگوریتم چگونه کار میکنه؟الگوریتم ابتدا به صورت تصادفی یک تعدادی وزن اتخاب می کند و برای هر x یک مقدار برای y تخمین می زند. مثلا اگه دیتاست صد عضو دارد صد تا مقدار تخمین زده می شه.با حساب کردن تفاوت بین مقدار واقعی و مقدار تخمین زده شده می توان ارور مدل را به دست آورد. هدف ما اینه که مربع این عدد رو تا حد ممکن کم کنیم که به صفر برسد. این مرحله کاهش میزان ارور هست برای رگسیون خطی این میانگین مربع خطا یا MSE هستبه این صورت که:تتا وزن ها هست که به صورت ضرب ماتریسی در x مقدار تخمینی y بدست می آید.متغیر  y هم مقدار واقعی هستمتغیر m هم تعداد مشاهدات در دیتاست هستند.هدف یافتن مناسب ترین تتا برای کاهش MSE هست.اگر میانگین ارور بزرگ باشد ینی اینکه مدل به خوبی کار نمی کنه و وزن ها به درستی انتخاب نشده اند. برای درست کردن وزن ها به یک بهینه ساز نیاز داریم. یک بهینه ساز کاهش گرادیان هست.کاهش گرادیان با گرفتن مشتق وزن ها رو افزایش یا کاهش می ده. اگه مشتق مثبت بشه وزن کاهش پیدا می کنه و اگه منفی بشه وزن افزایش پیدا می کنه. مدل وزن ها رو بروزرسانی میک نه و ارور رو مجددا محاسبه می کنه. این روند تا وقتی که ارور تغییری نکنه ادامه پیدا میکنه. همچنین هر گرادیان ضربدر یک ضریب یادگیری میشه که سرعت یادگیری رو نشان میده.اگ ضریب یادگیری خیلی کوچک باشه زمان زیادی طول میکشه تا مدل یاد بگیره و اگه خیلی بزرگ باشه ممکنه مدل به نتیجه ای نرسهمثلا در عکس بالا مشاهده میشه که حدودا بعد از بیست بار تکرار مدل یک مقدار پایدار برای وزن ها پیدا کرده و به کمترین ارور دست پیدا کرده.یک نکته که باید دقت کنید اینه که ارور صفر نشده برای کمتر کردن ارور باید مثلا متغیر های بیشتر یا اطلاعات بیشتر داشته باشید یا از برآوردگر های مختلفی استفاده کنید.چگونه به وسیله TensorFlow یک مدل رگرسیون خطی بسازیمخب حالا که یه دانشی داریم درباره اینکه قراره چه اتفاقی رخ بده آماده ایم که از estimator های تنسورفلو برای تعلیم اولین مدل استفاده کنیم. می خواییم از دبتاست بوستون استفاده کنیم .دیتاست بوستون متغیر هایی همچون تعداد اتاق ها، میزان مالیات و... دارهقراره دیتاست به چند قسمت تقسیم کنیم به این صورت که: ۴۰۰ سطر برای یادگیری مدل و پیدا کردن وزن ها۱۰۰ سطر برای ارزیابی مدل بر اساس دیتا هایی که در زمان یادگیری مشاهده نکرده۶ سطر برای تخمین عملکرد مدلهدف هم این هست که به وسیله متغیر ها و ویژگی های هر خونه قیمت خونه رو پیش بینی کنیم.اول با پانداس دیتا رو وارد می کنیم و بعد قراره یاد بگیریم چجوری مدل رگرسیون خطی رو با api های سطح بالا بسازیم، یادبدیم، ارزیابی کنیم. اگه می خواستیم از api های سطح پایین استفاده کنیم باید چندتا کار می کردیم:تابع کاهش تعریف می کردیمتابع بهینه سازی تعریف می کردیمماتریس ها رو ضرب می کردیماین مراحل برای شروع یکمی خسته کننده و پیچیده هستمحیط مجازی یادتون نرهوارد سازی دیتااول sklearn نصب کنیدمی تونید با دستور زیر نصب کنید:pip:pip3 install -U scikit-learnconda:conda install scikit-learnسپس باید لایبرری های مورد نظر وارد کنیمimport pandas as pd
from sklearn import datasets
import tensorflow as tf
import itertoolsمرحله ۱) وارد کردن اطلاعات به وسیله pandasابتدا اسم ستون ها رو در متغیر COLUMNS ذخیره می کنیم و بعدش با read_csv دیتا رو وارد می کنیم.COLUMNS = [&quot;crim&quot;, &quot;zn&quot;, &quot;indus&quot;, &quot;nox&quot;, &quot;rm&quot;, &quot;age&quot;,&quot;dis&quot;, &quot;tax&quot;, &quot;ptratio&quot;, &quot;medv&quot;]boston_set = pd.read_csv(&quot;Boston.csv&quot;, skipinitialspace=True,skiprows=1, names=COLUMNS)training_set = boston_set[:400]test_set = boston_set[400:500]prediction_set = boston_set[500:]با خط زیر هم ساختار مجموعه ها رو میبینمprint(training_set.shape, test_set.shape, prediction_set.shape)خب الان می خواییم ویژگی های هر خونه رو از لیبل جدا کنیم لیبل چیزی هست که قراره تخمین بزنیمFEATURES = [&quot;crim&quot;, &quot;zn&quot;, &quot;indus&quot;, &quot;nox&quot;, &quot;rm&quot;,	
&quot;age&quot;, &quot;dis&quot;, &quot;tax&quot;, &quot;ptratio&quot;]
LABEL = &quot;medv&quot;مرحله ۲ ) تبدیل دیتادر این مرحله باید دیتا های عددی را به فرمت صحیح نشون بدیم برای اینکار تنسورفلو یک متدی داره به اسم tf.feature_column.numeric_columnدر مرحله قبل شما یک لیست تعریف کردید از ویژگی هایی که می خوایید داخل مدل باشه. الان از اون لیست استفاده می کنیم اگه دوست دارید ویژگی خاصی توی مدل نباشه از اون لیست حذفش کنید.feature_cols = [tf.feature_column.numeric_column(k) for k in FEATURES]مرحله ۳) تعریف برآوردگردر این مرحله می خواییم برآوردگر تعریف کنیم. تنسورفلو چند تا برآوردگر پیش ساخته دارهرگرسیونDNNRegressorLinearRegressorDNNLineaCombinedRegressorطبقه بندیDNNClassifierLinearClassifierDNNLineaCombinedClassifierتوی این قسمت از رگرسیون خطی با استفاده از tf.estimator بهره می بریم.این تابع دوتا ورودی داره:feature_columns: متغیر هایی که قراره مدل داشته باشهmodel_dir: مسیر ذخیره سازی مدلاز مسیر ذخیره سازی برای تنسوربرد هم استفاده می کنیم.estimator = tf.estimator.LinearRegressor( 
feature_columns=feature_cols, 
model_dir=&quot;train&quot;)نکته مهم در رابطه با تنسورفلو نحوه ورود دیتا به مدل هست. تنسورفلو به نحوی طراحی شده که با پردازش موزای و پردازش دیتاست های خیلی بزرگ کار کنه و به خاطر محدودیت های منابع ماشین نمیشه همه دیتا رو یک باره وارد مدل کرد. بخاطر همین در هر مرحله یک قسمتی از داده رو وارد می کنیم که بهش میگن Batch.اگه اینکار رو نکنیم مثلا وقتی یه دیتاست یک میلیون سطر داره به مشکل مموری می خوریم..مثلا اگه ۱۰۰ تا سطر داشته باشیم اندازه بچ رو ۱۰ تایی انتخاب می کنیمو یعنی در هر تکرار مدل ۱۰ تا مشاهده رو بررسی می کنه.وقتی مدل یک بار همه دیتا ها رو ببینه یک ایپاک گذرونده. هر epoch به معنی اینه که چند بار همه دیتا ها مشاهده بشه.یک نکته دیگه که باید بگم over fitting هست به این معنی هست که مدل داره اشتباه یاد می گیره یعنی اینکه شما می خوایید ی پترن خاص یاد بگیره ولی مدل بر اساس دیتا هایی که داره مشاهده می کنه فقط داره یاد می گیره و وقتی یه سری دیتا جدید ببینه اشتباه تصمیم می گیره. مثال بخوام بزنم فرض کنید شما تنها چیز قرمزی که توی عمرتون می بینید فقط ماشین باشه و به این نتیجه برسید که هر چیز قرمز ماشینه !! بعد که ی ماشین آبی ببینید بگید که نه این ماشین نیست شما دچار over fitting شدید. برای مقابله با این پدیده یه سری کار ها می کنیم. فعلا در این حد که قبل از هر تکرار دیتا ها رو شافل می کنیم. راستش تنسور فلو این کار ها رو خودش می کنه :-)برای اینکه به تنسورفلو بگیم چجوری به مدل دیتا وارد کن می تونیم از تابع pandas_input_fn استفاده کنیم که ۵ تا پارامتر دارهx: دیتا هاy: لیبل دیتاbatch_size: اندازه بچnum_epoch: تعداد ایپاکshuffle: وضعیت شافل کردنYou need to feed the model many times so you define a function to repeat this process. all this function get_input_fn.def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True): 
   return tf.estimator.inputs.pandas_input_fn( 
        x=pd.DataFrame({k: data_set[k].values for k in FEATURES}), 
        y = pd.Series(data_set[LABEL].values), 
        batch_size=n_batch, 
        num_epochs=num_epochs, 
        shuffle=shuffle)برای ارزیابی مدل اصولا کار های زیر رو انجام می دیمتعلیم مدلارزیابی مدل در یک دیتابیس دیگرتخمین زدنبرآوردگر تنسورفلو سه تابع مختلف برای اعمال فوق ارائه میدهمرحله ۴) تعلیم مدلبا تابع زیر مدل رو تعلیم میدیم به این صورت که هزار مرتبه و هر مرتبه ۱۲۸ سطر و خب از ایپاک هم استفاده نمی کنیم مثلا اگه اینجا ایپاک رو ۱ قرار می دادیم ۴ بار اجرا می شد چونکه: ۱۲۸ ۱۲۸ ۱۲۸ ۱۶ولی ما ایپاک رو none می زاریم و به جاش step رو ۱۰۰۰estimator.train(input_fn=get_input_fn(training_set, 
    num_epochs=None, 
    n_batch = 128, 
    shuffle=False), 
    steps=1000)با تنسوربرد هم می تونیم روند رو بررسی کنیمconda activate hello-tf
tensorboard --logdir=./trainمرحله ۵) ارزیابی مدلبرای ارزیابی مدل هم می تونید از تکه کد زیر استفاده کنید.ev = estimator.evaluate( 
    input_fn=get_input_fn(test_set, 
    num_epochs=1, 
    n_batch = 128, 
    shuffle=False))
میزان هزینه مدل رو هم میشه با کد زیر چاپ کردloss_score = ev[&quot;loss&quot;]
print(&quot;Loss: {0:f}&quot;.format(loss_score))مرحله ۶) پیش بینی کردنسرانجام مدل آماده میشه برای برآورد و تخمین زدن اگه یادتون باشه ۶ سطر نگه داشتیم برای این مرحلهy = estimator.predict( 
    input_fn=get_input_fn(prediction_set, 
    num_epochs=1, 
    n_batch = 128, 
    shuffle=False))برای چاپش هم:predictions = list(p[&quot;predictions&quot;] for p in itertools.islice(y, 6))print(&quot;Predictions:{}&quot;.format(str(predictions)))خلاصهبرای تعلیم یک مدل باید:تعریف متغیر ها: متغیر های مستقل: Xتعریف برچسب: متغیر های وابسته: yساخت مجموعه تعلیم و تستتعریف وزن های ابتداییتعریف تابع هزینه: MSEبهبود مدل: Gradient descentتعریف:نرخ یادگیریتعداد ایپاکاندازه بچدر این آموزش یادگریفتیم از api های سطح بالای تنسورفلو برای یک رگرسیون خطی استفاده کنیم برای اینکار باید:ستون های ویژگی ها. اگر پیوسته هست tf.feature_column.numeric_column()برآوردگر: tf.estimator.LinearRegressor(feature_columns, model_dir)یک تابع برای ورود دیتا تعداد ایپاک و اندازه بچ: input_fn()بعد مدل برای تعلیم ارزیابی و برآورد آماده هست با توابع: train(), evaluate() , predict()</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Sat, 08 Jun 2019 22:53:38 +0430</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۵ - Pandas</title>
                <link>https://virgool.io/@AmirAbbas8/tf-v5qo4dlcp0cu</link>
                <description>پانداس چیست ؟تا اینجا درباره مقدمات تنسورفلو، نوت بوک، تنسوربرد گفتیم قبل از اینکه به قسمت های اصلی یادگیری عمیق و تنسورفلو برسیم نیازه با Pandas آشنا بشیم.پانداس یک پروژه اپن سورس هست که به شما اجازه میده که برای تولید و کار با دیتا از اون استفاده کنید. پانداس با استفاده از NumPy ساخته شده پس برای استفاده از اون به نام پای نیاز هستچرا از Pandas استفاده کنیم؟دانشمندان داده از پانداس به دلایل زیر استفاده می کنند:مدیریت داده های از دست رفته به راحتیقابل استفاده با ساختار های داده تک بعدی و چند بعدیدارای راهکار های موثر برای برش دادهدارای راهکار های مناسب برای ادغام، اتصال و تغییر شکل داده هانحوه نصب پانداس?البته قبلا داخل همین سری در قسمت مربوط به محیط های مجازی پانداس رو نصب کردیم ولی برای نصبش کافی هست وارد کنید:pip3 install pandasدیتا فریم چیست؟قاب داده یک آرایه چند بعدی هست که برچسب گذاری شده است و یک راه استاندارد برای ذخیره سازی داده می باشد. هر قاب داده به صورت جداولی هست که هر سطر اطلاعات را ذخیره می کند و هر ستون اطلاعات را نام گذاری می کند.قاب دادهسری چیست؟سری یک ساختمان داده تک بعدی هست که می تواند  انواع مختلف داده از قبیل int, float و... را ذخیره نماید.پارامتر های سری  به صورت زیر می باشند:داده: می تونه لیست، دیکشنری یا یک مقدار عددی باشد.pd.Series([1., 2., 3.])0 1.0
1 2.0
2 3.0
dtype: float64ایندکس: با قرار دادن ایندکس می تونید سطر ها رو نام گذاری کنید:pd.Series([1., 2., 3.], index=[&#039;a&#039;, &#039;b&#039;, &#039;c&#039;])ساخت دیتا فریمشما می تونید به راحتی یک آرایه numpy رو به قاب دیتا پانداس یا برعکس تبدیل کنید.## Numpy to pandas
import numpy as np
h = np.array([[1,2],[3,4]])
df_h = pd.DataFrame(h)
print(&#039;Data Frame:&#039;, df_h)
## Pandas to numpy
df_h_n = np.array(df_h)
print(&#039;Numpy array:&#039;, df_h_n)
خروجی:Data Frame: 0 1
0 1 2
1 3 4
Numpy array: [[1 2]
[3 4]]
همچنین می تونید یک دیکشنری پایتون رو به دیتافریم تبدیل کنیدdic = {&#039;Name&#039;: [&quot;John&quot;, &quot;Smith&quot;], &#039;Age&#039;: [30, 40]}
pd.DataFrame(data=dic)دامنه تاریخپانداس یک API برای ساخت  دامنه ای از تاریخ ها داره که به صورت زیر ازش استفاده میشه:pd.data_range(date,period,frequency)پارامتر اول تاریخ شروع هستپارامتر دوم تعداد تکرار ها هستپارامتر آخر این هست که نوع تکرار بر اساس چی باشه: روز: &#x27;D,&#x27; ماه: &#x27;M&#x27; و سال: &#x27;Y&#x27;## Create date
# Days
dates_d = pd.date_range(&#039;20300101&#039;, periods=6, freq=&#039;D&#039;)
print(&#039;Day:&#039;, dates_d)
خروجیDay: DatetimeIndex([&#x27;2030-01-01&#x27;, &#x27;2030-01-02&#x27;, &#x27;2030-01-03&#x27;, &#x27;2030-01-04&#x27;, &#x27;2030-01-05&#x27;, &#x27;2030-01-06&#x27;], dtype=&#x27;datetime64[ns]&#x27;, freq=&#x27;D&#x27;)# Months
dates_m = pd.date_range(&#039;20300101&#039;, periods=6, freq=&#039;M&#039;)
print(&#039;Month:&#039;, dates_m)
خروجیMonth: DatetimeIndex([&#x27;2030-01-31&#x27;, &#x27;2030-02-28&#x27;, &#x27;2030-03-31&#x27;, &#x27;2030-04-30&#x27;,&#x27;2030-05-31&#x27;, &#x27;2030-06-30&#x27;], dtype=&#x27;datetime64[ns]&#x27;, freq=&#x27;M&#x27;)بازرسی داده هاشما می تونید ابتدا یا انتها دیتاست رو با توابع head و tail مشاهده کنید.random = np.random.randn(6,4)# Create data with date
df = pd.DataFrame(random,
index=dates_m,
columns=list(&#039;ABCD&#039;))df.head(3)df.tail(3)یا می تونید با استفاده از تابع describe اطلاعاتی همچون تعداد، میانگین، انحراف معیار، کمینه، بیشینه رو مشاهده کنیدdf.describe()برش داده هابا استفاده از اسم ستون می تونید دیتا های یک ستون خاص رو ببینید## Slice
### Using name
df[&#039;A&#039;]
برای چند ستون از دو براکت استفاده کنید که براکت اول ینی می خوایید ستون انتخاب کنید و دومی یعنی چه ستون هایی رو می خوایید انتخاب کنید.df[[&#039;A&#039;, &#039;B&#039;]]برای انتخاب سه سطر اول از کد زیر می تونید استفاده کنید### using a slice for row
df[0:3]برای انتخاب چند سطر از چند ستون خاص از loc استفاده کنید## Multi col
df.loc[:,[&#039;A&#039;,&#039;B&#039;]]به جای استفاده از نام ستون می تونید با iloc از ایندکس استفاده کنیدdf.iloc[:, :2]حذف یک ستونبا استفاده از pd.drop می تونید تعدادی ستون رو حذف کنیدdf.drop(columns=[&#039;A&#039;, &#039;C&#039;])الحاقمی تونید دو دیتا فریم رو با استفاده از pd.concat بهم متصل کنیدimport numpy as np
df1 = pd.DataFrame({&#039;name&#039;: [&#039;John&#039;, &#039;Smith&#039;,&#039;Paul&#039;],
&#039;Age&#039;: [&#039;25&#039;, &#039;30&#039;, &#039;50&#039;]},
index=[0, 1, 2])
df2 = pd.DataFrame({&#039;name&#039;: [&#039;Adam&#039;, &#039;Smith&#039; ],
&#039;Age&#039;: [&#039;26&#039;, &#039;11&#039;]},
index=[3, 4]) 
Finally, you concatenate the two DataFramedf_concat = pd.concat([df1,df2]) 
df_concatحذف تکرار دادهاگه داخل یک دیتا فریم داده تکراری وجود داره برای حذف اونا از drop_duplicate استفاده کنید و ورودی اسم ستونی که تکراری ها می خواهید ازش حذف بشه رو وارد کنید.df_concat.drop_duplicates(&#039;name&#039;)مرتب سازیبا استفاده از sort_values می تونید ستون مورد نظر رو مرتب کنید.df_concat.sort_values(&#039;Age&#039;)تغییرنامبرای تغییر نام یک ستون می تونید از rename استفاده کنید ابتدا نام فعلی و سپس نام جدید رو وارد کنید.df_concat.rename(columns={&quot;name&quot;: &quot;Surname&quot;, &quot;Age&quot;: &quot;Age_ppl&quot;})وارد سازی CSVدر طول آموزش تنسورفلو قراره از دیتاست ها استفاده کنیم مثلا دیتاست Adult معمولا فرمت دیتاست ها csv هست.دیتاست Adult ویژگی هایی از قبیل میزان تحصیلات، جنسیت، کشور و... در خودش داره.برای وارد کردن این CSV از read_csv استفاده می کنیم.Syntax:pandas.read_csv(filepath_or_buffer,sep=&#x27;, &#x27;,&#x60;names=None&#x60;,&#x60;index_col=None&#x60;,&#x60;skipinitialspace=False&#x60;)filepath_or_buffer: آدرس محل دیتاستsep=&#x27;, &#x27;: جدا کننده اطلاعات&#x60;names=None&#x60;: اسم ستون ها&#x60;index_col=None&#x60;: اگر سطری وجود دارد که اسم ستون ها رو داره شماره سطر قرار بدیدبرای اطلاعات بیشتر به آدرس زیر می تونید مراجعه کنید:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html.Consider the following Example## Import csv
import pandas as pd
## Define path data
COLUMNS = [&#039;age&#039;,&#039;workclass&#039;, &#039;fnlwgt&#039;, &#039;education&#039;, &#039;education_num&#039;, &#039;marital&#039;,
&#039;occupation&#039;, &#039;relationship&#039;, &#039;race&#039;, &#039;sex&#039;, &#039;capital_gain&#039;, &#039;capital_loss&#039;,
&#039;hours_week&#039;, &#039;native_country&#039;, &#039;label&#039;]
PATH = &quot;https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data&quot;
df_train = pd.read_csv(PATH,
skipinitialspace=True,
names = COLUMNS,
index_col=False)
df_train.shape
Output:(32561, 15)دسته بندییک راه ساده برای مشاهده دیتا استفاده از groupby هست که کمک می کنه اطلاعات رو دسته بندی کنید مثل توابع aggregation  در SQLcount: شمارش تعدادmin: کمترینmax: بیشترینmean: میانگینmedian: میانهstandard deviation: انحراف معیار...داخل groupby اسم ستونی که می خوایید تابع رو براش اعمال کنید وارد کنیدبرای مثال خط زیر میانگین ستون های دارای مقادیر پیوسته رو برای افراد با درآمد زیر  ۵۰ و بالا ۵۰ حساب می کنهdf_train.groupby([&#039;label&#039;]).mean()یا خط زیر بر حسب درآمد کمترین سن رو خروجی میدهdf_train.groupby([&#039;label&#039;])[&#039;age&#039;].min()همچنین می تونید بر روی چند ستون  group by بزنیدdf_train.groupby([&#039;label&#039;, &#039;marital&#039;])[&#039;capital_gain&#039;].max()خلاصه</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Sun, 19 May 2019 09:06:50 +0430</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۴ - Tensorboard</title>
                <link>https://virgool.io/@AmirAbbas8/tf-ifxzrpr6mvlj</link>
                <description>تنسوربٌرد چیست؟تنسوربرد رابطی هست برای نمایش گراف و سایر ابزار ها برای فهمیدن، دیباگ و بهبود مدلمثال:تصویر زیر گرافی هست که قرار است در این آموزش بدست بیاد.تنسور برددر پنجره زیر شما پنل تنسوربرد را مشاهده می کنید که شامل تب های مختلفی هست که به سطح اطلاعاتی که شما وارد می کنید مربوط می شود.نوار اصلی تنسوربردScalars: نمایش اطلاعات مختلف در طول تعلیم مدلGraphs: نمایش مدلHistogram: نمایش وزن ها به وسیله هیستوگرامDistribution: نمایش نحوه توزیع وزن هاProjector: نمایش مولفه های اصلی تحلیل به عبارتی تکنیکی برای کاهش ابعاددر این قسمت یک مدل ساده یادگیری عمیق را تعلیم می دهیم. در مورد اینکه چجوری کار می کنه بعدا می خوانیم.اگه به گراف زیر نگاه کنید خواهید فهمید که چگونه کار می کند.وارد سازی دیتا به مدل: وارد سازی دیتا به اندازه دسته داخل مدلوارد سازی اطلاعات به تنسور هاتعلیم مدلنمایش تعداد دسته ها در طول تعلیم و ذخیره سازی مدلچرخه کارایده ساده استفاده شده در تنسوربرد این است که شبکه های عصبی می تونند به عنوان یک جعبه سیاه استفاده بشند و ما با استفاده از یک ابزار می تونیم بررسی کنیم داخل جعبه چه اتفاقی داره رخ می ده. پس تنسوربرد مث یک چراغ قوه هست ک می تونید با اون بپرید وسط شبکه های عصبی :-)تنسوربرد کمک می کنه که ارتباط میان عملیات های مختلف را بفهمید، مشاهده کنید که چگونه وزن ها محاسبه می شه، تابع کاهش (هزینه) را مشاهده کنید و اطلاعات مفید دیگری.وقتی که تک تک این ابزار ها رو در کنار هم دیگه قرار بدیم یک وسیله خیلی عالی برای دیباگ و بهبود مدل برای استفاده بدست می آریم.برای اینکه مشاهده کنید چقدر یک نمودار می تواند مفید باشد به تصویر زیر نگاه کنید.راست: در حال یادگیری - چپ: احتمالا بازیگوشی :-)یک شبکه عصبی تصمیم می گیرد که چگونه نورون های مختلف به یکدیگر مرتبط شوند و چه تعداد لایه نیاز هستند. وقتی که شما معماری مدل را تعریف کردید علاوه بر اینکه نیاز دارید مدل را تعلیم دهید نیاز دارید که میزان دقت پیشبینی خود را محاسبه کنید.این معیار اندازه گیری به عنوان loss function یا تابع هزینه شناخته میشه.هدف کمینه کردن تابع هزینه هست. به بیان دیگر این هست که مدل خطا های کمتری داشته باشه.تمام الگوریتم های یادگیری ماشین محاسبات خودشون رو ادامه میدند تا وقتی که به یک شیب تقریبا صفر برسند. برای کاهش این تابع هدف شما باید یک نرخ یادگیری تعیین کنید که سرعتی هست که مدل شما یاد می گیره. مثلا اگه نرخ یادگیری رو خیلی بالا ببرید مدل زمان کافی برای یادگیری نداره مثلا تصویر سمت چپ نمودار مدام پایین و بالا میره که به این معنی هست که مدل فقط داره خروجی رو حدس می زنه. در صورتی که تصویر سمت راست نشون میده تابع هزینه در هر مرحله داره کاهش پیدا می کنه تا وقتی که منحنی به شیب تقریبا صفر می رسه که به معنی این هست که مدل راه حل رو پیدا کرده.تنسوربرد ابزار مناسبی برای مشاهده این معیار ها و برجسته کردن خطاهای احتمالی هست. تنسوربرد در طول تعلیم مدل معیار ها رو به شما نشون میده و باعث میشه که لازم نباشه شما تا آخر تعلیم صبر کنید که نتیجه رو ببینید.چگونه از TensorBoard استفاده کنیم؟برای شروع اولین کار با وارد کردن خط های زیر داخل ترمینال نوت بوک رو باز می کنیم و طبق آموزش قبلی یک نوت بوک جدید می سازیم. قراره یک مدل رو تعلیم بدیم و جزئیات رو مشاهده کنیم البته بعدا توضیحات تکمیلی خواهم داد که داریم چکار می کنیم پس الان فقط روی تنسوربرد تمرکز می کنیم.source activate hello-tfjupyter notebookقدم اول کتابخانه هایی که قراره ازشون استفاده کنیم رو وارد می کنیم.#Import the library
import tensorflow as tf
import numpy as npسپس دیتا رو می سازیم. یک آرایه با ۱۰۰۰۰ سطر و ۵ ستونX_train = (np.random.sample((10000,5)))
y_train = (np.random.sample((10000,1))) 
X_train.shapeخروجی(10000, 5)کد زیر قراره که دیتا ها رو تبدیل کنه و مدل رو بسازه که خب یک سری نکته بهتره دربارش بگم۱. نرخ یادگیری برابر هست با ۰.۱ و اگه شما افزایشش بدید ممکنه مدل نتونه یادبگیره و مثل نمودار سمت چپ بشه.۲. در این کد از TensorFlow estimator استفاده شده که یک API هست که شامل تمام محاسبات ریاضی هست.۳. برای ساخت فایل لاگ شما باید مسیرش تعیین کنید که با model_dir مشخص شده.feature_columns = [tf.feature_column.numeric_column(&#039;x&#039;, shape=X_train.shape[1:])]
DNN_reg = tf.estimator.DNNRegressor(feature_columns=feature_columns,
     # Indicate where to store the log file    
     model_dir=&#039;train/linreg&#039;,    
     hidden_units=[500, 300],    
     optimizer=tf.train.ProximalAdagradOptimizer(learning_rate=0.1,           
     l1_regularization_strength=0.001)
     )خروجیINFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {&#039;_model_dir&#039;: &#039;train/linreg&#039;, &#039;_tf_random_seed&#039;: None, &#039;_save_summary_steps&#039;: 100, &#039;_save_checkpoints_steps&#039;: None, &#039;_save_checkpoints_secs&#039;: 600, &#039;_session_config&#039;: allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, &#039;_keep_checkpoint_max&#039;: 5, &#039;_keep_checkpoint_every_n_hours&#039;: 10000, &#039;_log_step_count_steps&#039;: 100, &#039;_train_distribute&#039;: None, &#039;_device_fn&#039;: None, &#039;_protocol&#039;: None, &#039;_eval_distribute&#039;: None, &#039;_experimental_distribute&#039;: None, &#039;_service&#039;: None, &#039;_cluster_spec&#039;: &lt;tensorflow.python.training.server_lib.ClusterSpec object at 0x7f9235469a58&gt;, &#039;_task_type&#039;: &#039;worker&#039;, &#039;_task_id&#039;: 0, &#039;_global_id_in_cluster&#039;: 0, &#039;_master&#039;: &#039;&#039;, &#039;_evaluation_master&#039;: &#039;&#039;, &#039;_is_chief&#039;: True, &#039;_num_ps_replicas&#039;: 0, &#039;_num_worker_replicas&#039;: 1}مرحله آخر تعلیم مدل هست. در طول تعلیم تنسورفلو اطلاعات را داخل پوشه مدل ذخیره می کنه.# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn( 
x={&quot;x&quot;: X_train}, 
y=y_train, shuffle=False,num_epochs=None)
DNN_reg.train(train_input,steps=3000)خروجیINFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 0 into train/linreg/model.ckpt.
INFO:tensorflow:loss = 45.232094, step = 1
INFO:tensorflow:global_step/sec: 422.633
INFO:tensorflow:loss = 12.4298, step = 101 (0.239 sec)
INFO:tensorflow:global_step/sec: 331.11
INFO:tensorflow:loss = 11.425189, step = 201 (0.301 sec)
INFO:tensorflow:global_step/sec: 327.099
INFO:tensorflow:loss = 9.984478, step = 301 (0.306 sec)
INFO:tensorflow:global_step/sec: 324.576
INFO:tensorflow:loss = 9.4181595, step = 401 (0.308 sec)
INFO:tensorflow:global_step/sec: 335.825
INFO:tensorflow:loss = 10.240588, step = 501 (0.298 sec)
INFO:tensorflow:global_step/sec: 324.559
INFO:tensorflow:loss = 12.473342, step = 601 (0.308 sec)
INFO:tensorflow:global_step/sec: 396.416
INFO:tensorflow:loss = 10.517891, step = 701 (0.252 sec)
INFO:tensorflow:global_step/sec: 450.277
INFO:tensorflow:loss = 10.317724, step = 801 (0.222 sec)
INFO:tensorflow:global_step/sec: 462.943
INFO:tensorflow:loss = 10.446275, step = 901 (0.216 sec)
INFO:tensorflow:global_step/sec: 449.976
INFO:tensorflow:loss = 10.199943, step = 1001 (0.222 sec)
INFO:tensorflow:global_step/sec: 445.179
INFO:tensorflow:loss = 11.021394, step = 1101 (0.225 sec)
INFO:tensorflow:global_step/sec: 405.111
INFO:tensorflow:loss = 10.878467, step = 1201 (0.247 sec)
INFO:tensorflow:global_step/sec: 430.173
INFO:tensorflow:loss = 9.767784, step = 1301 (0.232 sec)
INFO:tensorflow:global_step/sec: 465.094
INFO:tensorflow:loss = 11.288946, step = 1401 (0.215 sec)
INFO:tensorflow:global_step/sec: 466.42
INFO:tensorflow:loss = 11.19619, step = 1501 (0.214 sec)
INFO:tensorflow:global_step/sec: 477.214
INFO:tensorflow:loss = 10.408053, step = 1601 (0.210 sec)
INFO:tensorflow:global_step/sec: 444.272
INFO:tensorflow:loss = 9.973042, step = 1701 (0.225 sec)
INFO:tensorflow:global_step/sec: 453.129
INFO:tensorflow:loss = 10.324511, step = 1801 (0.220 sec)
INFO:tensorflow:global_step/sec: 451.574
INFO:tensorflow:loss = 10.431812, step = 1901 (0.221 sec)
INFO:tensorflow:global_step/sec: 450.977
INFO:tensorflow:loss = 10.664722, step = 2001 (0.222 sec)
INFO:tensorflow:global_step/sec: 441.491
INFO:tensorflow:loss = 10.488377, step = 2101 (0.226 sec)
INFO:tensorflow:global_step/sec: 451.41
INFO:tensorflow:loss = 10.7743845, step = 2201 (0.222 sec)
INFO:tensorflow:global_step/sec: 437.22
INFO:tensorflow:loss = 10.483818, step = 2301 (0.229 sec)
INFO:tensorflow:global_step/sec: 447.573
INFO:tensorflow:loss = 12.194493, step = 2401 (0.223 sec)
INFO:tensorflow:global_step/sec: 438.331
INFO:tensorflow:loss = 10.455133, step = 2501 (0.228 sec)
INFO:tensorflow:global_step/sec: 453.799
INFO:tensorflow:loss = 11.965737, step = 2601 (0.220 sec)
INFO:tensorflow:global_step/sec: 424.856
INFO:tensorflow:loss = 11.204067, step = 2701 (0.235 sec)
INFO:tensorflow:global_step/sec: 448.324
INFO:tensorflow:loss = 9.647366, step = 2801 (0.223 sec)
INFO:tensorflow:global_step/sec: 447.683
INFO:tensorflow:loss = 9.325161, step = 2901 (0.223 sec)
INFO:tensorflow:Saving checkpoints for 3000 into train/linreg/model.ckpt.
INFO:tensorflow:Loss for final step: 10.99929.&lt;tensorflow_estimator.python.estimator.canned.dnn.DNNRegressor at 0x7f92354694a8&gt;برای مشاهده تنسوربرد داخل پوشه ای که نوت بوک قرار دارد دستور زیر را داخل ترمینال وارد کنید.tensorboard --logdir=./train/linregتنسور بورد در آدرس زیر باز می شود:http://localhost:6006خروجی تنسوربرددقت کنید نحوه خواندن گراف رو در آینده دربارش صحبت می کنم.اگه به مشکلی خوردید بهتره کرنل نوت بوک و تنسوربرد رو ریست کنید.خلاصه:در این قسمت با تنسوربرد آشنا شدیم که ابزار ماسبی برای نمایش مدل به شمار میره. به وسیله تنسربرد می تونید معیار هایی از قبیل تابع هزینه، دقت و... رو مشاهده کنید.راه اندازی Tensorboard :tensorboard --logdir=.+ PATH			</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Thu, 02 May 2019 17:57:12 +0430</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۳ - آموزش jupyter notebook</title>
                <link>https://virgool.io/dataio/tf-ugprxxt26qjd</link>
                <description>چرا از Jupyter Notebook استفاده کنیم؟نوت بوک (Jupyter notebook) یک برنامه تحت وب هست که به شما اجازه میده کد و عناصر متنی وارد کنید. داخل هر نوت بوک می تونید پاراگراف، معادلات، لینک، تصاویر و... رو اضافه کنید. علاوه بر این موارد نوت بوک برای آموزش خیلی مفیده چونکه به صورت تعاملی می تونید با مخاطبتون ارتباط برقرار کنید. همچنین تحلیل دیتا با نوت بوک خیلی راحت هست.معرفی برنامه نوت بوکنوت بوک یک واسط کاربری هست که شما می تونید اسکریپت های خودتون رو داخل مرورگر بنویسید و نتیجه رو مشاهده کنید. البته این برنامه می تونه به صورت آفلاین اجرا بشه پس نیازی به اینترنت ندارید. هر عملیاتی داخل یک کرنل انجام می شه که در زمان اجرا نوت بوک ایجاد شده است.چجوری از نوت بوک استفاده کنیم؟مرحله ۱) ترمینال رو باز کنید و خط زیر رو وارد کنید.jupyter notebookمرحله ۲) در این مرحله مرورگر شما باز می شه و صفحه نوت بوک برای شما به نمایش درمیاد. وارد پوشه ای که می خواهید نوت بوک رو بسازید بشید.صفحه اصلی نوت بوکمرحله ۳) بر روی new کلیک کنید و python 3 را انتخاب کنید. اسمرحله ۴) در این مرحله شما یک نوت بوک به اسم Untiltled.ipynb ساختید. بهتره اسمش عوض کنیم برای این کار بر روی file و سپس rename کلیک کنید.تغییر نام نوت بوکدر نوت بوک شما کد ها و متن های خودتون رو داخل یک سری سلول (Cell) می نویسید. داخل یک سلول می تونید یک خط یا چندین خط کد بنویسید و نوت بوک خط به خط اجرا می کنه.نمونه یک سلولبرای مثال با وارد کردن کد های زیروارد کردن لایبرری رسم نموداروارد کردن لایبرری های محاسباتینمونه کد برای کشیدن نمودارخروجی زیر به شما داده میشهخروجیمرحله ۵) برای شروع به استفاده از نوت بوک بهتر هست که بدونید وقتی که رنگ سلول سبز هست یعنی شما داخل مد ویرایش هستید و وقتی آبی هست یعنی شما در مد اجرا قرار داریدمد ویرایشمد اجراداخل یک سلول خط زیر را وارد نماییدprint(&quot;Salam!&quot;)برای اجرای خط بالا دو راه حل وجود داره:کلیک بر روی runمیانبر صفحه کلیدبرای اجرای کد می تونید بر روی cell و سپس run cells and select below کلیک کنید.اجرا کدنتیجه اجرایک راه ساده تر استفاده از میانبر های صفحه کلید هست که برای دیدن این میانبر ها بر روی help و سپس keyboard shortcuts کلیک کنید.حالت دستور (اجرا)حالت ویرایشبرای مثال shift+enter رو بزنید و ببینید که کدتون اجرا می شه.مرحله ۶) برای بستن نوت بوک بر روی file و سپس close and halt کلیک کنید.بستن نوت بوکنکته: نوت بوک به صورت خودکار ذخیره می شه. البته اگه ذخیره نشده باشه قبل از خروج بهتون ارور میده و شما می تونید ذخیره کنید.خلاصهنوت بوک یک وب اپلیکیشن هست که شما می تونید کد های پایتون و R رو داخلش اجرا کنید. اشتراک گذاری کد و عنصر های متنی با نوت بوک خیلی ساده است.برای اجرای نوت بوک داخل ترمینال خط زیر را وارد کنید: jupyter notebookهرجایی می تونید یک نوت بوک بسازیدکد شما داخل یک سلول قرار می گیره و کرنل خط به خط اون رو اجرا میکنه.شما می تونید با میانبر ها کد خودتون رو اجرا کنید مثلا shift+enter</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Sat, 27 Apr 2019 13:23:37 +0430</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۲ - نصب Anaconda و TensorFlow</title>
                <link>https://virgool.io/dataio/tf-nwxs1jmrleif</link>
                <description>جمع خوبان :-)در این بخش بریم سراغ نصب anaconda و tensorflow و بعد اجرا کردن jupyter notebookنسخه های مختلف تنسورفلوتنسورفلو پردازش موازی در چند cpu و gpu رو پشتیبانی می کنه. که به این معنی هست که پردازش ها می تونه بین چند سیستم مختلف توزیع بشه و سرعت یادگیری مدل بیشتر بشه. با موازی سازی لازم نیست که شما چند هفته منتظر باشید تا خروجی بگیرید.تنسرفلو سه ورژن مختلف داره که یکی برای cpu هست یکی برای gpu های nvidia و دیگری برای tpu خب کاری که قراره بکنیم اینه که نصب Anacondaساخت .yml فایل برای نصب تنسورفلو و وابستگی هاشاجرا Jupyter Notebookاین آموزش برای ubuntu هست و خب برای بقیه سیستم عامل ها هم تقریبا یکسان هست.نصب Anacondaاولین قدم باید یک محیط مجازی بسازیم به چند دلیل:در سطح کاربر هر ورژنی از پایتون که بخوایید رو می تونید نصب کنیدتوانایی نصب و بروزرسانی لایبرری ها به صورت مجزا از لایبرری های سیستم و بدون نیاز به دسترسی rootاز اینکه بخواهید تشخیص بدید فلان لایبرری با کدام لایبرری منطبق هست به مشکل نمی خورید و می تونید داخل برنامه های مختلفتون از ورژن های مختلف استفاده کنید.ریسک بهم ریختن نیازمندی های سیستم رو هم دیگه ندارید.موقع خروجی گرفتن و انتقال برنامه به سیستم دیگه تمام نیازمندی ها رو می دونید.برای نصب ابتدا به سایت  Anaconda برید و نسخه آخر رو مطابق با سیستم خودتون دانلود و نصب کنیدساخت yml فایل برای نصب tensorflow و وابستگی هااین مرحله شامل کار های زیر هستساخت فایل ymlنصب تنسورفلوفعال سازی Anacondaمرحله ۱) ساخت فایل ymlبا خط زیر یک فایل yml می سازیم که نیازمندی های لازم برای environment مورد نظرمون داخلش قرار می دیم. مثل tensorflow و jupytertouch env-tf.ymlسپس این فایل باز می کنیم و ویرایش می کنیم.و خط های زیر رو داخلش قرار می دهیم (توی فایل yml دقت کنید که space و indent مهمه)name: env-tf
dependencies:
  - python=3.7  
  - jupyter  
  - pandas 
  - pip 
  - pip:      
    - tensorflowمرحله ۲) کامپایل فایل ymlبا خط زیر فایل رو کامپایل کنیدconda env create -f env-tf.ymlمرحله ۳) فعال سازی محیط condaخب تا این لحظه محیط مجزا جدید خودمون رو ساختیم.برای مشاهده محیط های مختلف دستور زیر رو می زنیم.conda env listبا دستور زیر هم محیطی که خودمون ساختیم رو فعال می کنیم.source activate env-tfاختیاری: مثلا بعد از این که خط بالا رو وارد کردید با تایپ خط زیر می تونید نسخه تنسورفلو رو بروزرسانی کنید.pip install --upgrade tensorflowاجرا Jupyter Notebookبرای کار با تنسورفلو یک نوت بوک می سازیم .نکته: هر بار که خواستید نوت بوک رو باز کنید محیط رو به محیط مخصوصی که برای اینکار ساختیم تغییر بدید.در کل مراحلی که باید انجام بدید به شرح زیر هست:فعال سازی محیط env-tf source activate env-tfباز کردن Jupyterjupyter notebookبعد از اینکار یه تب داخل مرورگرتون باز میشه به آدرس http://localhost:8888سپس به راحتی بر روی new و python3 کلیک می کنید و یک نت بوک جدید می سازید.وارد کردن tensorflowخط زیر رو وارد کنید سپس shift+enter و از تنسورفلو استفاده کنید.import tensorflow as tfhello = tf.constant(&#039;Hello, World!&#039;)
helloتبریک! انجام شد.وقتی هم خواستید خارج بشید داخل ترمینال دوبار ctr+c رو بزنید.این قسمت به صورت مختصر سعی کردم بنویسم و خب خودم هم تست کردم اگه به مشکلی خوردید اول گوگل کنید بعد هم بپرسید. سپاس :-)</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Fri, 19 Apr 2019 16:06:51 +0430</pubDate>
            </item>
                    <item>
                <title>تنسورفلو ۱ - تنسورفلو شروع می شود</title>
                <link>https://virgool.io/dataio/tf-hnyavjp2ywrz</link>
                <description>TensorFlow = Tensor + Flowchartتنسرفلو یک کتاب خانه یادگیری ماشین و یادگیری عمیق است که توسط گوگل منتشر شده است و گوگل برای این که کاربراش تجربه کاربری بهتری داشته باشند این لایبری رو جا های مختلفی استفاده کرده یکی ازا این مثال ها وقتی هست که شما شروع به جست و جو می کنید و گوگل به صورت خودکار نوشته شما رو کامل می کنه.حدس زدن ادامه متن توسط گوگلسه دسته از آدما از یادگیری ماشین استفاده می کنند ۱. محققین ۲. دانشمندان علوم داده ۳. برنامه نویس هابرای پاسخ گویی به نیاز این افراد تیم گوگل برین لایبرری تنسورفلو را اینجاد کردهتنسورفلو می تونه روی cpu ها و gpu های مختلف اجرا بشه و با زبان های مختلفی همچون  c++ پایتون یا جاوا استفاده بشه. تنسورفلو از سرور ها بگیرید تا حتی روی موبایل ها می تونه اجرا بشه.تاریخچه تنسورفلواز زمانی که حجم اطلاعات زیاد شد یادگیری عمیق شروع کرد بر الگوریتم های یادگیری عمیق غلبه کنه و خب گوگل هم به این نتیجه رسید که می تونه با این شبکه های عصبی عمیق خدماتش ارتقاء بده و شروع کردن به ساخت فریم ورکی به اسم تنسورفلو که می تونست کمک کنه که توسعه دهنده ها و محققین همزمان روی مدل های هوش مصنوعی باهم کار کنند. وقتی که پروژه به اندازه کافی توسعه پیدا کرد و مقیاس پذیری خوبی پیدا کرد در سال 2015 به صورت عمومی منتشر شد. البته تا سال 2017 هنوز ورژن پایدارش منتشر نشده بود.ویژگی مهم تنسورفلو اینه که اپن سورس هست و مجوزش هم آپاچی هست پس راحت می تونید ازش استفاده کنید، ویرایشش کنید و توزیع خودتون منتشر کنید حتی می تونید ازش درآمد کسب کنید بدون اینکه نیاز باشه به گوگل پولی بدهید :-)معماری تنسورفلومعماری تنسورفلو سه قسمت داره که میشه ۱. پیش پردازش دیتا ها ۲. ساخت مدل ۳. تعلیم و تخمین مدلدلیل این نام گذاری به تنسورفلو اینه که به عنوان ورودی آرایه های چند بعدی ای دریافت می کنه که اسمشون tensor هست و بعد شما می تونید یک سری گراف هایی از عملیات ها بر روی دیتا های خود اجرا کنید که به صورت flowchart هست.کجا اجرا میشه؟برای استفاده از این لایبرری دو فاز وجود دارهفاز توسعه: وقتی هست که مدل رو تعلیم می دید که این فاز معمولا روی لپ تاپ یا سیستمتون انجام میشه.فاز اجرا: وقتی تعلیم تموم شد شما می تونید هرجایی از دسکتاپ بگیر تا سرور ها و حتی موبایل ها مدلتون رو ران کنید.پس تعلیم و اجرا مدل می تونه روی ماشین های مختلفی انجام بشه.علاوه بر استفاده از CPU ها شما می تونید روی GPU هم تنسورفلو رو اجرا کنید.توی محاسبات ماتریکسی چون که یه عملگر یکسان روی تعداد زیادی از اطلاعات انجام می گیره، این نوع از محاسبات با ساختار GPU ها منطبقه این نکته رو اواخر سال 2010 محققین استفورد کشف کردند.یک نکته دیگه اینکه این لایبرری با زبان C++ نوشته شده پس خیلی سریع هست البته می تونید با سایر زبان ها مثل پایتون ازش استفاده کنید.یک ویژگی مهم تنسورفلو، تنسوربورد هست که به شما اجازه می ده مشاهده کنید تنسورفلو چکار داره می کنه.اجزا تنسورفلوتنسوریک تنسور آرایه ای از ماتریکس های N بعدی هست که می تونند انوع اطلاعات رو نمایش بدند. هر مقداری در تنسور اطلاعاتی با شکل یکسانی (Shape) نگه می دارند. تنسور ها می تونند ورودی یا خروجی یک محاسبه باشند.گرافدر تنسورفلو  همه عملیات ها داخل گراف انجام می شوند. هر گراف مجوعه ای از محاسبات هست که پیوسته انجام می شوند. هر محسابه ای با نام op node شناخته می شه که به هم دیگه وصل هستند.حالا چرا گراف؟می تونه روی سیستم های مختلف اجرا بشهگراف می شه ذخیره کرد که بعدا استفاده کردهمه محاسبات در گراف با اتصال تنسور ها به هم اجرا می شه.به صورت خلاصه این که توی گراف ها هر یالی یک مقدار (تنسور) هست و هر گره یک عملگر( مثلا جمع) هست.چرا تنسورفلو مشهوره؟تنسورفلو بهترینه چونکه برای استفاده همه ساخته شده و تز api هایی استفاده میشه که بشه در مقیاس های مختلف از معماری های یادگیری عمیق همچون RNN, CNN استفاده کرد. چونکه بر اساس محاسبات گراف هست توانایی تجسم شبکه های عصبی داخل TensorBoard رو داره که خب برای دیباگ خیلی مفیده. و در کل اینکه تنسورفلو ساخته شده برای مقیاس پذيری در زمان استقرار.یک خبر خوب اینکه بزرگترین کامیونیتی را در بین فریم ورک های مختلف یادگیری عمیق در گیت هاب داره.چند تا از الگوریتم ها که توسط تنسورفلو پشتیبانی میشه چیه؟رگرسیون خیطی: tf.estimator.LinearRegressorطبقه بندی: tf.estimator.LinearClassifierطبقه بندی عمیق: tf.estimator.DNNClassifierDeep learning wipe and deep: tf.estimator.DNNLinearCombinedClassifierBooster tree regression: tf.estimator.BoostedTreesRegressorBoosted tree classification: tf.estimator.BoostedTreesClassifierچند مثال سادهimport numpy as np
import tensorflow as tfتوی دو خط بالا لایبرری numpy و tensorflow رو وارد می کنیم.در این مثال می خواییم X_1 و X_2 را ضرب کنیم. اول باید گراف رو بسازیم و بعد یک session تنسورفلو ران کنیم که نتیجه رو محاسبه کنه.بریم شروع کنیممرحله ۱: تعریف متغیراولین قدم باید نود های ورودی X_1 , X_2 را بسازیم. تو تنسورفلو باید مشخص کنیم چه نوع نودی قراره بسازیم که اینجا نوع placeholder رو انتخاب می کنیم.placeholder:این نوع در هر زمان که ما یک محاسبه انجام می دهیم یک مقدار جدید به تنسور اختصاص می دهد.X_1 = tf.placeholder(tf.float32, name = &quot;X_1&quot;)
X_2 = tf.placeholder(tf.float32, name = &quot;X_2&quot;)همونطور که می بینید به عنوان ورودی نوع این نود رو float و اسمش هم اسم متغییر وارد کردیم.مرحله ۲: تعریف محاسبهmultiply = tf.multiply(X_1, X_2, name = &quot;multiply&quot;)با خط بالا داریم یک راس می سازیم که نقش عملگر عملگر ضرب رو دارهکه ورودی اون راس هایی هست که میخواییم ضرب بشند و اسمش هم گذاشتیم multiplyخب الان اولین گرافمون رو ساختیم.مرحله ۳: اجرا عملیاتبرای اجرا عملیات باید یک جلسه یا session اجرا کنیم. با استفاده از tf.Session() این جلسه ایجاد می شه و وقتی از run استفاده کنیم اونو اجرا می کنه.وقتی که ضرب رو قراره run کنیم باید به ورودی مقادیر تنسور های x1 و x2 رو بدهیم اینکار با تخصیص feed_dict انجام میشه. توی این مثال مقادیر 1 تا 3 به x1 و 4 تا 6 به x2 اختصاص پیدا کرده. و نتیجه رو چاپ کردیم.X_1 = tf.placeholder(tf.float32, name = &quot;X_1&quot;)
X_2 = tf.placeholder(tf.float32, name = &quot;X_2&quot;)multiply = tf.multiply(X_1, X_2, name = &quot;multiply&quot;)with tf.Session() as session:
    result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]})
    print(result)[ 4. 10. 18.]راه های مختلف وارد کردن دیتا در تنسورفلوخب یکی از اولین مراحل قبل از آموزش مدل وارد کردن دیتا هست. که دو حالت داره:وارد کردن اطلاعات به حافظه رم: یه راه ساده هست که اطلاعات وارد یک آرایه مموری می کنید مثلا یک خط کد به زبان پایتون می نویسید.استفاده از خط لوله دیتا تسورفلو: تنسورفلو یک سری api داره که کمک می کنه دیتا رو وارد کنید و یک سری عملیات روشون انجام بدید و سپس به الگوریتمتون بدید.این متد خیلی موثره مخصوصا وقتی که دیتاست خیلی بزرگه. برای مثال تصاویر عظیم هستند و در رم جا نمی شند. اینجا دیتا پایپ لاین عمل مدیریت حافظه رم شما رو به عهده می گیره.سوالی که الان وجود داره اینه که از کدوم استفاده کنیماگه دیتا شما کمتر از ۱۰ گیگ هست که راحت می تونید از متد اول استفاده کنید مثلا یک لایبرری مشهور برای این کار pandas هست. در غیر این صورت مثلا اگه ۳۰ گیگ اطلاعات دارید و رمتون ۱۲ گیگ هست طبیعتا نمی تونید از این روش استفاده کنید و باید برید سراغ api پایپ لاین. پایپ لاین دیتا ها رو دسته دسته (batch) می کنه و هر دسته وارد پایپ لاین شده و برای یاد گرفتن مدل استفاده میشه. استفاده از پایپ لاین باعث میشه که بتونید از پردازش موازی استفادع کنید. یعنی تنسورفلو می تونه در چند cpu مختلف همزمان مدل رو آموزش بده.خلاصه که اگه دیتاست شما کوچکه کامل داخل مموری رم واردش کنید مثلا با pandasدر غیر این صورت یا اگه می خوایید از چند cpu استفاده کنید از پایپ لاین تنسورفلو استفاده کنید.ایجاد خط لوله در تنسورفلومرحله ۱) ساخت دیتابا لایبرری numpy دو تا عدد رندم می سازیمimport numpy as np
x_input = np.random.sample((1,2))
print(x_input)[[0.8835775 0.23766977]]مرحله ۲) ساخت placeholderتوی این مرحله یک placeholder به اسم X به صورت یک آرایه با دو عضو از نوع float می سازیم# using a placeholder
x = tf.placeholder(tf.float32, shape=[1,2], name = &#039;X&#039;)
مرحله ۳: ساخت datasetدر این مرحله ما باید dataset رو تعریف کنیم که مقدار placeholder x داخلش قرار بدیم.tf.data.Dataset.from_tensor_slicesdataset = tf.data.Dataset.from_tensor_slices(x)مرحله ۴: ساخت پایپ لایندر این مرحله ما  باید پایپ لاین رو مقدار دهی اولیه کنیم که اولین قدم یک iterator می سازیم که بر روی دیتا ها جریان داشته باشه.  با متد get_next مقدار بعدی رو می گیریم که در این مثال یک batch موجود است که فقط دو مقدار دارد.iterator = dataset.make_initializable_iterator() 
get_next = iterator.get_next()مرحله ۵: اجرا محاسبهدر مرحله آخر یک سشن اجرا می کنیم که ورودی آن iterator و مقادیر ورودی هست که توسط numpy ساخته شده است. و برای هر کدوم مقدارش چاپ می کنیم.with tf.Session() as sess:
    # feed the placeholder with data
    sess.run(iterator.initializer, feed_dict={ x: x_input }) 
    print(sess.run(get_next))[0.8835775 0.23766978]خلاصهتنسورفلو مشهور ترین کتاب خونه یادگیری عمیق هست  که با استفاده از اون می تونید از هر گونه ساختار یادگیری عمیق بهره ببرید. گوگل برین این پروژه را توسعه داده که فاصله بین تیم های تحقیقاتی و تیم های توسعه رو پر کنه و تقریبا گوگل در تمام پروژه هاش ازش استفاده می کنه. یکی از دلایل اصلی استفاده از تنسورفلو آسان بودن مقیاس پذیر شدن در زمان Deploy هست. تنسورفلو از سرور های قدرتمند تا گوشی های Android , IOS قابل استفاده هست.تنسورفلو در یک session کار می کنه که هر جلسه به وسیله یک گراف با محاسبات مختلف تعریف شده است.به عنوان یک مثال ساده در تنسورفلو ضرب به صورت زیر استتعریف متغیرX_1 = tf.placeholder(tf.float32, name = &quot;X_1&quot;)
X_2 = tf.placeholder(tf.float32, name = &quot;X_2&quot;)
۲. تعریف محاسبهmultiply = tf.multiply(X_1, X_2, name = &quot;multiply&quot;)۳. اجرای عملیاتwith tf.Session() as session:
result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]})
print(result)یک عمل رایج در تنسورفلو ایجاد پایپ لاین هست برای load دیتا در حافظه رم که با مراحل زیر انجام می شهساخت دیتا هاimport numpy as np
x_input = np.random.sample((1,2))
print(x_input)
۲. ساخت place holderx = tf.placeholder(tf.float32, shape=[1,2], name = &#039;X&#039;)۳. تعریف متد دیتاستdataset = tf.data.Dataset.from_tensor_slices(x)۴. ساخت خط لولهiterator = dataset.make_initializable_iterator() get_next = iteraror.get_next()۵. اجرا برنامهwith tf.Session() as sess:  
sess.run(iterator.initializer, feed_dict={ x: x_input })  
print(sess.run(get_next)) </description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Wed, 17 Apr 2019 18:26:06 +0430</pubDate>
            </item>
                    <item>
                <title>مگه جنگه؟</title>
                <link>https://virgool.io/@AmirAbbas8/%D8%AC%D9%86%DA%AF-l9xqic0rsva6</link>
                <description>بهم بشکن این طبل خالی میان را هر روز تعداد زیادی پست های آموزش می بینم که هیچی نمیشه ازشون یاد گرفت و قشنگ معلومه برای ساخت پرسنال برندینگ ساخته شدهحالا ی سوالی پیش میاد. مگه جنگه؟ی نفر می تونه چیزی که بلده آموزش بده بقیه هم استفاده کنند ولی چرا آموزش های انگلیسید قابل استفاده تره.ی نکته ای ک هست اینه که آیا می خواییم واقعا یاد بدیم یا یکاری رو برای این که خودمون رو معرفی کنیم انجام می دیم یا یک کاری رو برای این انجام می دیم که نشون بدیم دانشمون از بقیه خیلی بیشتره ولی خروجی محتوایی که تولید میشه اینقدر مضحکه که توی اولین خوندن مشخص میشه این جا هم چشم و هم چشمیهیا فکر کنید توی یک جلسه ای هستید همه نظر میدن و سعی میکنن رو نظر هم نظر بدن برای اینکه نشون بدن از بقیه بهتر می فهمن درصورتی که اکثر حرف هایی که می شنوم رو چند روز قبل ی پست یا توییت دربارش دیدم.و اگه دقت کنید به حرف هاشون هیچ راه حل عملی و به درد بخور ارائه نمیدن و فقط درگیر چشم و هم چشمی کلامی شدن.واقعا ی سوال برام پیش اومده این همه تلاش و پایین و بالا رفتن و به هر دری زدن برای پیشرفت چه ارزشی داره؟چند تا پیشنهاد:جناب نظامی: کم گوی و گزیده گوی چون در/تا ز اندک تو جهان شود پرخانم اعتصامی: بهم بشکن این طبل خالی میان را </description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Fri, 15 Mar 2019 20:16:48 +0330</pubDate>
            </item>
                    <item>
                <title>لایف: یک داستان</title>
                <link>https://virgool.io/@AmirAbbas8/life-qk2anygry4of</link>
                <description>حدود روز های کنکور بود که نوشتن لایف رو شروع کردم حدودا یک سال زمان صرف توسعه لایف  کردم که اپ به جایی رسید که آماده انتشار بود البته به صورت پیوسته می تونم بگم سه ماه وقت می گرفتکد لایف زمانی شروع کردم به نوشتن که دو تا برنامه قبلش نوشته بودم اما نکته جالبی که هست تا آخرین روز های نوشتن لایف من حتی نمی دونستم چیزی به اسم کانستراکتر وجود داره! (انگیزه خودتون رو از دست ندید به خوندن ادامه بدید قراره جالب بشه)خب یادمه ترم دوی دانشگاه بود درس برنامه نویسی پیشرفته داشتم و فهمیدم که کلاس ها چیزی به اسم سازنده داره (چه جالب!) البته از قبل می دونستم که چیزی به اسم کلاس وجود دارهحالا نکته مهم اینه که من وقتی مفهموم خیلی خیلی پایه ای مثل سازنده کلاس ها رو نمی دونستم چجوری یه اپ نوشتم که دیتابیس داشت اندروید داشت پی اچ پی داشت و خب حتی ارتباط برقرار کردن بین قسمت های مختلف برنامهراستش این اتفاق بخاطر این بود که روز اول یادگیری برنامه نویسی اندروید دیدم اگه بخوام اول یاد بگیرم و بعد شروع به کد زنی کنم زمان گیر می شه و بخاطر این که مفاهیم زیادی باید یاد بگیرم بیخیال شدم و پریدم وسط دریای اندرویدخب شنا بلد نبودم ولی غرق نشدمدلیل این بود که هدف های کوچکی تعیین می کردم با توتوریال ها بهش می رسیدمیادمه یکی از چالش برانگیزترین هدف ها برام ارتباط برنامه با وب سرور خودش بود و وقتی انجام شد خیلی خوشحال بودملایف رو وقتی نوشتم که دانش زیادی نداشتم و خب هیچ انتظاری از من نبود برای همین بدون هیچ ترسی هرکاری دوست داشتم می کردم می دونستم که نسبت به جایگاهی که هستم هر کاری که کنم هر کدی که بزنم هیچ کسی نمی تونه به من گیر بده چون یه مبتدی بودم و خب الان قسمت هایی از کد هایم رو که می بینم خندم می گیره ولی بهش افتخار می کنم چون زمانی که مبتدی بودم دست روی دست نزاشتم و به تلاش ادامه دادم ولی خب الان که دانشم به نسبت اون زمان بیشتره نمی تونم همین جوری یه اپ رو شروع کنم چون می خوام پروژه با کیفیت خیلی بیشتری انجام بشهو اما سر انجام لایف چی شدخب کد های لایف عملکرد مناسبی داره ولی نکته ای که هست این برنامه یک حالت آموزشی برای من داشت پس توسعه اون طبق ساختار های موجود نمی تونه نیاز های برنامه رو توی یک مقیاس بزرگتر برآورد کنه ولی لایف به هدفش رسید با کمک لایف تونستم استعداد خودم رو نشون بدم و خب فکر کنم مهم ترین نتیجه ای که داشت این بود که وارد تیم توسعه زمین بشم.  http://zamin.link/ جذاب ترین نکته زمین اینه که عضو یه تیم خلاق  هستیم و اگه تکنولوژی جدیدی وجود داره و لبه تکنولوژی قرار داره زمین هم همونجا داره قدم بر میدارهمی تونم بگم تاثیر زمین توی بهتر شدن کدهام غیرقابل انکاره مخصوصا تیم صمیمی و دوستانه ای که داریم کد لایف رو توی گیت هاب قرار دادم هرچند می دونم کد ها بسیار ساده داره ولی می تونم بگم برای یادگیری اندروید یه نمونه عالی هست https://github.com/amirabbas8/life-android-client طرح هایی دارم که یک ریفکتور اساسی حتی از ابتدا باز نویسی کد ها انجام بدم با توجه به چیز هایی که یاد گرفتم ولی خب هنوز در مراحل تحلیل هستم علاقه دارم ان شا الله پروژه لایف با AI درگیر بشه این چند سالی که در حال توسعه اندروید هستم پر از خاطرات زیبایی هست از منتشر شدن RecyclerView تا ART یا وقتی اندروید استودیو اومد و این خاطرات شیرینی هست که حس خوبش باعث میشه اندروید دوست داشتنی باشه و از این خاطرات خوب باعث شده امروز به AndroidX برسیم که این هم برگ تازه ای از این دفتره</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Tue, 19 Feb 2019 23:01:28 +0330</pubDate>
            </item>
                    <item>
                <title>مسیر</title>
                <link>https://virgool.io/@AmirAbbas8/%D9%85%D8%B3%DB%8C%D8%B1-pjidd3xvzsdu</link>
                <description>هر کسی یه مسیری توی زندگیش انتخاب می کنه که ادامه بده این مسیر میتونه یه مسیر دلچسب باشه یا یه مسیر مزخرفخیلی راحته که چجوری یه مسیر دلچسب انتخاب کنیم  اکثرا هم میدونیم چکار باید کنیم اونم اینه که به صدای قلبمون گوش کنیم و اون چیزی که واقعا دوست داریم انجام بدیم.گاهی وقتا بخاطر شرایط زندگی چیزی رو انتخاب می کنیم که دوست نداریم که موفق بشیم و حتی کم کم سعی می کنیم به دوست داشتن اجباری  برسیم ولی اکثرا این اتفاق نمیفته حتی اگه اتفاق بیفته دوست داشتن اجباری دلچسب نیستباید با خودمون روراست باشیم واقعا چه چیزی هست که بیشتر از هرچی دوست داریم باید این سوال رو در هر انتخابی از خودمون بپرسیم و جواب به این سوال باید یجوری باشه که خودمون گول نزنیم این انتخاب یه سری نکاتی داره اول از همه باید این انتخاب رو طبق توانایی ها و علایق خودمون انتخاب کنیمنباید بگیم اگه یک نفر دیگه موفقه ما هم باید توی مسیر اون بریم و انتخاب های اونو کنیم هرکسی مسیر خاص خودشو دارهنکته مهم دیگه ای که هست ما باید از مسیرمون چشم انداز داشته باشیم بدونیم قراره به کجا برسیم حتی بتونیم ببینیم هرچه واضح تر بتونیم ببینیم احتمال موفق شدنمون بیشتر میشه  باید حواسمون باشه زندگی پر است از تردید و ناپایداری هیچوقت قرار نیست همه چیز به سکون برسه و این چیزیه که زندگی رو جذاب میکنه البته با تموم این دغدغه ها ما باید خودمون کنترل کنیم و به آرامش روحی برسیمیه نکته مهم دیگه اینه که اگه قراره انتخاب مسیر زندگیمون بر اساس علاقه مون باشه این خیلی عالیه ولی نباید هیچوقت اخلاقیات را فراموش کنیممن باید کاری که دوست دارم بکنم ولی به صورت انسانی و با اخلاقوقتی مسیر درست خودمون رو پیدا کردیم بهتره بدون ترس این مسیر رو ادامه بدیم هیچ چیزی نمیتونه آدم از پا دربیاره بجز از دست دادن ایمان شجاعت تلاش کردن شیرین تر از موفق شدنه البته موفق شدن فوق العادست ولی ما نباید اجازه بدیم ترس از شکست ما رو از تلاش کردن توی مسیر مورد علاقمون بازدارهپایان</description>
                <category>امیرعباس</category>
                <author>امیرعباس</author>
                <pubDate>Thu, 28 Jun 2018 21:29:27 +0430</pubDate>
            </item>
            </channel>
</rss>