تجزیه و تحلیل قیمت Polkadot 13 سپتامبر

شبکه عصبی کانولوشن – پیاده سازی PyTorch در مجموعه داده CIFAR-10

گره منبع: 1866263

این مقاله به عنوان بخشی از بلاگاتون علم داده

معرفی

Cifar 10 | pytorch شبکه های عصبی کانولوشنال
                                    تصویر 1

شبکه‌های عصبی کانولوشن، که ConvNets نیز نامیده می‌شوند، برای اولین بار در دهه 1980 توسط Yann LeCun، محقق علوم کامپیوتر که در پس‌زمینه کار می‌کرد، معرفی شدند. LeCun بر اساس کار Kunihiko Fukushima، دانشمند ژاپنی، یک شبکه اساسی برای تشخیص تصویر ساخته شده است.

نسخه قدیمی CNN، به نام LeNet (پس از LeCun)، می تواند ارقام دست نویس را ببیند. CNN به یافتن کدهای پین از پست کمک می کند. اما با وجود تخصص، ConvNets به بینایی کامپیوتر و هوش مصنوعی نزدیک شد زیرا با یک مشکل بزرگ روبرو شد: آنها نمی توانستند مقیاس زیادی داشته باشند. سی‌ان‌ان به داده‌های زیادی نیاز دارد و منابع را یکپارچه می‌کند تا برای تصاویر بزرگ به خوبی کار کند.

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

pytorch شبکه های عصبی کانولوشنال
تصویر 2

تصویر بالا یک مدل CNN را به ما نشان می دهد که یک تصویر رقم مانند 2 را می گیرد و به ما نتیجه می دهد که چه رقمی در تصویر به عنوان یک عدد نشان داده شده است. در این مقاله به تفصیل درباره نحوه دریافت این موضوع صحبت خواهیم کرد.

CIFAR-10 مجموعه داده ای است که مجموعه ای از تصاویر 10 کلاس مختلف را در خود جای داده است. این مجموعه داده به طور گسترده برای اهداف تحقیقاتی برای آزمایش مدل های مختلف یادگیری ماشین و به ویژه برای مشکلات بینایی رایانه استفاده می شود. در این مقاله سعی می کنیم با استفاده از Pytorch یک مدل شبکه عصبی بسازیم و آن را روی مجموعه داده CIFAR-10 آزمایش کنیم تا بررسی کنیم که چه دقتی از پیش بینی می تواند به دست آید.

وارد کردن کتابخانه PyTorch 

وارد کردن numpy به عنوان np پانداها را به عنوان PD وارد کنید
واردات مشعل واردات torch.nn.functional به عنوان F از مجموعه داده واردات مشعل، تبدیل از مشعل واردات nn واردات matplotlib.pyplot به عنوان plt import numpy به عنوان np import seaborn به عنوان sns #from tqdm. واردات نوت بوک tqdm از tqdm واردات tqdm

در این مرحله کتابخانه های مورد نیاز را وارد می کنیم. می بینیم که از NumPy برای عملیات عددی و پانداها برای عملیات قاب داده استفاده می کنیم. کتابخانه مشعل برای وارد کردن Pytorch استفاده می شود.

Pytorch دارای یک جزء nn است که برای انتزاع عملیات و توابع یادگیری ماشین استفاده می شود. این به عنوان F وارد می‌شود. از کتابخانه torchvision استفاده می‌شود تا بتوانیم مجموعه داده CIFAR-10 را وارد کنیم. این کتابخانه مجموعه داده های تصویری زیادی دارد و به طور گسترده برای تحقیق استفاده می شود. تبدیل ها را می توان وارد کرد تا بتوانیم اندازه تصویر را به اندازه یکسان برای همه تصاویر تغییر دهیم. از tqdm استفاده می شود تا بتوانیم پیشرفت را در طول آموزش پیگیری کنیم و برای تجسم استفاده می شود.

