TensorFlow -Modelltraining, Liste der Numpy Array Conversion ändert sich ungleichmäßig die Form der Daten
Posted: 21 Feb 2025, 23:02
Ich versuche, LSDC aus MRT -Bildern vorherzusagen. Für jede Studie_ID gibt es mehrere Bilder. Jede Studie_ID repräsentiert jeden Patienten. Ich möchte ein 3 -Schweregrad für 5 Bedingungen auf 5 Ebenen vorhersagen. Hier ist meine DataGenerator -Klasse: < /p>
Ich habe verschiedene Möglichkeiten ausprobiert, um Labels_Dict in Numpy Array umzuwandeln. Aber entweder zum Zeitpunkt des Trainings zeigt es eine Form des Missmatch -Fehlers. Oder wenn Sie versuchen, die Daten zu sehen, zeigte es einen Fehler.
Ich habe versucht, np.stack oder batch_labels = batch_labels.reshape ((batch_labels.shape [0], len (Bedingungen), 3)) , aber aber Es zeigt einen anderen Fehler. Meine Daten haben keine Nan und alle LaDels_Dict sind von Form (batch_size, num_of_condition, secority_class) . Auch als ich versuchte, die Daten vom Generator zu drucken. Generatordatenform aus data_x, data_y = next (iter (train_generator)) Die gewünschte Form von Daten für Modelleingabe und Ausgabe anzeigen. Ich kann das Problem nicht herausfinden.
Code: Select all
class CustomDataGenerator(Sequence):
def __init__(self, image_dict, num_img, labels_dict=None, batch_size=8, image_size=(224, 224), shuffle=True):
self.image_dict = image_dict
self.labels_dict = labels_dict
self.batch_size = batch_size
self.image_size = image_size
self.shuffle = shuffle
self.ids = list(image_dict.keys())
self.num_img = num_img
self.on_epoch_end()
def __len__(self):
return int(np.floor(len(self.ids) / self.batch_size))
def __getitem__(self, index):
start = index * self.batch_size
end = min((index + 1) * self.batch_size, len(self.ids))
batch_ids = self.ids[start:end]
batch_images = []
batch_labels = []
for id_ in batch_ids:
images = []
for image_path in self.image_dict.get(id_, []):
dicomdata = pydicom.dcmread(image_path)
image = dicomdata.pixel_array
image = cv2.resize(image, self.image_size)
image = np.expand_dims(image, axis=-1)
image = image.astype('float32') / np.max(image)
image = np.repeat(image, 3, axis=-1)
images.append(image)
images = np.array(images)
if len(images) < self.num_img:
pad_amount = self.num_img - len(images)
padding = [(0, pad_amount)] + [(0, 0)] * (len(images.shape) - 1)
images = np.pad(images, padding, mode='constant')
batch_images.append(images)
if self.labels_dict:
label = np.array(self.labels_dict.get(id_), dtype=np.float32)
batch_labels.append(label)
batch_images = np.stack(batch_images)
if self.labels_dict:
batch_labels = np.array(batch_labels, dtype=np.float32)
return batch_images, batch_labels
return batch_images
def on_epoch_end(self):
if self.shuffle:
np.random.shuffle(self.ids)
< /code>
Mein Labels -Wörterbuch lautet wie folgt: < /p>
for i, sid in enumerate(train_df['study_id']):
labels_dict[str(sid)] = []
for con in conditions:
if train_df.loc[i, con] == 'normal_mild':
labels_dict[str(sid)].append([1, 0, 0])
elif train_df.loc[i, con] == 'severe':
labels_dict[str(sid)].append([0, 0, 1])
else:
labels_dict[str(sid)].append([0, 1, 0])
labels_dict[str(sid)] = np.array(labels_dict[str(sid)], dtype=np.float32)
Code: Select all
----> 1 model.fit(train_generator, epochs=2) #, steps_per_epoch=len(train_generator)//8)
/usr/local/lib/python3.10/dist-packages/keras/src/utils/traceback_utils.py in error_handler(*args, **kwargs)
120 # To get the full stack trace, call:
121 # `keras.config.disable_traceback_filtering()`
--> 122 raise e.with_traceback(filtered_tb) from None
123 finally:
124 del filtered_tb
in __getitem__(self, index)
47 batch_images = np.stack(batch_images)
48 if self.labels_dict:
---> 49 batch_labels = np.array(batch_labels, dtype=np.float32)
50 return batch_images, batch_labels
51
ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (8,) + inhomogeneous part.