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
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()
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))
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
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)
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.