مجموعه داده مورد نیاز را بخوانید

trainData = pd.read_csv('cifar-10/trainLabels.csv') trainData.head()

هنگامی که مجموعه داده را می خوانیم، می توانیم برچسب های مختلفی مانند قورباغه، کامیون، گوزن، خودرو و غیره را ببینیم.

تجزیه و تحلیل داده ها با PyTorch

print("تعداد نقاط:",trainData.shape[0]) print("تعداد ویژگی:"trainData.shape[1]) print("ویژگی ها:"trainData.columns.values) print("تعداد مقادیر منحصر به فرد") برای col در trainData: print(col,":"len(trainData[col].unique())) plt.figure(figsize=(12,8))

خروجی:

تعداد امتیاز: 50000 تعداد ویژگی: 2 ویژگی: ['id' 'label'] تعداد مقادیر منحصر به فرد id : 50000 label : 10

در این مرحله، مجموعه داده را تجزیه و تحلیل می‌کنیم و می‌بینیم که داده‌های قطار ما حدود 50000 ردیف به همراه شناسه و برچسب مرتبط دارند. در مجموع 10 کلاس به نام CIFAR-10 وجود دارد.

دریافت مجموعه اعتبارسنجی با استفاده از PyTorch

از torch.utils. وارد کردن داده تصادفی_اسپلیت val_size = 5000 train_size = len(مجموعه داده) - val_size train_ds, val_ds = random_split(dataset, [train_size, val_size]) len(train_ds), len(val_ds)

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

