تشخیص سگ از گربه با بایتورچ به سادگی

امروز قراره یاد بگیریم چطوری میشه که عکس های سگ و گربه رو بدیم به سیستم و اون تشخیصش بده مثل بچه ادمیزاد:)اگه هیچ اطلاعاتی از هوش مصنوعی ندارین بازم به دردتون میخوره مبینید چطوری میشه که کامپیوتر ما یادمیگره گربه یا سگ رو از روی عکس تشخیص بدهبرای اینکه بتونیم به یه بچه هم فرق این دوتا حیوون یاد بدیم اول باید عالمه سگ و گربه رو بشون نشون بدیم تا یاد بگیرن واسه هوش مصنوعی ما هم اینطوری هستش باید یه عالمه عکس سگ و گربه جمع کنیم نشونش بدیم تا بتونه تازه فرقشون بفهمه خدارو شکر نیازی نیست ما بیفتیم دنبال عکس میتونیم از مجموعه های اماده استفاده کنیم(دیتاست) یکی از این معروف ها در سایت کگل وجود داره که راحت میتونین دانلودش کنید داخلشم فقط عکس که دسته بندی شدهادرس دیتاست:Dogs vs. Cats | Kaggleبرین قسمت code ودانلودش کنیددو تا فایل داریم train و test که داخل هرکدم عکسا سگ و گربه وجود داره چیز خاصی نیستازتون میخوام مثل این عکس فولدر ها رو درست کنید اینطوری کارتون خیلی راحتر میشه از خیلی از مشکلان جلوگیری میشه سعی کنید همیشه اول دیتاستتون تمیز کنید (اینارو بتون نمیگن شما حواستون باشه؛)حالا شما باید یه جا کدتون بزنین میتونه سیستم خودتون باشه یا بریم از کولب(سیستم گوگل) یا کگل استفاه کنیم هر طور راحتینimport numpy as np # linear algebraimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)%matplotlib inline%config InlineBackend.figure_format = 'retina'import matplotlib.pyplot as pltimport torchfrom torch import nnfrom torch import optimimport torch.nn.functional as Ffrom torchvision import datasets, transforms, modelsimport osprint(os.listdir(&quot../input&quot))# import module we'll need to import our custom modulefrom shutil import copyfilecopyfile(src = &quot../input/view-class/view_helper.py&quot, dst = &quot../working/view_helper.py&quot)import view_helper as helperاینجا ما یه سری کتابخونه رو اضافه کردیم فعلا خودتون درگیرشون نکنین (هدف ما نقشه راه)از اول نوضیح نمیدم دیگه (تمام کد ها به زبان بایتون) بیشنهاد من اینه از کولب استفاده کنین(نمیدونی چیه باشو سرچ کن دیگه تنبل)data_dir = '../input/dogs-vs-cats-for-pytorch/cat_dog_data/Cat_Dog_data'# TODO: Define transforms for the training data and testing datatrain_transforms = transforms.Compose([transforms.RandomRotation(30), transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])test_transforms = transforms.Compose([transforms.Resize(255), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])خوب کار این کدها اینه که عکسای ما رو یه سری تغیررات بده بشون مثلا اندازه عکسو تغییر بده وتبدیل به تنسور کنه که تقریبا همون ماتریس خودمونه (هدفم این نیست بیام به شما کامل توضیح بدم تمام این کد هارو فقظ دارم این که چجوری انجام میشه رو نشون میدم)train_data = datasets.ImageFolder(data_dir + '/train', transform=train_transforms)test_data = datasets.ImageFolder(data_dir + '/test', transform=test_transforms)یادتونه گفتم فولدار های دیتاست رو دسته بندی کنیم اینجا به درد میخوره که میام از ایمج فولدر استفاده میکنیم و ترنسفرم ها رو بشون میدم(همون کدهایی که باعث میشد یه سری تغیرات عکسو بدیم) و ادرس فولدرامونو که train وtest بود ؛اینو بگم ایمیج فولدر خودش میاد خیلی از کارا رو انجام میده عکسارو انتخاب میکنه trainloader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)testloader = torch.utils.data.DataLoader(test_data, batch_size=64)حالا میام دیتالودرامونو تعریف میکنیم کارشون اینه که عکسارو برای ما بر میداره و زمانی که بخوایمم به مدل هوش مصنوعی بدیم کارمونو راحتتر میکنهdata_iter = iter(trainloader)images, labels = next(data_iter)fig, axes = plt.subplots(figsize=(10,10), ncols=4)for ii in range(4): ax = axes[ii] helper.imshow(images[ii], ax=ax, normalize=False)این تیکه کد عکسایی که لود شده و ما میخوایمم بدیم مدلمون رو نشون میده (ماژول هلبر رو اخر میزارم کدشو)اینم کده مدل هوش مصنوعی ما که امدیم از مدل densenet12 ااستفاده کردیم و لایه اخر مدل (کلسیفایر ) رو دست کاری کردیم برای اینکه تشخصی بده و لاس و ابتیمایزمونو انتخاب کردیم ایی خدا خستع شدم بقییه باشه تو قسمت بعدی که یاد میدم چجوری مدلمونو تمرین بدیم جاهای جالبش هنوز مونده:)))))) # Use GPU if it's availabledevice = torch.device(&quotcuda&quot if torch.cuda.is_available() else &quotcpu&quot)model = models.densenet121(pretrained=True) # Freeze parameters so we don't backprop through themfor param in model.parameters():param.requires_grad = Falsemodel.classifier = nn.Sequential(nn.Linear(1024, 256),nn.ReLU(),nn.Dropout(0.2),nn.Linear(256, 2),nn.LogSoftmax(dim=1)) criterion = nn.NLLLoss() # Only train the classifier parameters, feature parameters are frozenoptimizer = optim.Adam(model.classifier.parameters(), lr=0.003) model.to(device);