torch.tensor falscher Datentyp

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hakoda
User
Beiträge: 5
Registriert: Freitag 30. Dezember 2022, 13:40

Hallo,
ich bin noch relativ neu im programmieren und bräuchte Hilfe.

Ich erzeuge mit diesem Code mein train_labels:
train_inputs, validation_inputs, train_labels, validation_labels = train_test_split(input_ids, labels,
random_state=2018, test_size=0.1)


Wenn ich nun train_labels = torch.tensor(train_labels) machen will kommt folgende Fehlermeldung:
can't convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint8, and bool.

Ich verstehe, dass train_labels vom falschen Typ ist, allerdings nicht wie ich es ändere, damit es passt. Durch train_labels.dtype wird auch dtype('O') ausgegeben.

Würde mich über jede Hilfe freuen. Vielen Dank
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Nun, wie sehen denn deine Labels aus?

Du musst die halt in einen der "supported types: float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint8, and bool." umwandeln.

Eventuell hilft das hier, ohne Gewähr, habe nicht viel mit Pytorch gemacht.
https://sparrow.dev/pytorch-one-hot-encoding/
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Hakoda
User
Beiträge: 5
Registriert: Freitag 30. Dezember 2022, 13:40

Ich habe eine .csv Trainingsdatei mit mehreren tausenden Einträgen, welche ich gestellt bekommen habe. Am Ende eines Satzes steht immer ein Komma und eine Zahl zwischen 0 und 2 (also die Label). Mithilfe von df = pd.read_csv("train.csv", delimiter= ' , ' , header=None, names=['sentence_source', 'sentence', 'label']) teile ich den Satz auf. Anhand der Output Tabelle, welche man durch die Eingabe df bekommt, sehe ich, dass die Label auch richtig erkannt/eingeordnet werden. Nur werden diese Label anscheinden nicht als Zahlen erkannt, wodurch ist meine Label vom falschen Typ sind. Nun weiß ich aber nicht, wie ich diese in einen zulässigen umwandel, wie z.B. int64.
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hakoda: Ich würde ja mal schauen was in dieser Spalte *wirklich* drin steht, denn nur Zahlen zwischen 0 und 2 sind es ja anscheinend nicht, denn sonst wäre die Spalte nicht vom Typ `object`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Hakoda
User
Beiträge: 5
Registriert: Freitag 30. Dezember 2022, 13:40

Ich bin nun in der Lage mithilfe von: df['label']=df['label'].apply(lambda x: 1 if x=='1' else 0) df['label'] in int64 umzuwandeln. Hier habe ich nun ein weiteres Problem. Die 1er werden in eine 1 und die 0 in eine 0 umgewandelt (so wie es auch sein soll), allerdings habe ich ja eine weitere Zahl, die 2. Hier werden nun die 2er auch in eine 0 umgewandelt. Hat jemand eine Idee, wie ich den Teil in der .apply Klammer umschreiben kann, sodass die 2 auch berücksichtigt wird. Habe zuerst an ein else if gedacht, macht aber aufgrund des lambda x:1 keinen Sinn, da die 2er sonst in eine 1 umgewandelt wird... Jemand eine Idee? Danke
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso nicht einfach apply(int)?
Hakoda
User
Beiträge: 5
Registriert: Freitag 30. Dezember 2022, 13:40

Bekomme bei apply(int) die Fehlermeldung: invalid literal for int() with base 10: 'label'
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann hast du noch Quatsch in deinen Daten. Wieso steht da label drin, wenn es nur 0, 1 oder 2 laut deiner Beschreibung sein sollen?
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Eventuell die Kopfdaten in den Daten statt als Kopfdaten‽
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Hakoda
User
Beiträge: 5
Registriert: Freitag 30. Dezember 2022, 13:40

Es war tatsächlich die Kopfzeile, habe die extra mehrmals überprüft gehabt, es stand auch extra eine 0 in der Spalte. Nachdem ich nun trotzdem mit df.drop die erste Zeile gelöscht habe, kann ich .apply(int) benutzen. Oh man wegen so einem banalen Fehler, so viele Stunden verschwendet. Naja aus Fehlern lernt man. Vielen Dank, falls irgendwann nochmals eine Frage aufkommt, weiß ich, dass ich hier gut aufgehoben bin 👍
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hakoda: NEIN! Man liest nicht die Datei inklusivde Kopfzeile, um dann nachträglich die Kopfzeile wegzuwerfen, sondern liest die Datei gleich richtig ein, also nicht mit header=None und den names explizit angegeben.
Antworten