[PYTHON] Rückkehr per CNN (gebautes Modell der Fackelsicht)

Einführung

Es kann für verschiedene Zwecke verwendet werden, z. B. für die Regression nach Bildern, z. B. zur Vorhersage der Bewertung des Essprotokolls anhand des Ramenbilds, zur Bewertung des menschlichen Gesichts usw., aber es gibt nur wenige Materialien auf Japanisch und Englisch, daher bin ich mehrmals gestolpert, also ein Memorandum Ich möchte zusammenfassen als.

Aus dem Torchvision-Tutorial geht hervor, dass das Modell nur mit dem vorhandenen Klassifizierungsmodell spielt.

Referenzseite

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

Änderungen gegenüber der Klassifizierung

Grundsätzlich kann die Bildregression den Klassifizierungsmechanismus fast so verwenden, wie er ist. Die folgenden drei Änderungen sind erforderlich.

Loss

Im Lernprogramm ist Verlust Kreuzentropie. Ändern Sie ihn daher in Verlust, der für Regressionen wie MSE und Smooth L1 verwendet wird.

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

Ausgabeschicht

Ich möchte basierend auf dem Tutorial damit spielen, also setze die Anzahl der Klassen auf 1 "nur".

# Number of classes in the dataset
num_classes = 1

Wenn jedoch nur die obige Änderung vorgenommen wird, nimmt die Anzahl der Knoten in der Ausgabeschicht ziemlich schnell ab, z. B. 1024-> 1. Ändern Sie das Modell daher wie folgt. (Beispiel in ResNet)

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

Gewährleistung korrekter Antwortdaten

Dank des Datensatzes von pytorch, der ein zu praktisches Modul ist, wird die Klasse ohne Erlaubnis beschriftet, wenn Sie die Trainingsdaten in Ordner aufteilen. Da ich diesmal jedoch eine Regression durchführen möchte, müssen Zahlen wie float und int vorhanden sein, damit ich meinen eigenen Datensatz erstellen kann.

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'])

'''
Vorbehandlung Ihrer Wahl
'''

        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

Persönlich süchtige Fallstricke

Beim Erstellen von Trainingsdaten mit dem obigen Datensatz ist ein Fehler beim Rückwärtsverlust aufgetreten. Der Code funktioniert, aber der Verlust geht nicht zurück, daher hat es viel Zeit gekostet.

RuntimeError: Found dtype Double but expected Float

Die Lösung besteht darin, das Label dtype auf torch.float32 zu setzen.

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

Am Ende

Dieses Mal kann das Fackelmodell so wie es ist für die Regression verwendet werden. ResNet scheint gut zur Regression zu passen, da ich es leicht bewegt habe. Ich konnte keine Informationen für die kleinen Änderungen finden und habe sie zusammengefasst.

Recommended Posts

Rückkehr per CNN (gebautes Modell der Fackelsicht)
Darstellung der Regressionslinie durch Restdarstellung
Erklärung des Produktionsoptimierungsmodells durch Python
Verbesserung der Leistungsmetrik durch 2-Stufen-Lernmodell