Ich möchte RNN studieren, weiß aber nicht, was ich machen soll, deshalb habe ich mich mit meinen Senioren beraten.
Wai "Senior, ich möchte RNN mit TensorFlow studieren. Gibt es ein gutes Fach?" Senior "Laut. Ich bin beschäftigt, also werde ich dich später verlassen." Wai "..."
Lassen Sie uns das Musikgenre anhand des Songtitels vorhersagen. .. .. (´ ・ ω ・ `)
In der Songtitelliste von iTunes gibt es einen Eintrag namens Genre. Vielleicht gibt es einen Rock-ähnlichen Songtitel oder ein Pop-ähnliches Songtitelmuster.
Extrahieren Sie Daten aus iTunes und speichern Sie sie in einer CSV-Datei
train_data.csv
Ho!,2
Deuces Are Wild,2
575,4
Filme,4
KICKS!,2
Raise it all,4
Nichts(movie ver.),4
Moratorium Mädchen,4
You've Got To Hide Your Love Away,0
Ordinary,5
Was,4
Schwertjagd plötzlich,4
Borderline,4
Timber,4
M.I.Y.A.,2
Sommertag 1993,4
broken bone,4
Ein Datensatz wie dieser. Lehrerdaten 2259, Testdaten 565. Die Zahlen in der rechten Spalte entsprechen dem Genre.
categories.csv
Classical,0
R&B,1
Alternative,2
Pop,3
Rock,4
Rap,5
Punk,6
Dance & House,7
So was.
Es scheint nicht in Ordnung zu sein, die Morphologie des Songtitels zu analysieren, also haben wir dieses Mal Character RNN übernommen Geben Sie Zeitreihendaten für jedes Zeichen in RNN ein, um Songtitelmuster zu lernen
input_data.py
def data2id(self, data):
self.__create_dict()
data = [train.lower().replace(' ', '') for train in data]
return [[[self.char_dict[train[i]]] if len(train) > i else [0] for i in range(self.max_length)] for train in data]
def __create_dict(self, data_dir ='../data/'):
data = self.__create_batchs(data_dir)
data += self.__create_batchs(data_dir, test=True)
sings = [d[0] for d in data]
word = ''.join(sings).lower().replace(' ','')
word_uniq = list(set(word))
self.char_dict = {k:i for i,k in enumerate(word_uniq)}
In diesem Teil wird der Songtitel in eine Form konvertiert, die dem Netzwerk zugeführt werden kann, indem jedem Charakter eine ID zugewiesen wird.
main.py
def cell():
return tf.contrib.rnn.BasicRNNCell(num_units=NODE_NUM, activation=tf.nn.tanh) #Zelle der mittleren Schicht
cells = tf.contrib.rnn.MultiRNNCell([cell() for _ in range(NUM_LAYER)])
outputs, states = tf.nn.dynamic_rnn(cell=cells, inputs=x, dtype=tf.float32, time_major=False)
Verwenden Sie dynamic_rnn, da der Songtitel eine variable Länge hat. Die mittlere Schicht hat 128 Einheiten und zwei Schichten sind gestapelt (super geeignet), und die Zelle ist BasicRNN.
Korrekt. .. Jep. .. Ich kann es nicht einmal sehen. Die Songs in meinen iTunes sind zuerst auf Rock ausgerichtet. Darüber hinaus ist es für Menschen ziemlich schwierig, das Genre aus dem Songtitel zu erraten. Sie können also das Ergebnis erwarten, oder?
[TRAIN] loss : 1.349962, accuracy : 0.656250
[TEST loss : 1.369359, accuracy : 0.571681
{'Classical': 0.0, 'R&B': 0.0, 'Alternative': 0.0, 'Pop': 0.0, 'Rock': 1.0, 'Rap': 0.0, 'Punk': 0.0, 'Dance & House': 0.0}
Ich habe versucht, bis zu einem gewissen Grad zu lernen. Die Zeilen 1 und 2 sind Zug, Testverlust und korrekte Antwortrate. Die dritte Zeile ist das Verhältnis des tatsächlichen Netzwerkvorhersageergebnisses zu den Testdaten. Ja, ich bestehe darauf, dass alles Rock ist. Da es fast keine Korrelation zwischen dem Songtitel und dem Genre gibt, führt das Beharren darauf, dass sie alle Rock sind, zu einem minimalen Verlust. (Weil die Daten auf Rock voreingenommen sind ...) Ich wünschte ich hätte einen besseren Datensatz. ..
Es war eine Praxis, wie man RNN-bezogene APIs verwendet! !! Ich bin der Meinung, dass die Implementierung falsch ist, daher wäre ich dankbar, wenn Sie mir verschiedene Dinge beibringen könnten! !! !!
Recommended Posts