(45000، 5000)
از torch.utils.data.dataloader import DataLoader batch_size=64 train_dl = DataLoader(train_ds, batch_size, shuffle=True, num_workers=4, pin_memory=True) val_dl = DataLoader(val_ds, batch_ruemorize=4,

torch.utils یک بارکننده داده دارد که می تواند به ما کمک کند تا داده های مورد نیاز را با دور زدن پارامترهای مختلف مانند تعداد کارگر یا اندازه دسته بارگیری کنیم.

تعریف توابع مورد نیاز

@torch.no_grad() def accuracy(خروجی ها، برچسب ها): _، preds = torch.max(خروجی ها، dim=1) بازگشت torch.tensor(torch.sum(preds == labels).item() / len(preds )) کلاس ImageClassificationBase(nn.Module): def training_step(self, batch): images, labels = batch out = self(images) # Generate predictions loss = F.cross_entropy (out, labels) # Calculate loss accu = accuracy (out ,برچسب‌ها) ضرر بازگشتی,accu def validation_step(self, batch): تصاویر، برچسب‌ها = جمع‌آوری = خود (تصاویر) # تولید پیش‌بینی ضرر = F. cross_entropy (خارج، برچسب‌ها) # محاسبه ضرر acc = دقت (خارج، برچسب‌ها) # محاسبه بازگشت دقت {'Loss': loss.detach()، 'Accuracy': acc} def validation_epoch_end(self, outputs): batch_losses = [x['Loss'] برای x در خروجی] epoch_loss = torch.stack(batch_losses .mean() # Combine losses batch_accs = [x['Accuracy'] برای x در خروجی] epoch_acc = torch.stack(batch_accs).mean() # Combine accuracies return {'Loss': epoch_loss.item()، ' Accuracy': epoch_acc.item()} def epoch_end(self, epoch, result): pr int("Epoch :",epoch + 1) print(f'Train Accuracy:{result["train_accuracy"]*100:.2f}% Validation Accuracy:{result["Accuracy"]*100:.2f}%' ) print(f'Train Loss:{result["train_loss"]:.4f} Validation Loss:{result["Loss"]:.4f}')

همانطور که در اینجا می بینیم ما از پیاده سازی کلاس ImageClassification استفاده کرده ایم و یک پارامتر که nn.Module است را می گیرد. در این کلاس می‌توانیم توابع مختلف یا مراحل مختلف مانند آموزش، اعتبارسنجی و غیره را پیاده‌سازی کنیم. توابع در اینجا پیاده‌سازی‌های ساده پایتون هستند.

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

پیاده سازی ماژول شبکه عصبی کانولوشنال

class Cifar10CnnModel(ImageClassificationBase): def __init__(self): super().__init__() self.network = nn.Sequential(nn.Conv2d(3, 32, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(32، 64، kernel_size=3، stride=1، padding=1)، nn.ReLU()، nn.MaxPool2d(2، 2)، خروجی #: 64 x 16 x 16 nn.BatchNorm2d(64) , nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1), nn .ReLU()، nn.MaxPool2d(2، 2)، # خروجی: 128 x 8 x nn.BatchNorm8d(2)، nn.Conv128d(2، 128، kernel_size=256، stride=3، padding=1)، nn.ReLU()، nn.Conv1d(2، 256، kernel_size=256، stride=3، padding=1)، nn.ReLU()، nn.MaxPool1d(2، 2)، # خروجی: 2 x 256 x 4 nn.BatchNorm4d(2)، nn.Flatten()، nn.Linear(256*256*4، 4)، nn.ReLU()، nn.Linear(1024، 1024)، nn.ReLU()، nn.Linear (512, 512)) def forward(self, xb): return self.network(xb)

این مهمترین بخش پیاده سازی شبکه عصبی است. در کل، ما از ماژول nn که از مشعل وارد کرده ایم استفاده می کنیم. همانطور که در خط اول می بینیم، Conv2d ماژولی است که به پیاده سازی یک شبکه عصبی کانولوشنال کمک می کند. اولین پارامتر 3 در اینجا نشان می دهد که تصویر رنگی و با فرمت RGB است. اگر یک تصویر در مقیاس خاکستری بود، ما باید 1 را انتخاب می کردیم.

32 اندازه کانال خروجی اولیه است و وقتی به لایه conv2d بعدی می رویم، این 32 را به عنوان کانال ورودی و 64 را به عنوان کانال خروجی خواهیم داشت.

پارامتر سوم در خط اول اندازه هسته نام دارد و به ما کمک می کند تا از فیلترهای استفاده شده مراقبت کنیم. عملیات padding آخرین پارامتر است.

عملیات پیچیدگی به یک لایه فعال سازی و Relu در اینجا متصل است. پس از دو لایه Conv2d، ما یک عملیات جمع‌آوری حداکثری با اندازه 2 * 2 داریم. مقداری که از این به دست می‌آید برای پایداری و جلوگیری از تغییر متغیر داخلی، نرمال می‌شود. این عملیات با لایه های بیشتری برای عمیق تر شدن شبکه و کاهش اندازه تکرار می شود. در نهایت لایه را صاف می کنیم تا بتوانیم یک لایه خطی بسازیم تا مقادیر را به 10 مقدار ترسیم کنیم. احتمال هر نورون از این 10 نورون بر اساس حداکثر احتمال مشخص می کند که یک تصویر خاص به کدام طبقه تعلق دارد.

مدل را آموزش دهید

@torch.no_grad() def value(model, data_loader): model.eval() outputs = [model.validation_step(batch) for batch in data_loader] return model.validation_epoch_end(outputs) def fit(model, train_loader, val_loader,epochs =10,learning_rate=0.001): best_valid = None history = [] optimizer = torch.optim.Adam(model.parameters(), Learning_rate,weight_decay=0.0005) برای دوره در محدوده (دوران): # فاز آموزشی model.train( ) train_losses = [] train_accuracy = [] برای دسته در tqdm(train_loader): loss,accu = model.training_step(batch) train_losses.append(loss) train_accuracy.append(accu) loss.backward() optimizer.step() بهینه ساز .zero_grad() # نتیجه مرحله اعتبارسنجی = ارزیابی (مدل، val_loader) نتیجه['train_loss'] = torch.stack(train_losses).mean().item() result['train_accuracy'] = torch.stack(train_accuracy). mean().item() model.epoch_end(epoch, result) if(best_valid == هیچ یا best_valid
تاریخ = مناسب (مدل، train_dl، val_dl)

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

از طرف دیگر، تابع ارزیابی از تابع eval استفاده می کند و برای هر مرحله، Batch بارگذاری شده را از دیتا لودر می گیریم و خروجی محاسبه می شود. سپس مقدار به پایان دوره اعتبار سنجی که قبلاً تعریف کردیم ارسال می شود و مقدار مربوطه برگردانده می شود.

ترسیم نتایج

در این مرحله، دقت را در مقابل هر دوره تجسم خواهیم کرد. می‌توان مشاهده کرد که با افزایش دوره، دقت سیستم افزایش می‌یابد و به همین ترتیب تلفات کاهش می‌یابد. خط قرمز در اینجا نشان دهنده پیشرفت داده های آموزشی و آبی برای اعتبار سنجی است. می‌توانیم ببینیم که در نتایج ما بیش از حد برازش وجود داشته است زیرا داده‌های آموزشی کاملاً بهتر از نتیجه اعتبارسنجی هستند و به طور مشابه در صورت از دست دادن. پس از 10 دوره، به نظر می رسد داده های قطار از دقت 90 درصد عبور می کنند اما حدود 0.5 از دست می دهند. داده های تست حدود 81٪ و ضررها نزدیک به 0.2 هستند.

def plot_accuracies(history): Validation_accuracies = [x['Accuracy'] برای x در تاریخ] Training_Accuracies = [x['train_accuracies'] برای x در تاریخ] plt.plot(Training_accuracies, '-rx') plt.plot(Validation_ac , '-bx') plt.xlabel('epoch') plt.ylabel('accuracy') plt.legend(['Training', 'Validation']) plt.title ('دقت در مقابل تعداد دوره ها') ; plot_accuracies (تاریخچه)
نمودارهای دقت
def plot_losses(history): train_losses = [x.get('train_loss') برای x در تاریخ] val_losses = [x['Loss'] برای x در تاریخ] plt.plot(train_losses, '-bx') plt.plot (val_losses, '-rx') plt.xlabel('epoch') plt.ylabel('loss') plt.legend(['Training', 'Validation']) plt.title('Loss vs. ') plot_losses (تاریخچه)

test_dataset = ImageFolder(data_dir+'/test', transform=ToTensor()) test_loader = DeviceDataLoader(DataLoader(test_dataset, batch_size), device) result = ارزیابی(نهایی_مدل، test_loader) print(f'Test Accuracy:{result["Accuracy" ]*100:.2f}%')
دقت تست: 81.07%

ما می توانیم ببینیم که در نهایت با دقت 81.07 درصد می رسیم.

نتیجه:

تصویر:https://unsplash.com/photos/5L0R8ZqPZHk

درمورد من: من یک دانشجوی پژوهشی هستم و علاقه مند به رشته یادگیری عمیق و پردازش زبان طبیعی هستم و در حال حاضر در حال تحصیل در رشته هوش مصنوعی هستم.

منبع تصویر

  1. Image 1: https://becominghuman.ai/cifar-10-image-classification-fd2ace47c5e8
  2. تصویر 2: https://www.analyticsvidhya.com/blog/2021/05/convolutional-neural-networks-cnn/

با خیال راحت با من در ارتباط باشید:

  1.  لینکدین: https://www.linkedin.com/in/siddharth-m-426a9614a/
  2.  Github: https://github.com/Siddharth1698

رسانه های نشان داده شده در این مقاله متعلق به Analytics Vidhya نیستند و به صلاحدید نویسنده استفاده می شوند.

منبع: https://www.analyticsvidhya.com/blog/2021/09/convolutional-neural-network-pytorch-implementation-on-cifar10-dataset/

تمبر زمان:

بیشتر از تجزیه و تحلیل Vidhya