Sheogorath Δημοσ. 1 Σεπτεμβρίου 2018 Δημοσ. 1 Σεπτεμβρίου 2018 (επεξεργασμένο) Καλησπέρα σας και καλό μήνα, Αντιμετωπίζω ένα πρόβλημα σε έναν κώδικα για RNN (Recurrent Neural Network) που γράφω. Ο κώδικας κάνει classification σε ένα δικό μου dataset (το οποίο σε feedforward δουλεύει μια χαρά). Ότι tutorials έχω βρει/διαβάσει/κοιτάξει χρησιμοποιούν το RNN για δημιουργία text (διαβάζουν ένα κείμενο, φτιάχνουν ένα dictionary με τις λέξεις και μετά μπορούν να "ανασυντάξουν/δημιουργήσουν" κάτι άλλο). Δεν έχω βρει για classification κάτι άλλο πέρα απο τον κώδικα που θα παραθέσω απο κάτω, και είναι για image classification. Δυστυχώς εγώ (υποθέτω) δεν είναι δυνατόν να κάνω dictionary για πραγματικούς αριθμούς, πόσο μάλλον όταν μιλάμε για συνολικά 843.720 logs Χ 12 νούμερα το κάθε ένα (10.124.640 σύνολο) (πόσοι να επαναλλαμβάνονται πια). Έχω "μεταποιήσει" λοιπόν τον πιο βολικό κώδικα αφου έχω γράψει 4-5 για text να καταλάβω πως δουλεύουν (θεωρητικά). Όταν τρέχει μου πετάει error ότι περιμένει στο κελί LSTM (Long Short Term Memory, βασικό στο RNN) να είναι ακολουθία, αλλά δεν είναι. Θα ήθελα λοιπόν την βοήθειά σας για το τι να αλλάξω, και γιατί λύνεται έτσι (να μάθω κιόλας). Το dataset μου που σας παραθέτω παρακάτω, αποτελείται απο 600.000 train samples (vectors 1X12) και το αποτέλεσμα σε one hot (01 ή 10), και 243.720 test samples. Ο κώδικας με το πρόβλημα: import tensorflow as tf #from tensorflow.python.ops import rnn, rnn_cell from tensorflow.contrib import rnn import pandas as pd import numpy as numpy from six.moves import xrange #read the dataset x_train = pd.read_csv('x_train.csv') x_test = pd.read_csv('x_test.csv') y_train = pd.read_csv('y_train.csv') y_test = pd.read_csv('y_test.csv') hm_epochs = 10 n_classes = 2 batch_size = 144 chunk_size = 12 n_chunks = 12 rnn_size = 144 n_dim = x_train.shape[1] x = tf.placeholder('float', [None, n_dim]) y = tf.placeholder('float') def next_batch(self, batch_size, fake_data=False, shuffle=True): """Return the next `batch_size` examples from this data set.""" if fake_data: fake_image = [1] * 784 if self.one_hot: fake_label = [1] + [0] * 9 else: fake_label = 0 return [fake_image for _ in xrange(batch_size)], [ fake_label for _ in xrange(batch_size) ] start = self._index_in_epoch # Shuffle for the first epoch if self._epochs_completed == 0 and start == 0 and shuffle: perm0 = numpy.arange(self._num_examples) numpy.random.shuffle(perm0) self._images = self.images[perm0] self._labels = self.labels[perm0] # Go to the next epoch if start + batch_size > self._num_examples: # Finished epoch self._epochs_completed += 1 # Get the rest examples in this epoch rest_num_examples = self._num_examples - start images_rest_part = self._images[start:self._num_examples] labels_rest_part = self._labels[start:self._num_examples] # Shuffle the data if shuffle: perm = numpy.arange(self._num_examples) numpy.random.shuffle(perm) self._images = self.images[perm] self._labels = self.labels[perm] # Start next epoch start = 0 self._index_in_epoch = batch_size - rest_num_examples end = self._index_in_epoch images_new_part = self._images[start:end] labels_new_part = self._labels[start:end] return numpy.concatenate( (images_rest_part, images_new_part), axis=0), numpy.concatenate( (labels_rest_part, labels_new_part), axis=0) else: self._index_in_epoch += batch_size end = self._index_in_epoch return self._images[start:end], self._labels[start:end] def recurrent_neural_network_model(x): layer = {'weights': tf.Variable(tf.random_normal([rnn_size, n_classes])), 'biases': tf.Variable(tf.random_normal([n_classes]))} #x = tf.transpose(x, [1, 0, 2]) #x = tf.reshape(x, [-1, chunk_size]) #x = tf.split(x, int(n_chunks)) lstm_cell = rnn.BasicLSTMCell(rnn_size) outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32) output = tf.matmul(outputs[-1], layer['weights']) + layer['biases'] return output def train_neural_network(x): prediction = recurrent_neural_network_model(x) cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y)) optimizer = tf.train.AdamOptimizer().minimize(cost) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for epoch in range(hm_epochs): epoch_loss = 0 for _ in range(int(600000 / batch_size)): epoch_x = x_train.next_batch(batch_size) epoch_y = y_train.next_batch(batch_size) #epoch_x = epoch_x.reshape((batch_size, n_chunks, chunk_size)) # reshape 748 pixels to 28X28 image #epoch_x = epoch_x.reshape((batch_size, -1)) # The first index changing slowest, subseries as rows #epoch_y = epoch_y.reshape((batch_size, -1)) _, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y}) epoch_loss += c #_, c = sess.run([optimizer, cost], feed_dict={x: x_train, y: y_train}) #epoch_loss += c print('Epoch', epoch, 'completed out of', hm_epochs, 'loss:', epoch_loss) correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct, 'float')) print('Accuracy:', accuracy.eval({x: x_test, y: y_test})) train_neural_network(x) Ο κλασσικός κώδικας που χρησιμοποίησα σε περίπτωση που τα έχω κάνει τόσο σκατούλες. import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # from tensorflow.python.ops import rnn, rnn_cell from tensorflow.contrib import rnn mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) hm_epochs = 10 n_classes = 10 batch_size = 128 chunk_size = 28 # size of image 28X28 n_chunks = 28 rnn_size = 128 x = tf.placeholder('float', [None, n_chunks, chunk_size]) y = tf.placeholder('float') def recurrent_neural_network_model(x): layer = {'weights': tf.Variable(tf.random_normal([rnn_size, n_classes])), 'biases': tf.Variable(tf.random_normal([n_classes]))} x = tf.transpose(x, [1, 0, 2]) x = tf.reshape(x, [-1, chunk_size]) x = tf.split(x, int(n_chunks)) lstm_cell = rnn.BasicLSTMCell(rnn_size) outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32) output = tf.matmul(outputs[-1], layer['weights']) + layer['biases'] return output def train_neural_network(x): prediction = recurrent_neural_network_model(x) cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y)) optimizer = tf.train.AdamOptimizer().minimize(cost) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for epoch in range(hm_epochs): epoch_loss = 0 for _ in range(int(mnist.train.num_examples / batch_size)): epoch_x, epoch_y = mnist.train.next_batch(batch_size) epoch_x = epoch_x.reshape((batch_size, n_chunks, chunk_size)) # reshape 748 pixels to 28X28 image _, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y}) epoch_loss += c print('Epoch', epoch, 'completed out of', hm_epochs, 'loss:', epoch_loss) correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct, 'float')) print('Accuracy:', accuracy.eval({x: mnist.test.images.reshape((-1, n_chunks, chunk_size)), y: mnist.test.labels})) train_neural_network(x) Στον δικό μου έχω περάσει και την συνάτρτηση "next_batch" γιατί χρησιμοποιείται για να περνάει το επόμενο "τμήμα" δεδομένων. Σας δίνω και το dataset που έχω δημιουργήσει, το οποίο είναι μερικές δεκάδες MB, και αποτελείται απο 4csv. https://www.dropbox.com/s/72zstpug8fvff5u/y_test.csv?dl=0 "Χώστε" ελέυθερα γιατί δεν θέλω να λυθεί ο κώδικας μόνο, αλλά θέλω και να μάθω. Σας ευχαριστώ. Επεξ/σία 2 Σεπτεμβρίου 2018 από Sheogorath
Fortistis Δημοσ. 1 Σεπτεμβρίου 2018 Δημοσ. 1 Σεπτεμβρίου 2018 (επεξεργασμένο) Αδερφέ, τα έχεις λίγο μπερδεμένα. Το NLP είναι κατεξοχήν classification task. Ό,τι έχεις διαβάσει για RNN και text ΕΙΝΑΙ classification task. Άρα, το: 23 λεπτά πριν, Sheogorath είπε . Δεν έχω βρει για classification κάτι άλλο πέρα απο τον κώδικα που θα παραθέσω απο κάτω είναι τουλάχιστον μπερδεμένο. Δεν κατάλαβα τι θες να κάνεις εσύ όμως. Επίσης, δεν καταλαβαίνω τι εννοείς με τον όρο dictionary. Μπορείς να χρησιμοποιήσεις κάποιον άλλο, γιατί από αυτά που γράφεις φαίνεται ότι έχεις ακριβώς τις γνώσεις για να μην καταλαβαίνεις ούτε και εσύ τι θέλεις να εννοήσεις με τον όρο αυτό. Π.χ., εννοείς dictionaries as in dictionary learning; Εννοείς embeddings, viewed as dictionaries; Εννοείς python dict; Τι; 23 λεπτά πριν, Sheogorath είπε δεν είναι δυνατόν να κάνω dictionary για πραγματικούς αριθμούς Επίσης, γράφεις αυτό αλλά χρησιμοποιείς softmax. Είναι λίγο μπλε οθόνη η κατάσταση. Που αναφέρεται το dictionary αυτό; Στην είσοδο; Στην έξοδο; Εάν είναι στην έξοδο, τότε κάτι κάνεις πολύ λάθος, μιας και η softmax είναι από τις πιο λάθος επιλογές για κάτι τέτοιο. Θέλεις να κάνεις τι ακριβώς; 23 λεπτά πριν, Sheogorath είπε Έχω "μεταποιήσει" λοιπόν τον πιο βολικό κώδικα αφου έχω γράψει 4-5 για text να καταλάβω πως δουλεύουν (θεωρητικά). Τέλος, για να καταλάβεις πώς δουλεύουν θεωρητικά, πρέπει να διαβάσεις το paper του Schmidhuber (ή όπως γράφεται το όνομά του) και όχι κώδικα. Αυτό που θέλεις να δεις είναι πώς υλοποιούνται. Επεξ/σία 1 Σεπτεμβρίου 2018 από Fortistis
Sheogorath Δημοσ. 1 Σεπτεμβρίου 2018 Μέλος Δημοσ. 1 Σεπτεμβρίου 2018 (επεξεργασμένο) 10 λεπτά πριν, Fortistis είπε Αδερφέ, τα έχεις λίγο μπερδεμένα. Το NLP είναι κατεξοχήν classification task. Ό,τι έχεις διαβάσει για RNN και text ΕΙΝΑΙ classification task. Άρα, το: είναι τουλάχιστον μπερδεμένο. Δεν κατάλαβα τι θες να κάνεις εσύ όμως. Επίσης, δεν καταλαβαίνω τι εννοείς με τον όρο dictionary. Μπορείς να χρησιμοποιήσεις κάποιον άλλο, γιατί από αυτά που γράφεις φαίνεται ότι έχεις ακριβώς τις γνώσεις για να μην καταλαβαίνεις ούτε και εσύ τι θέλεις να εννοήσεις με τον όρο αυτό. Π.χ., εννοείς dictionaries as in dictionary learning; Εννοείς embeddings, viewed as dictionaries; Εννοείς python dict; Τι; Επέτρεψέ μου να το θέσω διαφορετικά. Τα παραδείγματα που έχω δει, και γράψει, βασίζονται κυριως σε κείμενο και text file (το κλασσικό με τα ποντίκια και την γάτα). Εκεί επειδή ο αριθμός των διαφορετικών στοιχείων (λέξεις) είναι περιορισμένος, δουλεύουν κυρίως με πίνακα συχνότητας εμφάνισης και ένα "λεξιλόγιο" που κατασκευάζεις απαριθμώντας τις λέξεις που έχεις "ταίσει" στο δίκτυο. Για παράδειγμα, έχω κάνει αυτό. from __future__ import print_function import numpy as np import tensorflow as tf from tensorflow.contrib import rnn import random import collections import time start_time = time.time() def elapsed(sec): if sec<60: return str(sec) + " sec" elif sec<(60*60): return str(sec/60) + " min" else: return str(sec/(60*60)) + " hr" # Target log path logs_path = '/tmp/tensorflow/rnn_words' writer = tf.summary.FileWriter(logs_path) # Text file containing words for training training_file = 'belling_the_cat.txt' def read_data(fname): with open(fname) as f: content = f.readlines() content = [x.strip() for x in content] content = [word for i in range(len(content)) for word in content[i].split()] content = np.array(content) return content training_data = read_data(training_file) print("Loaded training data...") def build_dataset(words): count = collections.Counter(words).most_common() dictionary = dict() for word, _ in count: dictionary[word] = len(dictionary) reverse_dictionary = dict(zip(dictionary.values(), dictionary.keys())) return dictionary, reverse_dictionary dictionary, reverse_dictionary = build_dataset(training_data) vocab_size = len(dictionary) # Parameters learning_rate = 0.001 training_iters = 50000 display_step = 1000 n_input = 3 # number of units in RNN cell n_hidden = 512 # tf Graph input x = tf.placeholder("float", [None, n_input, 1]) y = tf.placeholder("float", [None, vocab_size]) # RNN output node weights and biases weights = { 'out': tf.Variable(tf.random_normal([n_hidden, vocab_size])) } biases = { 'out': tf.Variable(tf.random_normal([vocab_size])) } def RNN(x, weights, biases): # reshape to [1, n_input] x = tf.reshape(x, [-1, n_input]) # Generate a n_input-element sequence of inputs # (eg. [had] [a] [general] -> [20] [6] [33]) x = tf.split(x,n_input,1) # 2-layer LSTM, each layer has n_hidden units. # Average Accuracy= 95.20% at 50k iter rnn_cell = rnn.MultiRNNCell([rnn.BasicLSTMCell(n_hidden),rnn.BasicLSTMCell(n_hidden)]) # 1-layer LSTM with n_hidden units but with lower accuracy. # Average Accuracy= 90.60% 50k iter # Uncomment line below to test but comment out the 2-layer rnn.MultiRNNCell above # rnn_cell = rnn.BasicLSTMCell(n_hidden) # generate prediction outputs, states = rnn.static_rnn(rnn_cell, x, dtype=tf.float32) # there are n_input outputs but # we only want the last output return tf.matmul(outputs[-1], weights['out']) + biases['out'] pred = RNN(x, weights, biases) # Loss and optimizer cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y)) optimizer = tf.train.RMSPropOptimizer(learning_rate=learning_rate).minimize(cost) # Model evaluation correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) # Initializing the variables init = tf.global_variables_initializer() # Launch the graph with tf.Session() as session: session.run(init) step = 0 offset = random.randint(0,n_input+1) end_offset = n_input + 1 acc_total = 0 loss_total = 0 writer.add_graph(session.graph) while step < training_iters: # Generate a minibatch. Add some randomness on selection process. if offset > (len(training_data)-end_offset): offset = random.randint(0, n_input+1) symbols_in_keys = [ [dictionary[ str(training_data[i])]] for i in range(offset, offset+n_input) ] symbols_in_keys = np.reshape(np.array(symbols_in_keys), [-1, n_input, 1]) symbols_out_onehot = np.zeros([vocab_size], dtype=float) symbols_out_onehot[dictionary[str(training_data[offset+n_input])]] = 1.0 symbols_out_onehot = np.reshape(symbols_out_onehot,[1,-1]) _, acc, loss, onehot_pred = session.run([optimizer, accuracy, cost, pred], \ feed_dict={x: symbols_in_keys, y: symbols_out_onehot}) loss_total += loss acc_total += acc if (step+1) % display_step == 0: print("Iter= " + str(step+1) + ", Average Loss= " + \ "{:.6f}".format(loss_total/display_step) + ", Average Accuracy= " + \ "{:.2f}%".format(100*acc_total/display_step)) acc_total = 0 loss_total = 0 symbols_in = [training_data[i] for i in range(offset, offset + n_input)] symbols_out = training_data[offset + n_input] symbols_out_pred = reverse_dictionary[int(tf.argmax(onehot_pred, 1).eval())] print("%s - [%s] vs [%s]" % (symbols_in,symbols_out,symbols_out_pred)) step += 1 offset += (n_input+1) print("Optimization Finished!") print("Elapsed time: ", elapsed(time.time() - start_time)) print("Run on command line.") print("\ttensorboard --logdir=%s" % (logs_path)) print("Point your web browser to: http://localhost:6006/") while True: prompt = "%s words: " % n_input sentence = input(prompt) sentence = sentence.strip() words = sentence.split(' ') if len(words) != n_input: continue try: symbols_in_keys = [dictionary[str(words[i])] for i in range(len(words))] for i in range(32): keys = np.reshape(np.array(symbols_in_keys), [-1, n_input, 1]) onehot_pred = session.run(pred, feed_dict={x: keys}) onehot_pred_index = int(tf.argmax(onehot_pred, 1).eval()) sentence = "%s %s" % (sentence,reverse_dictionary[onehot_pred_index]) symbols_in_keys = symbols_in_keys[1:] symbols_in_keys.append(onehot_pred_index) print(sentence) except: print("Word not in dictionary") Mε αρχείο κειμένου ένα .txtμε το παρακατω (belling_the_cat.txt): long ago , the mice had a general council to consider what measures they could take to outwit their common enemy , the cat . some said this , and some said that but at last a young mouse got up and said he had a proposal to make , which he thought would meet the case . you will all agree , said he , that our chief danger consists in the sly and treacherous manner in which the enemy approaches us . now , if we could receive some signal of her approach , we could easily escape from her . i venture , therefore , to propose that a small bell be procured , and attached by a ribbon round the neck of the cat . by this means we should always know when she was about , and could easily retire while she was in the neighbourhood . this proposal met with general applause , until an old mouse got up and said that is all very well , but who is to bell the cat ? the mice looked at one another and nobody spoke . then the old mouse said it is easy to propose impossible remedies . Aπο ότι κατάλαβα, υπάρχει πρόβλημα στον κώδικα που έχω γράψει παραπάνω και δεν τρέχει, στον τρόπο που περνάω τα δεδομένα στο κελί LSTM. TypeError: inputs must be a sequence στην γραμμή 81. Επεξ/σία 1 Σεπτεμβρίου 2018 από Sheogorath
Fortistis Δημοσ. 1 Σεπτεμβρίου 2018 Δημοσ. 1 Σεπτεμβρίου 2018 1 λεπτό πριν, Sheogorath είπε Τα παραδείγματα που έχω δει, και γράψει, βασίζονται κυριως σε κείμενο και text file (το κλασσικό με τα ποντίκια και την γάτα). Εκεί επειδή ο αριθμός των διαφορετικών στοιχείων (λέξεις) είναι περιορισμένος, δουλεύουν κυρίως με πίνακα συχνότητας εμφάνισης και ένα "λεξιλόγιο" που κατασκευάζεις απαριθμώντας τις λέξεις που έχεις "ταίσει" στο δίκτυο. Δεν καταλαβαίνω. Μπορείς να το θέσεις πιο απλά, γιατί δεν χρησιμοποιείς κατάλληλη ορολογία (αν και προσπαθείς η αλήθεια είναι) με αποτέλεσμα να μην βγαίνει νόημα. Επίσης, απόφευγε να χρησιμοποιείς εκφράσεις όπως "δουλεύουν κυρίως με [...]" γιατί, από ό,τι φαίνεται, δεν γνωρίζεις με τι δουλεύουν κυρίως. Αυτό που γράφεις, π.χ., δεν ισχύει "κυρίως". Π.χ., πίνακας συχνότητας εμφάνισης; Αφού έχεις λέξεις και συχνότητα εμφάνισης, τότε έχεις διάνυσμα και όχι πίνακα. Κάθε στοιχείο είναι η συχνότητα εμφάνισης της λέξης στο αντίστοιχο index (alphabetically ordered ofc). Το "λεξιλόγιο" είναι marginally πιο obscure από το "dictionary" που χρησιμοποίησες. Μυρίζοντας λίγο τα νύχια μου, μάλλον λες για embeddings, σωστά;
Sheogorath Δημοσ. 1 Σεπτεμβρίου 2018 Μέλος Δημοσ. 1 Σεπτεμβρίου 2018 12 λεπτά πριν, Fortistis είπε Τέλος, για να καταλάβεις πώς δουλεύουν θεωρητικά, πρέπει να διαβάσεις το paper του Schmidhuber (ή όπως γράφεται το όνομά του) και όχι κώδικα. Αυτό που θέλεις να δεις είναι πώς υλοποιούνται. Τα μαθηματικά/θεωρία απο πίσω τα "έχω". Στην υλοποίηση κολλάω, γιατί είμαι νέος στην Python. Παρόλα αυτά θα κοιτάξω και το paper, σχεδόν σίγουρα θα μάθω κάτι καινούριο.
Fortistis Δημοσ. 1 Σεπτεμβρίου 2018 Δημοσ. 1 Σεπτεμβρίου 2018 (επεξεργασμένο) 8 λεπτά πριν, Sheogorath είπε δουλεύουν κυρίως Επίσης, τι εννοείς δουλεύουν; Ποια και τι νοείται ως "δουλεύουν" εδώ; Δουλεύουν = αναφέρεσαι στην έξοδο; Αναφέρεσαι σε κάποιο Ν-dim space, όπου εκεί γίνεται το learning των discirminant functions και έχεις στο νου σου dictionary learning θεώρηση; Αναφέρεσαι στο memory component, και το εννοείς ως δουλεύουν επειδή αυτό τα διαχωρίζει από τα MLP/HMM και εν γένει μοντέλα που δεν έχουν μνήμη; Και αναφέρσαι στα RNN; Επεξ/σία 1 Σεπτεμβρίου 2018 από Fortistis
Sheogorath Δημοσ. 1 Σεπτεμβρίου 2018 Μέλος Δημοσ. 1 Σεπτεμβρίου 2018 Μόλις τώρα, Fortistis είπε Δεν καταλαβαίνω. Μπορείς να το θέσεις πιο απλά, γιατί δεν χρησιμοποιείς κατάλληλη ορολογία (αν και προσπαθείς η αλήθεια είναι) με αποτέλεσμα να μην βγαίνει νόημα. Επίσης, απόφευγε να χρησιμοποιείς εκφράσεις όπως "δουλεύουν κυρίως με [...]" γιατί, από ό,τι φαίνεται, δεν γνωρίζεις με τι δουλεύουν κυρίως. Αυτό που γράφεις, π.χ., δεν ισχύει "κυρίως". Π.χ., πίνακας συχνότητας εμφάνισης; Αφού έχεις λέξεις και συχνότητα εμφάνισης, τότε έχεις διάνυσμα και όχι πίνακα. Κάθε στοιχείο είναι η συχνότητα εμφάνισης της λέξης στο αντίστοιχο index (alphabetically ordered ofc). Το "λεξιλόγιο" είναι marginally πιο obscure από το "dictionary" που χρησιμοποίησες. Μυρίζοντας λίγο τα νύχια μου, μάλλον λες για embeddings, σωστά; Σίγουρα θα βγαίνει καλύτερη άκρη κοιτώντας τον κώδικα παραπάνω (αυτόν με το κείμενο), παρά να προσπαθώ να το εξηγήσω. Ναι, (απο ότι κατάλαβα), καλά κατάλαβες. Με την συχνότητα παίζει, κάτι που στην δική μου περίπτωση το θεωρώ "μαθηματικά αδύνατον". Για το τι ισχύει κυρίως, το είδα βλέποντας ότι 9/10 παραδείγματα κτλ, είναι κυρίως με text/speech generation, και όχι ακριβώς classification όπως ένα συμβατικό FeedForward.
Fortistis Δημοσ. 1 Σεπτεμβρίου 2018 Δημοσ. 1 Σεπτεμβρίου 2018 Μόλις τώρα, Sheogorath είπε Για το τι ισχύει κυρίως, το είδα βλέποντας ότι 9/10 παραδείγματα κτλ, είναι κυρίως με text/speech generation, και όχι ακριβώς classification όπως ένα συμβατικό FeedForward. Πώς ακριβώς το text generation δεν είναι classification task; Μήπως πρέπει να ξαναδείς την θεωρία; Αυτό που λες είναι plain wrong. 1 λεπτό πριν, Sheogorath είπε Σίγουρα θα βγαίνει καλύτερη άκρη κοιτώντας τον κώδικα παραπάνω (αυτόν με το κείμενο), παρά να προσπαθώ να το εξηγήσω. Ναι, (απο ότι κατάλαβα), καλά κατάλαβες Προσωπικά θα έλεγα ότι έχεις κάποιο χαζό πρόβλημα στις διαστάσεις αλλά δεν μπορώ να καταλάβω από τον κώδικα που έχεις, δεν χρησιμοποιώ TF. Μπορώ να βοηθήσω αλλά δεν καταλαβαίνω τι είναι το πρόβλημα. 3 λεπτά πριν, Sheogorath είπε Με την συχνότητα παίζει, κάτι που στην δική μου περίπτωση το θεωρώ "μαθηματικά αδύνατον". Μπλε οθόνη. Αυτό που γράφεις δεν βγάζει νόημα.
Sheogorath Δημοσ. 1 Σεπτεμβρίου 2018 Μέλος Δημοσ. 1 Σεπτεμβρίου 2018 2 λεπτά πριν, Fortistis είπε Επίσης, τι εννοείς δουλεύουν; Ποια και τι νοείται ως "δουλεύουν" εδώ; Δουλεύουν = αναφέρεσαι στην έξοδο; Αναφέρεσαι σε κάποιο Ν-dim space, όπου εκεί γίνεται το learning των discirminant functions και έχεις στο νου σου dictionary learning θεώρηση; Αναφέρεσαι στο memory component, και το εννοείς ως δουλεύουν επειδή αυτό τα διαχωρίζει από τα MLP/HMM και εν γένει μοντέλα που δεν έχουν μνήμη; Και αναφέρσαι στα RNN; Ναι, στο πεδίο χρήσης τους αναφέρομαι, δεν έχω βρει κάτι παρεμφερές με αυτόπου κοιτάω, παρά ένα άλλο για οικονομικά που λόγω inflation δεν έβγαλε καλά αποτελέσματα. Τα MLP/HMM δεν τα γνωρίζω, θα τα κοιταξω μόλις τελειώσω απο εδώ. 1 λεπτό πριν, Fortistis είπε Πώς ακριβώς το text generation δεν είναι classification task; Μήπως πρέπει να ξαναδείς την θεωρία; Αυτό που λες είναι plain wrong. Δεν τα θεωρώ classification της έννοιας "ξεχώρησε τις μπάλες σε μπλε και κόκκινες" αλλά έχουν πολύ μεγαλύτερη βαρύτητα στην έννοια της ακολουθίας. Απο αυτή την άποψη.
Fortistis Δημοσ. 1 Σεπτεμβρίου 2018 Δημοσ. 1 Σεπτεμβρίου 2018 (επεξεργασμένο) 6 λεπτά πριν, Sheogorath είπε με text/speech generation, και όχι ακριβώς classification όπως ένα συμβατικό FeedForward Η μόνη διαφορά είναι ότι με τα RNN μοντελοποιείς εγγενώς το conditional prob (current prediction given input and all other predictions) ενώ στο MLP θέλεις explicitly να το κάνεις. Κατά τα άλλα, είναι ίδια φάση (εξαιρουμένου του memory component). 2 λεπτά πριν, Sheogorath είπε Δεν τα θεωρώ classification της έννοιας "ξεχώρησε τις μπάλες σε μπλε και κόκκινες" αλλά έχουν πολύ μεγαλύτερη βαρύτητα στην έννοια της ακολουθίας α) να με συμπαθάς, αλλά το τι θεωρείς στον πλανήτη σου είναι λίγο άσχετο και δεν είναι και optimized για επικοινωνία με άλλους πλανήτες. β) το "έχουν πολύ μεγαλύτερη βαρύτητα στην έννοια της ακολουθίας" δεν ξέρω τι σημαίνει. Τι εννοείς βαρύτητα; Τι εννοείς έννοια της ακολουθίας; Επεξ/σία 1 Σεπτεμβρίου 2018 από Fortistis 1
Sheogorath Δημοσ. 1 Σεπτεμβρίου 2018 Μέλος Δημοσ. 1 Σεπτεμβρίου 2018 (επεξεργασμένο) 4 λεπτά πριν, Fortistis είπε Η μόνη διαφορά είναι ότι με τα RNN μοντελοποιείς εγγενώς το conditional prob ενώ στο MLP θέλεις explicitly να το κάνεις. Κατά τα άλλα, είναι ίδια φάση (εξαιρουμένου του memory component). Ευχαριστώ, θα τα κοιτάξω μόλις τελειώσω απο εδώ. Πάνω στον κώδικά μου, έχεις κάποια ιδέα; Λογικά κάπου τα σκτσα, και θα ήθελα να λυθεί προγραμματιστικά, για να το μάθω και εγώ. Το πρόβλημα είναι ότι ο καθένας έχει αρκετά διαφορετικό στυλ τουλάχιστον σε ότι είδα online, και δεν είναι consistent κατι, να μπορείς να κάνεις εύκολα ένα "Frankestein" κώδικα και να "παίξεις/πειραματιστείς". Επεξ/σία 1 Σεπτεμβρίου 2018 από Sheogorath
Fortistis Δημοσ. 1 Σεπτεμβρίου 2018 Δημοσ. 1 Σεπτεμβρίου 2018 1 λεπτό πριν, Sheogorath είπε Ευχαριστώ, θα τα κοιτάξω μόλις τελειώσω απο εδώ. Πάνω στον κώδικά μου, έχεις κάποια ιδέα; Λογικά κάπου τα σκτσα, και θα ήθελα να λυθεί προγραμματιστικά, για να το μάθω και εγώ. Το πρόβλημα είναι ότι ο καθένας έχει αρκετά διαφορετικό στυλ τουλάχιστον σε ότι είδα online, και δεν είναι consistent κατι, να μπορείς να κάνεις εύκολα ένα "Frankestein" κώδικα και να "παίξεις/πειραματιστείς". Με το λίγο που είδα και κατάλαβα από αυτά που λες, μάλλον δίνεις ndim != με αυτό που θέλει να δει το RNN σου. Είτε δίνεις ndim = 4 είτε ndim = 2. Το άλλο σενάριο είναι ότι δίνεις λάθος ndim στο embeding layer σου.
Sheogorath Δημοσ. 1 Σεπτεμβρίου 2018 Μέλος Δημοσ. 1 Σεπτεμβρίου 2018 3 λεπτά πριν, Fortistis είπε Με το λίγο που είδα και κατάλαβα από αυτά που λες, μάλλον δίνεις ndim != με αυτό που θέλει να δει το RNN σου. Είτε δίνεις ndim = 4 είτε ndim = 2. Το άλλο σενάριο είναι ότι δίνεις λάθος ndim στο embeding layer σου. Το n_dim που έχω ορίσει εγώ, είναι 12, όπως και το μέγεθος του κάθε sample/vector. Σε ποιο αναφέρεσαι εσυ; Θα πρέπει να δωσω n_dim= 2*12 πιθανόν (ή παραπάνω) για να χωρέσει ακολουθία και όχι μόνο ένα sample;
Fortistis Δημοσ. 1 Σεπτεμβρίου 2018 Δημοσ. 1 Σεπτεμβρίου 2018 (επεξεργασμένο) ndim είναι το πόσες διαστάσεις έχει το tensor που χρησιμοποιείς. Εάν λες για 12 διαστάσεις, τότε είτε αναφέρεσαι στο ndim του feature space σου, κάτι που είναι εντελώς διαφορετικό, είτε κάτι πάει πολύ στραβά... μα πολύ στραβά Θεωρώντας ότι αναφέρεσαι στο feature space, αυτό που λες είναι άσχετο. Εάν έχεις embedding layer, τότε θέλεις input dim `b_size, n_words` ( ndim = 2 ) όπου n_words είναι number of words, ισοδύναμο με το πόσα time steps θα έχει το seq σου. Εάν δεν έχεις embedding layer, τότε θέλεις input dim `b_size, n_words, n_features` ( ndim = 3 ), όπου n_features είναι το embedding size σου. Γενικά, εάν σταματήσεις να πηγαίνεις στα τυφλά και διαβάσεις αντί να γράφεις κώδικα, θα προχωρήσεις πιο γρήγορα. Αυτή τη στιγμή έχεις ελλείψεις σε βασικά θέματα. Π.χ., τι είναι features και πώς χρησιμοποιούνται. Επεξ/σία 1 Σεπτεμβρίου 2018 από Fortistis 1
Sheogorath Δημοσ. 1 Σεπτεμβρίου 2018 Μέλος Δημοσ. 1 Σεπτεμβρίου 2018 (επεξεργασμένο) 1 ώρα πριν, Fortistis είπε ndim είναι το πόσες διαστάσεις έχει το tensor που χρησιμοποιείς. Εάν λες για 12 διαστάσεις, τότε είτε αναφέρεσαι στο ndim του feature space σου, κάτι που είναι εντελώς διαφορετικό, είτε κάτι πάει πολύ στραβά... μα πολύ στραβά Θεωρώντας ότι αναφέρεσαι στο feature space, αυτό που λες είναι άσχετο. Εάν έχεις embedding layer, τότε θέλεις input dim `b_size, n_words` ( ndim = 2 ) όπου n_words είναι number of words, ισοδύναμο με το πόσα time steps θα έχει το seq σου. Εάν δεν έχεις embedding layer, τότε θέλεις input dim `b_size, n_words, n_features` ( ndim = 3 ), όπου n_features είναι το embedding size σου. Γενικά, εάν σταματήσεις να πηγαίνεις στα τυφλά και διαβάσεις αντί να γράφεις κώδικα, θα προχωρήσεις πιο γρήγορα. Αυτή τη στιγμή έχεις ελλείψεις σε βασικά θέματα. Π.χ., τι είναι features και πώς χρησιμοποιούνται. Θα μπορούσες να το δείξεις πάνω στον κώδικα; Σοβαρά χρειάζομαι ένα παράδειγμα για να δω εφαρμοσμένα πως δουλεύει. Ναι, όπως είπα το μόνο n_dim που έχω δώσει είναι το 1Χ12, φαντάστηκα οτι δεν είναι αυτό που αναφερόσουν, απλώς δεν γνωρίζω πως το "γράφεις". Λοιπόν, τελικά χρειάζονταν η εντολή split που είχα βάλει σε comment (σειρά 78). Ο νέος κώδικας είναι: import tensorflow as tf #from tensorflow.python.ops import rnn, rnn_cell from tensorflow.contrib import rnn import pandas as pd import numpy as numpy from six.moves import xrange #read the dataset x_train = pd.read_csv('x_train.csv') x_test = pd.read_csv('x_test.csv') y_train = pd.read_csv('y_train.csv') y_test = pd.read_csv('y_test.csv') hm_epochs = 10 n_classes = 2 batch_size = 144 chunk_size = 12 n_chunks = 12 rnn_size = 144 n_dim = x_train.shape[1] x = tf.placeholder('float', [None, n_dim]) y = tf.placeholder('float') def next_batch(self, batch_size, fake_data=False, shuffle=True): """Return the next `batch_size` examples from this data set.""" if fake_data: fake_image = [1] * 784 if self.one_hot: fake_label = [1] + [0] * 9 else: fake_label = 0 return [fake_image for _ in xrange(batch_size)], [ fake_label for _ in xrange(batch_size) ] start = self._index_in_epoch # Shuffle for the first epoch if self._epochs_completed == 0 and start == 0 and shuffle: perm0 = numpy.arange(self._num_examples) numpy.random.shuffle(perm0) self._images = self.images[perm0] self._labels = self.labels[perm0] # Go to the next epoch if start + batch_size > self._num_examples: # Finished epoch self._epochs_completed += 1 # Get the rest examples in this epoch rest_num_examples = self._num_examples - start images_rest_part = self._images[start:self._num_examples] labels_rest_part = self._labels[start:self._num_examples] # Shuffle the data if shuffle: perm = numpy.arange(self._num_examples) numpy.random.shuffle(perm) self._images = self.images[perm] self._labels = self.labels[perm] # Start next epoch start = 0 self._index_in_epoch = batch_size - rest_num_examples end = self._index_in_epoch images_new_part = self._images[start:end] labels_new_part = self._labels[start:end] return numpy.concatenate( (images_rest_part, images_new_part), axis=0), numpy.concatenate( (labels_rest_part, labels_new_part), axis=0) else: self._index_in_epoch += batch_size end = self._index_in_epoch return self._images[start:end], self._labels[start:end] def recurrent_neural_network_model(x): layer = {'weights': tf.Variable(tf.random_normal([rnn_size, n_classes])), 'biases': tf.Variable(tf.random_normal([n_classes]))} #x = tf.transpose(x, [1, 0, 2]) #x = tf.reshape(x, [-1, chunk_size]) x = tf.split(x, int(n_chunks)) lstm_cell = rnn.BasicLSTMCell(rnn_size) outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32) output = tf.matmul(outputs[-1], layer['weights']) + layer['biases'] return output def train_neural_network(x): prediction = recurrent_neural_network_model(x) cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y)) optimizer = tf.train.AdamOptimizer().minimize(cost) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for epoch in range(hm_epochs): epoch_loss = 0 for _ in range(int(600000 / batch_size)): epoch_x = x_train.next_batch(batch_size) epoch_y = y_train.next_batch(batch_size) #epoch_x = epoch_x.reshape((batch_size, n_chunks, chunk_size)) # reshape 748 pixels to 28X28 image #epoch_x = epoch_x.reshape((batch_size, -1)) # The first index changing slowest, subseries as rows #epoch_y = epoch_y.reshape((batch_size, -1)) _, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y}) epoch_loss += c #_, c = sess.run([optimizer, cost], feed_dict={x: x_train, y: y_train}) #epoch_loss += c print('Epoch', epoch, 'completed out of', hm_epochs, 'loss:', epoch_loss) correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct, 'float')) print('Accuracy:', accuracy.eval({x: x_test, y: y_test})) train_neural_network(x) και πλέον έχει πρόβλημα στο next_batch, "AttributeError: 'DataFrame' object has no attribute 'next_batch'" Προφανώς δεν μπορεί να καλεστεί έτσι η συνάρτηση, όπως το είχε ο τύπος στο παράδειγμα. Θα κοιτάξω να την φτιάξω. Αν κάποιος μπορούσε (και θέλει) να γράψει συνάρτηση για το δικό μου παράδειγμα αντί να έχω την γενική του mnist, θα το εκτιμούσα. Επεξ/σία 1 Σεπτεμβρίου 2018 από Sheogorath
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα