جستجو برای:
  • دوره‌های آموزشی
  • وبلاگ
  • آموزش‌های رایگان
    • آموزش پایتون رایگان
    • آموزش یادگیری ماشین رایگان
    • آموزش یادگیری عمیق رایگان
    • آموزش pytorch رایگان
    • آموزش رایگان matplotlib
    • آموزش گوگل کولب
  • نقشه راه AI
  • کلاس خصوصی
  • همکاری با ما💚
  • حساب کاربری
  • اساتید
  • درباره ما
     
    • 0902-546-9248
    • howsam.mail@gmail.com
    آکادمی هوش مصنوعی هوسم
    • دوره‌های آموزشی
    • آموزش‌های رایگان
      • آموزش پایتون
      • آموزش یادگیری ماشین رایگان
      • آموزش یادگیری عمیق رایگان
      • آموزش pytorch رایگان
      • آموزش گوگل کولب
    • نقشه راه AI
    • وبلاگ
    • درباره ما
      • اساتید
      • پشتیبانی
    0
    ورود / عضویت

    بلاگ

    آکادمی هوش مصنوعی هوسم وبلاگ یادگیری عمیق پایتورچ اندیس گذاری در پایتورچ

    اندیس گذاری در پایتورچ

    2020/05/19
    ارسال شده توسط هوسم
    پایتورچ ، یادگیری عمیق
    3.84k بازدید

    در این جلسه از دوره آموزش پایتورچ رایگان، می‌خواهیم به آموزش اسلایسینگ و اندیس گذاری در پایتورچ بپردازیم. تسلط بر دو مفهوم اسلایسینگ و اندیس گذاری در پایتورچ، به شما قابلیت انجام کارهای پیچیده با تنسورها در پایتورچ را می‌دهد. با هوسم همراه باشید…

    فهرست مطالب نمایش
    1. مقدمه‌ای بر اسلایسینگ و اندیس گذاری در پایتورچ
    2. اندیس گذاری در پایتورچ
    3. اسلایسینگ در پایتورچ

    مقدمه‌ای بر اسلایسینگ و اندیس گذاری در پایتورچ

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

    اندیس گذاری در پایتورچ

    اندیس گذاری اشاره به یک درایه یا المان در تنسور دارد. به‌عنوان مثال، می‌خواهیم بدانیم در یک تنسور (مثلا تنسور دوبعدی)، مقدار درایه (5,3) چقدر است. ابعاد تنسور اهمیتی ندارد و می‌توان مقدار درایه‌های یک‌بعدی تا بعدهای بالاتر را با اندیس گذاری مشاهده کرد. ابتدا، برای روشن شدن نحوه اندیس گذاری، بیایید مثال زیر را باهم بررسی کنیم: 

    >>> a = torch.randn(10)
    >>> print(a)
    tensor([-0.5951, -0.8796,  0.6917,  2.5978, -1.3183, -0.4151,  0.4762,  0.2704, -1.0277,  0.4039])
    
    >>> print(a[5])
    tensor(-0.4151)

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

    1. همواره برای اسلایسینگ و اندیس گذاری در پایتورچ، از براکت استفاده می‌شود. 
    2. تعداد اعداد درون یک براکت برای اندیس گذاری، معادل با تعداد بعد یک تنسور است. یعنی برای یک تنسور سه‌بعدی، باید 3 عدد در براکت قرار دهید. یعنی هربعد، باید به‌صورت جداگانه آدرس‌دهی شود. اندیس گذاری یعنی آدرس‌دهی!
    3. اندیس‌ها یا اعداد را با ویرگول از هم جدا کنید. 
    4. اعداد از صفر شروع می‌شوند. 

    با همین قواعد بالا، می‌توانید اندیس گذاری در هر تنسوری را انجام دهید. بیایید یک مثال دیگر را باهم مرور کنیم. در مثال زیر یک تنسور دوبعدی ساخته و اندیس‌های (0,0)، (1,2) و (1,1) را چاپ کرده‌ایم:

    >>> a = torch.rand(2, 3)
    >>> print(a)
    tensor([[0.3998, 0.1289, 0.5550],
            [0.4936, 0.3883, 0.4064]])
    
    >>> print(a[0, 0], a[1, 2], a[1, 1])
    tensor(0.3998) tensor(0.4064) tensor(0.3883)

    در مثال زیر، اندیس گذاری در تنسور سه‌بعدی را مشاهده می‌کنید:

    a = torch.rand(4, 5, 3)
    
    print(a[0, 0, 0], a[2, 3, 1], a[3, 4, 2])

    توجه به مثال تنسور سه‌بعدی بالا دقت کنید؛ وقتی اندیس‌ها از صفر شروع می‌شوند، برای هربعد، مثلا بعد اول که 4 است، نهایتا تا 3 می‌توانید اندیس‌دهی کنید. یا بعد دوم (5) که معادل تعداد سطرهاست را درنظر بگیرید. برای اندیس گذاری از اعداد 0 تا 4 می‌توانید استفاده کنید. 

    تمرین 1: یک تنسور تصادفی با اعداد صحیح به‌ابعاد 4×5×2×8 بسازید. مقدار درایه صفر، درایه انتهایی، درایه (2,1,4,1) و (6,0,2,2) را چاپ کنید.
    >>> a = torch.randint(0, 100, (8, 2, 5, 4))
    >>>
    >>> print(a[0, 0, 0, 0], a[7, 1, 4, 3], a[2, 1, 4, 1], a[6, 0, 2, 2])
    tensor(3) tensor(40) tensor(42) tensor(68)

    نکته در مواردی پیش می‌آید که بخواهید به اندیس آخر یک بعد اشاره کنید. مثلا در یک تنسور دوبعدی 10×8 می‌خواهیم به مقدار اندیس (سطر 0 و ستون آخر) (0,9) اشاره کنیم. دراین‌حالت می‌توانید از عدد 1- نیز استفاده کنید. با عدد 1- می‌توانید آدرس‌دهی از آخر را انجام دهید. مثلا اندیس بالا را می‌توان به‌صورت (1-,0) نیز نوشت. 

    تمرین 2: در تمرین بالا، با استفاده از 1-، مقدار اندیس آخر را مشاهده کنید.
    >>> print(a[-1, -1, -1, -1])
    tensor(40)

    بسیارخب، به‌همین سادگی اندیس گذاری در پایتورچ به پایان رسید. حال باید سراغ اسلایسینگ در پایتورچ برویم. این تکنیک کمی پیچیده‌تر است و عملگرهای متنوعی هم در آن استفاده می‌شوند. همچنین، در کارهای جبری، یادگیری ماشین و یادگیری عمیق بسیار پرکاربرد است. 

    اسلایسینگ در پایتورچ

    اسلایسینگ در پایتورچ

    اسلایسینگ در پایتورچ، یعنی بخشی از یک تنسور انتخاب شود. درواقع، یک تکه از کیک را ببریم و برداریم! این حالت، مقابل حالت اندیس گذاری است که در آنجا تنها یک نقطه، درایه یا المان را انتخاب می‌کردیم. اما دراینجا می‌خواهیم یک مجموعه درایه یا المان را انتخاب کنیم. برویم سراغ یک مثال ساده؛ در کد زیر، چهار المان از یک تنسور یک‌بعدی به طول 10 انتخاب شده است. 

    >>> a = torch.randn(10)
    >>> print(a)
    tensor([-0.5951, -0.8796,  0.6917,  2.5978, -1.3183, -0.4151,  0.4762,  0.2704, -1.0277,  0.4039])
    
    >>> print(a[4:8])
    tensor([ 0.3088, -0.5783,  1.1667, -0.1869])

    مشاهده می‌کنید، بازهم از براکت استفاده شده است. دو عدد و یک علامت : هم استفاده شده است. علامت : برای نمایش یک بازه در اسلایسینگ به‌کار می‌رود. هربازه‌ای نیاز به عدد ابتدایی و انتهایی دارد. مثلا [a:b] اشاره به یک بازه دارد که از a شروع می‌شود و تا b ادامه دارد. 

    یادآوری در جلسات قبلی هم گفتیم که بازه‌ها در پایتون به‌این‌صورت است که شامل a می‌شود اما شامل b خیر… 

    حال اگر بخواهیم اسلایسینگ را در تنسورهای چندبعدی ببینیم، کافی است بازه را برای هر بعد تنسور تعریف کنیم و هربعد را هم با ویرگول جدا کنیم. چند نمونه مثال ببینیم. در مثال زیر، یک تنسور دوبعدی به‌ابعاد 5×3 داریم که می‌خواهیم (سطر صفر تا دو، ستون دوم تا چهارم) آن را انتخاب کنیم:

    >>> b = torch.randn(3,5)
    >>> print(b)
    tensor([[ 1.2051,  1.1934, -1.2770,  0.5241, -0.9711],
            [ 0.4834, -1.1279, -0.3279,  0.2349,  0.4098],
            [ 0.9134,  0.8365,  0.5349,  1.6984,  1.0256]])
    
    >>> print(b[0:2, 2:4])
    tensor([[-1.2770,  0.5241],
            [-0.3279,  0.2349]])

    حال می‌خواهیم (سطر اول تا دوم، ستون اول) را انتخاب کنیم:

    >>> print(b[1:2, 1])
    tensor([-1.1279])

    در مثال زیر، یک تنسور سه‌بعدی داریم که می‌خواهیم (صفحه اول تا دوم، سطر سوم تا پنجم، ستون دوم تا چهارم) را انتخاب کنیم. 

    >>> c = torch.randn(4, 6, 7)
    >>> print(c[1:2, 3:5, 2:4])
    tensor([[[ 1.0819, -1.6137],
             [-0.9009,  0.2869]]])

    حال در تنسور دوبعدی b می‌خواهیم (سطر دوم، ستون سوم تا آخر) را انتخاب کنیم. می‌خواهیم ستون آخر هم انتخاب شود. بسیار خب، اگر کد زیر را بنویسیم، ستون آخر انتخاب نمی‌شود:

    >>> print(b[2, 3:4])
    tensor([1.6984])

    خب آخرین عدد ممکن برای ستون‌ها 4 است ولی با گذاشتن این عدد ستون آخر انتخاب نشد. شاید بهتر باشد بجای عدد آخر، 1- بگذاریم! ببینید:

    >>> print(b[2, 3:-1])
    tensor([1.6984])

    بازهم نشد… بیایید بجای 4 عدد 5 قرار دهیم و نتیجه را ببینیم:

    >>> print(b[2, 3:5])
    tensor([1.6984, 1.0256])

    خب عدد 5 گذاشتیم و نه‌تنها خطا نداد، بلکه جواب مورد انتظار را هم گرفتیم. اما کار راحت‌تری هم می‌توانیم انجام دهیم. دراین‌حالت که انتهای بازه ندارید، خب شما هم عددی وارد نکنید! یعنی کد زیر:

    >>> print(b[2, 3:])
    tensor([1.6984, 1.0256])

    کد بالا یعنی، از ستون سوم تا آخر… حال بیایید برای یک تنسور یک‌بعدی از المان دوم تا آخر را انتخاب کنیم:

    >>> a = torch.rand(5)
    >>> print(a)
    tensor([0.8211, 0.6227, 0.7089, 0.6312, 0.8277])
    
    >>> print(a[2:])
    tensor([0.7089, 0.6312, 0.8277])

    حال، بیایید بازه را برعکس کنیم. از ابتدا تا المان چهارم… بسیار ساده است و به‌صورت زیر حاصل می‌شود:

    >>> print(a[0:4])
    tensor([0.8211, 0.6227, 0.7089, 0.6312])

    اما بازهم اگر از ابتدا شروع می‌شود، یعنی ابتدای بازه ندارید. پس می‌توانید تنبلی کنید و عدد ابتدای بازه را ننویسید. یعنی به شکل زیر:

    >>> print(a[:4])
    tensor([0.8211, 0.6227, 0.7089, 0.6312])

    تمرین 3: یک تنسور سه بعدی به سایز 6×5×4 تعریف کنید. بازه (صفحه دوم تا آخر، سطر سوم تا چهارم، ستون اول تا سوم) را انتخاب کنید. منظور از تا آخر، یعنی شامل آخری هم بشود.
    >>> c = torch.randn(4, 5, 6)
    >>> print(c[2:, 3:4, 1:3])
    tensor([[[-1.2612, -0.5005]],
    
            [[-0.2332,  0.9402]]])

    می‌خواهیم در تنسور دوبعدی b، سطر دوم را انتخاب کنیم. دراین‌حالت، چه باید بنویسیم؟ اصلا برای ستون هیچ قید و شرطی نگذاشته‌ایم. یعنی بنویسیم:

    >>> print(b[2, 0:5])
    tensor([0.9134, 0.8365, 0.5349, 1.6984, 1.0256])
    
    >>> print(b[2, 0:])
    tensor([0.9134, 0.8365, 0.5349, 1.6984, 1.0256])

    بله، کد بالا درست کار می‌کند. اما وقتی روی یک بعد (بعد ستون در بالا) هیچ قید و شرطی نداریم، بهتراست اصلا عددی هم برای ابتدا و انتهای بازه وارد نکنیم و بنویسیم:

    >>> print(b[2, :])
    tensor([0.9134, 0.8365, 0.5349, 1.6984, 1.0256])

    بله، اگر با یک بعد در تنسور کاری ندارید، کافی است تنها : بگذارید.

    حالا یک تنسور چهاربعدی را درنظر بگیرید. می‌خواهیم فقط ستون سوم را انتخاب کنیم و بقیه بعدها کامل حضور داشته باشند. بنابراین، باید بنویسیم: 

    >>> d = torch.randint(0, 1000, (10, 5, 8, 3))
    
    >>> e = d[:, :, :, 2]
    >>> print(e.shape)
    torch.Size([10, 5, 8])

    خب، ساده بود. اما می‌بینید که چندبار از : استفاده کرده‌ایم. دراین حالت هم یک میانبر برای تنبل‌ها داریم. از … استفاده کنید. ببینید:

    >>> e = d[..., 2]
    >>> print(e.shape)
    torch.Size([10, 5, 8])

    زمانی‌که به چند بعد پشت سرهم کاری ندارید، کافی است از … استفاده کنید.

    تمرین 4: در تنسور چهار بعدی d، سطر سوم را انتخاب کنید. روی بقیه بعدها، محدودیتی نداریم.
    >>> f = d[..., 2, :]
    >>> print(f.shape)
    torch.Size([10, 5, 3])

    تا اینجا آموختید که چگونه یک سطر، ستون، صفحه را انتخاب کنید. یک تنسور دو بعدی را درنظر بگیرید. می‌خواهیم ستون‌های صفر، دو و چهار را انتخاب کنیم. یعنی چند ستون را می‌خواهیم. چه باید کنیم؟ می‌توانیم کد زیر را بنویسید:

    >>> a = torch.rand(4, 6)
    >>> print(a)
    tensor([[0.2891, 0.6018, 0.5932, 0.7537, 0.3142, 0.9050],
            [0.4362, 0.5825, 0.9217, 0.3075, 0.1240, 0.3947],
            [0.9747, 0.0743, 0.3372, 0.6876, 0.0248, 0.0022],
            [0.9254, 0.5736, 0.9657, 0.6508, 0.1614, 0.5609]])
    
    >>> print(a[:, [0, 2, 4]])
    tensor([[0.2891, 0.5932, 0.3142],
            [0.4362, 0.9217, 0.1240],
            [0.9747, 0.3372, 0.0248],
            [0.9254, 0.9657, 0.1614]])

    بنابراین، اگر در یک بعد چند نمونه (مثلا چند ستون یا سطر دلخواه) را خواستیم، کافی است یک لیست با براکت [] بسازیم و درون آن اندیس‌های مدنظرمان را قرار دهیم.

    تمرین 5: یک تنسور سه‌بعدی دلخواه بسازید. تنسوری براساس (صفحه سوم، سطر اول، ستون صفر و آخر) از تنسور سه‌بعدی بسازید.
    >>> c = torch.rand(5, 4, 3)
    
    >>> print(c[3, 1, [0, -1]])
    tensor([0.3888, 0.9681])

    تا اینجا، با عملگرهای : ، … و لیست اندیس‌ها به شکل‌های مختلف آشنا شدید. درادامه، می‌خواهیم عملگر جدیدی را معرفی کنیم. با آخرین قسمت از جلسه اسلایسینگ و اندیس گذاری در پایتورچ همراه باشید…

    در یکی از مثال‌های بالا گفتیم که بیایید ستون‌های صفر و دو و چهار را انتخاب کنیم. دقت کنید، اندیس ستون‌ها دوتا دوتا افزایش یافته است. برای این‌کار می‌توانید از :: استفاده کنید. :: معادل با بازه همراه با گام بزرگتر از 1 است. عددی که در سمت راست می‌نویسید، نشان‌دهنده گام است. مثلا عبارت 2::0، یعنی از 0، با گام 2 برو جلو. حال بیایید، این تکنیک را روی تنسورمان پیاده کنیم:

    >>> a = torch.rand(4, 6)
    
    >>> print(a[:, 0::2])
    tensor([[0.3906, 0.5119, 0.1454],
            [0.8949, 0.8278, 0.4501],
            [0.8427, 0.0814, 0.7554],
            [0.4338, 0.7335, 0.3218]])

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

    اشتراک گذاری:
    برچسب ها: indexing tensorslicing tensorآموزش pytorchآموزش پای تورچآموزش پایترچآموزش پایتورچآموزش پایتورچ رایگانآموزش پایتورچ مقدماتیآموزش رایگان پایتورچاسلایسینگ در پایتورچاسلایسینگ در تنسوراندیس گذاری در پایتورچاندیس گذاری در تنسوراندیس و اسلایس در پایتورچ

    مطالب زیر را حتما مطالعه کنید

    LLM Research یا LLM Engineering؟ راهنمای یادگیری مدل‌های زبانی بزرگ
    در چند سال اخیر، اصطلاح LLM یا Large Language Model به یکی از پرتکرارترین واژه‌ها...
    یادگیری انتقالی
    یادگیری انتقالی یا Transfer Learning به معنای استفاده از یک مدل از پیش آموزش‌دیده در...
    شبکه VGG
    شبکه VGG یکی از معماری‌های موفق و معروف در حوزه یادگیری عمیق است که در...
    مهندسی پرامپت
    امروزه، با ظهور ChatGPT و سایر ابزارهای هوش مصنوعی، طیف گسترده‌ای از افراد، از کاربران...
    مدل nanoGPT
    در سال ۲۰۱۹، OpenAI مدل GPT-2 را معرفی کرد. OpenAI، برخلاف مدل‌های بعدی (GPT-3 و...
    شگفت‌انگیزترین ایده هوش مصنوعی از نظر Andrej Karpathy
    هوش مصنوعی به سرعت در حال پیشرفت هست. به‌گونه‌ای که باید زمان و انرژی زیادی...

    دیدگاهتان را بنویسید لغو پاسخ

    جستجو برای:
    فهرست مطالب دوره
    • آموزش pytorch رایگان
    • جلسه 1: آموزش نصب پایتورچ
    • جلسه 2: تنسور در پایتورچ
    • جلسه 3: تنسورهای خاص در پایتورچ
    • جلسه 4: ساخت تنسور تصافی در پایتورچ
    • جلسه 5: اندیس گذاری در پایتورچ
    • جلسه 6: عملیات روی تنسورها در پایتورچ
    دوره‌های جامع هوسم
    • مسابقه Kaggle: تحلیل و پیش‌بینی رفتار با داده‌های چندحسگری سری زمانی
    • پیاده‌سازی ChatGPT از صفر با پایتورچ
    • آموزش OpenCV: از پردازش تا بینایی
    • دیپ کاتالیست: دوره افزایش مهارت
    • پایتون برای هوش مصنوعی 🤖
    • یادگیری ماشین جامع: از مفاهیم تا پیاده‌سازی🔥
    • یادگیری عمیق جامع: از مفاهیم تا پیاده‌سازی
    درباره هوسم

    آکادمی هوش مصنوعی هوسم با آموزش‌های تخصصی در حوزه هوش مصنوعی در خدمت شماست. روی کمک هوسم حساب کنید…

    • گیلان- شهرستان رودسر- شهرک انصاری- کوچه لاله 9
    • 09025469248
    • howsam.mail@gmail.com
    دسترسی سریع
    • صفحه اصلی
    • وبلاگ
    • حساب کاربری
    • سبد خرید
    شبکه‌های اجتماعی

     

    logo-samandehi
    تمامی حقوق برای آکادمی هوسم محفوظ است.
      کد تخفیف شما هست و فقط
      فرصت داری ازش استفاده کنی!
      کد تخفیف شما هست و فقط
      فرصت داری ازش استفاده کنی!
      کد تخفیف شما هست و فقط
      فرصت داری ازش استفاده کنی!
      کد تخفیف شما هست و فقط
      فرصت داری ازش استفاده کنی!
      کد تخفیف شما هست و فقط
      فرصت داری ازش استفاده کنی!
      ورود
      استفاده از موبایل
      استفاده از آدرس ایمیل
      آیا هنوز عضو نیستید؟ اکنون عضو شوید
      بازنشانی رمز عبور
      استفاده از موبایل
      استفاده از آدرس ایمیل
      عضویت
      استفاده از موبایل
      استفاده از ایمیل
      قبلا عضو شدید؟ اکنون وارد شوید

      ورود

      رمز عبور را فراموش کرده اید؟

      هنوز عضو نشده اید؟ عضویت در سایت