[PYTHON] Retour par CNN (modèle construit de vision de la torche)

introduction

Il peut être utilisé à des fins diverses telles que la régression par image, par exemple, prédire l'évaluation du journal alimentaire à partir de l'image d'un ramen, marquer un visage humain, etc., mais il y a peu de documents en japonais et en anglais, alors j'ai trébuché plusieurs fois, donc un mémorandum Je voudrais résumer comme.

À partir du didacticiel de la vision de la torche, le modèle fonctionnera simplement en jouant avec le modèle de classification existant.

Site de référence

tutoriel torchvison https://medium.com/@benjamin.phillips22/simple-regression-with-neural-networks-in-pytorch-313f06910379

Changements de classification

Fondamentalement, la régression d'image peut utiliser le mécanisme de classification presque tel quel. Les trois changements suivants sont requis.

Loss

Dans le didacticiel, Loss est Cross Entropy, changez-le donc en Loss utilisé pour la régression comme MSE et Smooth L1.

# Setup the loss fxn
criterion = nn.MSELoss()

Couche de sortie

Je veux jouer avec lui en me basant sur le tutoriel, alors réglez le nombre de classes à 1 "seulement".

# Number of classes in the dataset
num_classes = 1

Cependant, si seule la modification ci-dessus est effectuée, le nombre de nœuds dans la couche de sortie diminuera assez rapidement, par exemple 1024-> 1, changez donc le modèle comme suit. (Exemple dans ResNet)

model_ft.fc = nn.Sequential(nn.Linear(num_ftrs, 256),
              nn.LeakyReLU(),
              nn.Linear(256, 32),
              nn.LeakyReLU(),
              nn.Linear(32, 1))

Accorder des données de réponse correctes

Grâce au Dataset de pytorch, qui est un module trop pratique, si vous divisez les données d'entraînement en dossiers, il étiquettera la classe sans autorisation. Cependant, puisque ce que je veux faire cette fois-ci est une régression, il est nécessaire d'avoir des nombres tels que float et int, donc je vais créer mon propre jeu de données.

class Create_Datasets(Dataset):
    def __init__(self, path, data_transform):
        self.path = path
        self.df = self.create_csv(path)
        self.data_transform = data_transform

    def create_csv(self, path):
        image_path = []
        for file_name in glob(path + '/*.jpeg'):
            basename = os.path.basename(file_name)
            image_path.append(basename)

        df = pd.DataFrame(image_path, columns=['path'])

'''
Prétraitement de votre choix
'''

        return df

    def __len__(self):
        return len(self.df)
     
    def __getitem__(self, i):
        file = self.df['path'][i]
        score = np.array(self.df['good'][i])
        image = Image.open(os.path.join(self.path, file))
        image = self.data_transform(image)
 
        return image, score

Les pièges de la dépendance personnelle

Lors de la création de données d'entraînement avec l'ensemble de données ci-dessus, une erreur s'est produite lors de la perte arrière. Le code fonctionne, mais la perte ne diminue pas, donc cela a pris beaucoup de temps.

RuntimeError: Found dtype Double but expected Float

La solution consiste à définir l'étiquette dtype sur torch.float32.

labels = labels.float().to(device)

À la fin

Cette fois, le modèle de vision de la torche peut être utilisé pour la régression tel quel. ResNet semble être un bon match pour la régression, car je l'ai déplacé légèrement. Je n'ai trouvé aucune information sur les petits changements, alors je l'ai résumé.

Recommended Posts

Retour par CNN (modèle construit de vision de la torche)
Tracé de la droite de régression par tracé des résidus
Explication du modèle d'optimisation de la production par Python
Amélioration de la metrix de performance par modèle d'apprentissage en 2 étapes