Je veux étudier RNN, mais je ne sais pas quoi faire, alors j'ai consulté mes aînés.
Wai "Senior, je veux étudier RNN en utilisant TensorFlow. Y a-t-il un bon sujet?" Senior "Bruyant. Je suis occupé donc je vous quitterai plus tard." Wai "..."
Prédisons le genre de musique à partir du titre de la chanson. .. .. (´ ・ ω ・ `)
Il y a un élément appelé genre dans la liste des titres de chansons d'itunes. Il y a peut-être un titre de chanson de type Rock ou un motif de titre de chanson de type Pop.
Extraire les données d'iTunes et les enregistrer dans un fichier csv
train_data.csv
Ho!,2
Deuces Are Wild,2
575,4
films,4
KICKS!,2
Raise it all,4
Rien(movie ver.),4
Fille de moratoire,4
You've Got To Hide Your Love Away,0
Ordinary,5
Quoi,4
Chasse à l'épée soudainement,4
Borderline,4
Timber,4
M.I.Y.A.,2
Journée d'été 1993,4
broken bone,4
Un ensemble de données comme celui-ci. Données de l'enseignant 2259, données de test 565. Les nombres dans la colonne de droite correspondent au genre.
categories.csv
Classical,0
R&B,1
Alternative,2
Pop,3
Rock,4
Rap,5
Punk,6
Dance & House,7
Comme ça.
Il semble que ce n'est pas correct d'analyser la morphologie du titre de la chanson, donc cette fois nous avons adopté Character RNN Entrez les données de série chronologique pour chaque caractère dans RNN pour apprendre les modèles de titre de chanson
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)}
Dans cette partie, le titre de la chanson est converti en une forme qui peut être transmise au réseau en attribuant un identifiant à chaque caractère.
main.py
def cell():
return tf.contrib.rnn.BasicRNNCell(num_units=NODE_NUM, activation=tf.nn.tanh) #Cellule de couche intermédiaire
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)
Puisque le titre de la chanson est de longueur variable, utilisez dynamic_rnn. La couche intermédiaire a 128 unités et deux couches sont empilées (super approprié), et la cellule est BasicRNN.
C'est vrai. .. Ouaip. .. Je ne peux même pas le voir. Les chansons de mes itunes sont d'abord orientées vers le rock. De plus, il est assez difficile pour les humains de deviner le genre à partir du titre de la chanson. Vous pouvez donc vous attendre au résultat, non?
[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}
J'ai essayé d'apprendre dans une certaine mesure. Les lignes 1 et 2 sont Train, Test loss et taux de réponse correct, La troisième ligne est le rapport entre le résultat réel de la prédiction du réseau et les données de test. Oui, j'insiste sur le fait que tout est Rock. Comme il n'y a presque aucune corrélation entre le titre de la chanson et le genre, insister sur le fait qu'ils sont tous Rock entraînera une perte minimale. (Parce que les données sont biaisées vers Rock ...) J'aurais aimé avoir un meilleur ensemble de données. ..
C'était une pratique d'utilisation des API liées à RNN! !! Je pense que la mise en œuvre est erronée, alors je vous serais reconnaissant si vous pouviez m'apprendre diverses choses! !! !!
Recommended Posts