Page 1 of 1

Das CNN-Modell bleibt bei Laborbildern konstant bei einer Genauigkeit von 0 %

Posted: 03 Jan 2025, 15:43
by Guest
Ich habe ein Problem mit meinem CNN. Ich muss einen CNN erstellen, der den a- und b-Wert des zentralen Pixels eines 13x13-Pixel-Bildes vorhersagt. Ich habe nur Conv-Layer und als Aktivierungsfunktionen Sigmoid verwendet, aber ich möchte diese beiden nicht ändern, da diese zu meiner Abschlussarbeit gehören. Als Hauptbibliothek habe ich PyTorch verwendet. Alle Bilder sind im LAB-Farbraum.
mein Modell sieht so aus:

Code: Select all

filter = 3
(stride is in PyTorch as a standard: (1,1))
conv_2d(3, 8, filter=filter)
sigmoid()
conv_2d(8, 16)
sigmoid()
conv_2d(16, 32)
sigmoid()
conv_2d(32, 64)
sigmoid()
conv_2d(64, 128)
sigmoid()
conv_2d(128, 256)
sigmoid()
flatten(..., 1)
Linear(256, 64)
sigmoid()
Linear(64, 32)
sigmoid()
Linear(32, 8)
sigmoid()
Linear(8, 2)
sigmoid()
Training:
Ich habe mit Pytorch einen benutzerdefinierten Datensatz erstellt, in dem ich ein Verzeichnis habe, in dem sich die 13x13-Pixel-Bilder befinden, und eine train.csv-Datei, in der sich die Dateinamen und der a- und b-Wert des zentralen Pixels des zugehörigen Bildes sind. Ich trainiere mit einer Stapelgröße von 64 und 10.000 Bildern. Die Daten im Datensatz werden um den Faktor 128 neu skaliert und anschließend werden die Ausgaben aus dem Netzwerk auf das Original zurückskaliert.
Benutzerdefinierter Datensatz:

Code: Select all

def target_transform(label):
label_tensor = torch.tensor(label, dtype=torch.float)

normalized_label = label_tensor / 128.0  # scaling by factor of 128
return normalized_label

class ABSectionDataset(Dataset):
def __init__(self, csv_file, image_dir, section_size=13, transform=None, target_transform=None):
self.data = pd.read_csv(csv_file)
self.image_dir = image_dir
self.transform = transform
self.target_transform = target_transform

def __len__(self):
return len(self.data)

def __getitem__(self, idx):
img_path = os.path.join(self.image_dir, self.data.iloc[idx, 0])

image = Image.open(img_path)

label = self.data.iloc[idx, 1:3].values
label = label.astype(np.float32)

if self.transform:
image = self.transform(image)
if self.target_transform:
label = self.target_transform(label)

return image, label
Ich habe verschiedene Faltungen mit unterschiedlichen Ein- und Ausgangskanälen innerhalb des Netzwerks ausprobiert. Auch unterschiedliche Trainingsgröße und Batch-Größen.
Ich habe auch die Ausgaben des Modells überprüft und sie sind alle gleich, unabhängig davon, welche Eingabe ich dem Netzwerk gebe. Die Eingabedaten sind jedoch nicht dieselben. Der Fehler kann also nicht an den Eingabedaten liegen.
Dies sind die ersten 6 Eingabe-Ausgabe-Paare:

Code: Select all

outputs: tensor([[84.5234, 63.5912]], grad_fn=)
labels:  tensor([[162., 190.]])

outputs: tensor([[84.5234, 63.5912]], grad_fn=)
labels:  tensor([[100., 165.]])

outputs: tensor([[84.5234, 63.5912]], grad_fn=)
labels:  tensor([[149., 154.]])

outputs: tensor([[84.5234, 63.5912]], grad_fn=)
labels:  tensor([[155.,  62.]])

outputs: tensor([[84.5234, 63.5912]], grad_fn=)
labels:  tensor([[166., 195.]])

outputs: tensor([[84.5234, 63.5912]], grad_fn=)
labels:  tensor([[159., 187.]])