Pytorch — массовая классификация

#pytorch

#pytorch

Вопрос:

Я обучил модель классифицировать изображение на 2 класса.

Я хочу использовать его для упорядочивания изображений на iPhone, у меня их много. Итак, я переместил обученную модель на свой MacBook и запустил несколько тестов.

Все работает должным образом, пока папка с изображениями содержит не более 223 изображений.

Кажется, это как-то связано с размером набора данных, я могу воспроизвести проблему с помощью следующего кода.

Я пытался разделить изображения на партии, но не мог понять, как это сделать. Каково общее решение этой проблемы? Можно ли использовать загрузчик данных?

 test_dataset = ImageFolderWithPaths('/Users/daniel/Gimp/test-ds/test/', test_trans)
 
# check images
for img, label, data in test_dataset:
     print(img.shape, label, data)
     data_path = '/Users/daniel/Gimp/test-ds/test/'
     data_path = '/Users/daniel/Pictures/Photos1/'
     data_file = data.split('/')[-1]
     data_file_new = 'class0_'   data.split('/')[-1]
     print(data_path   data_file_new)
 

Вывод

 torch.Size([3, 64, 64]) 0 /Users/daniel/Gimp/test-ds/test/3/020B1786-E77D-47E8-B0F1-DD72313546B7.jpeg
/Users/daniel/Pictures/Photos1/class0_020B1786-E77D-47E8-B0F1-DD72313546B7.jpeg

torch.Size([3, 64, 64]) 0 /Users/daniel/Gimp/test-ds/test/3/020BC6D0-2AC0-4BF3-A540-6630BA7200ED.jpeg
/Users/daniel/Pictures/Photos1/class0_020BC6D0-2AC0-4BF3-A540-6630BA7200ED.jpeg
torch.Size([3, 64, 64]) 0 /Users/daniel/Gimp/test-ds/test/3/021453CC-CAC1-4546-8188-20739F3C778F.jpeg
/Users/daniel/Pictures/Photos1/class0_021453CC-CAC1-4546-8188-20739F3C778F.jpeg
torch.Size([3, 64, 64]) 0 /Users/daniel/Gimp/test-ds/test/3/0235EEF0-2831-46D3-8889-8E57CDF42205.jpeg
/Users/daniel/Pictures/Photos1/class0_0235EEF0-2831-46D3-8889-8E57CDF42205.jpeg
torch.Size([3, 64, 64]) 0 /Users/daniel/Gimp/test-ds/test/3/02398B72-6F73-49D6-843B-25E2A2593DA9.jpeg
/Users/daniel/Pictures/Photos1/class0_02398B72-6F73-49D6-843B-25E2A2593DA9.jpeg
 

Метод прогнозирования

 class pred01():
  def __init__(self, imgpath, model):
    cc = 0
    cc1 = 0
    cc0 = 0
    cc2 = 0
    """Predict image class"""
    self.ds = ImageFolderWithPaths(imgpath, transform=test_trans)
    for img, label, data in self.ds:
        self.xb = to_device(img.unsqueeze(0), device)
        self.yb = model(self.xb)
        _, self.preds = torch.max(self.yb, dim=1)
        self.preds1 = torch.softmax(self.yb, dim=1).max()
        cc  = 1
        if dataset.classes[self.preds[0].item()] == '0' and self.preds1.item() > 0.80 or self.preds1.item() == 1.00:
            #print('normal pic')
            cc0  = 1
        #    pass
        elif dataset.classes[self.preds[0].item()] == '1' and self.preds1.item() > 0.80 or self.preds1.item() == 1.00:
            #print('class pic, new name: ' 'class1_'   data.split('/')[-1])
            #os.rename(data, '/Users/daniel/Pictures/Photos1/1/'   'duolingo_'   data.split('/')[-1])
            cc1  = 1
        else:
            pass
            #print('not sure')
            cc2  = 1
    print(cc)
    print(f'cc0: {cc0}')
    print(f'cc1: {cc1}')
    print(f'cc2: {cc2}')
 

Результаты после 3 запусков

 365
cc0: 152
cc1: 195
cc2: 18

365
cc0: 154
cc1: 186
cc2: 25

365
cc0: 136
cc1: 206
cc2: 23
 

Комментарии:

1. Какую именно ошибку вы получаете?

2. Я обнаружил ошибку, открытый временный файл внутри папки с изображением прервал процесс скрипта. После удаления файла он выполняется до конца с более чем 350 пикселями. Одна вещь, которую я замечаю, это то, что вероятность и прогноз отличаются при каждом запуске. Я добавил сценарий проверки с приведенными выше прогнозами. Что я могу сделать, чтобы сделать результат более последовательным?