Das CNN-Modell bleibt bei Laborbildern konstant bei einer Genauigkeit von 0 %
Posted: 03 Jan 2025, 15:43
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:
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:
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:
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()
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 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.]])