Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα σας και καλό μήνα,

Αντιμετωπίζω ένα πρόβλημα σε έναν κώδικα για 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

"Χώστε" ελέυθερα γιατί δεν θέλω να λυθεί ο κώδικας μόνο, αλλά θέλω και να μάθω.

Σας ευχαριστώ.

Επεξ/σία από Sheogorath
  • Απαντ. 45
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Δημοσ. (επεξεργασμένο)

Αδερφέ, τα έχεις λίγο μπερδεμένα. Το 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 (ή όπως γράφεται το όνομά του) και όχι κώδικα. Αυτό που θέλεις να δεις είναι πώς υλοποιούνται. 

Επεξ/σία από Fortistis
Δημοσ. (επεξεργασμένο)
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.

Επεξ/σία από Sheogorath
Δημοσ.
1 λεπτό πριν, Sheogorath είπε

Τα παραδείγματα που έχω δει, και γράψει, βασίζονται κυριως σε κείμενο και text file (το κλασσικό με τα ποντίκια και την γάτα). Εκεί επειδή ο αριθμός των διαφορετικών στοιχείων (λέξεις) είναι περιορισμένος, δουλεύουν κυρίως με πίνακα συχνότητας εμφάνισης και ένα "λεξιλόγιο" που κατασκευάζεις απαριθμώντας τις λέξεις που έχεις "ταίσει" στο δίκτυο.

Δεν καταλαβαίνω. Μπορείς να το θέσεις πιο απλά, γιατί δεν χρησιμοποιείς κατάλληλη ορολογία (αν και προσπαθείς η αλήθεια είναι) με αποτέλεσμα να μην βγαίνει νόημα. Επίσης, απόφευγε να χρησιμοποιείς εκφράσεις όπως "δουλεύουν κυρίως με [...]" γιατί, από ό,τι φαίνεται, δεν γνωρίζεις με τι δουλεύουν κυρίως. Αυτό που γράφεις, π.χ., δεν ισχύει "κυρίως". 

Π.χ., πίνακας συχνότητας εμφάνισης; Αφού έχεις λέξεις και συχνότητα εμφάνισης, τότε έχεις διάνυσμα και όχι πίνακα. Κάθε στοιχείο είναι η συχνότητα εμφάνισης της λέξης στο αντίστοιχο index (alphabetically ordered ofc). Το "λεξιλόγιο" είναι marginally πιο obscure από το "dictionary" που χρησιμοποίησες. Μυρίζοντας λίγο τα νύχια μου, μάλλον λες για embeddings, σωστά; 

Δημοσ.
12 λεπτά πριν, Fortistis είπε

 

Τέλος, για να καταλάβεις πώς δουλεύουν θεωρητικά, πρέπει να διαβάσεις το paper του Schmidhuber (ή όπως γράφεται το όνομά του) και όχι κώδικα. Αυτό που θέλεις να δεις είναι πώς υλοποιούνται. 

Τα μαθηματικά/θεωρία απο πίσω τα "έχω". Στην υλοποίηση κολλάω, γιατί είμαι νέος στην Python. Παρόλα αυτά θα κοιτάξω και το paper, σχεδόν σίγουρα θα μάθω κάτι καινούριο.

Δημοσ. (επεξεργασμένο)
8 λεπτά πριν, Sheogorath είπε

δουλεύουν κυρίως

Επίσης, τι εννοείς δουλεύουν; Ποια και τι νοείται ως "δουλεύουν" εδώ; 

Δουλεύουν = αναφέρεσαι στην έξοδο; Αναφέρεσαι σε κάποιο Ν-dim space, όπου εκεί γίνεται το learning των discirminant functions και έχεις στο νου σου dictionary learning θεώρηση; Αναφέρεσαι στο memory component, και το εννοείς ως δουλεύουν επειδή αυτό τα διαχωρίζει από τα MLP/HMM και εν γένει μοντέλα που δεν έχουν μνήμη; 

Και αναφέρσαι στα RNN; 

Επεξ/σία από Fortistis
Δημοσ.
Μόλις τώρα, Fortistis είπε

Δεν καταλαβαίνω. Μπορείς να το θέσεις πιο απλά, γιατί δεν χρησιμοποιείς κατάλληλη ορολογία (αν και προσπαθείς η αλήθεια είναι) με αποτέλεσμα να μην βγαίνει νόημα. Επίσης, απόφευγε να χρησιμοποιείς εκφράσεις όπως "δουλεύουν κυρίως με [...]" γιατί, από ό,τι φαίνεται, δεν γνωρίζεις με τι δουλεύουν κυρίως. Αυτό που γράφεις, π.χ., δεν ισχύει "κυρίως". 

Π.χ., πίνακας συχνότητας εμφάνισης; Αφού έχεις λέξεις και συχνότητα εμφάνισης, τότε έχεις διάνυσμα και όχι πίνακα. Κάθε στοιχείο είναι η συχνότητα εμφάνισης της λέξης στο αντίστοιχο index (alphabetically ordered ofc). Το "λεξιλόγιο" είναι marginally πιο obscure από το "dictionary" που χρησιμοποίησες. Μυρίζοντας λίγο τα νύχια μου, μάλλον λες για embeddings, σωστά; 

Σίγουρα θα βγαίνει καλύτερη άκρη κοιτώντας τον κώδικα παραπάνω (αυτόν με το κείμενο), παρά να προσπαθώ να το εξηγήσω. Ναι, (απο ότι κατάλαβα), καλά κατάλαβες. Με την συχνότητα παίζει, κάτι που στην δική μου περίπτωση το θεωρώ "μαθηματικά αδύνατον".

Για το τι ισχύει κυρίως, το είδα βλέποντας ότι 9/10 παραδείγματα κτλ, είναι κυρίως με text/speech generation, και όχι ακριβώς classification όπως ένα συμβατικό FeedForward.

Δημοσ.
Μόλις τώρα, Sheogorath είπε

Για το τι ισχύει κυρίως, το είδα βλέποντας ότι 9/10 παραδείγματα κτλ, είναι κυρίως με text/speech generation, και όχι ακριβώς classification όπως ένα συμβατικό FeedForward.

Πώς ακριβώς το text generation δεν είναι classification task; Μήπως πρέπει να ξαναδείς την θεωρία; Αυτό που λες είναι plain wrong. 

1 λεπτό πριν, Sheogorath είπε

Σίγουρα θα βγαίνει καλύτερη άκρη κοιτώντας τον κώδικα παραπάνω (αυτόν με το κείμενο), παρά να προσπαθώ να το εξηγήσω. Ναι, (απο ότι κατάλαβα), καλά κατάλαβες

Προσωπικά θα έλεγα ότι έχεις κάποιο χαζό πρόβλημα στις διαστάσεις αλλά δεν μπορώ να καταλάβω από τον κώδικα που έχεις, δεν χρησιμοποιώ TF. Μπορώ να βοηθήσω αλλά δεν καταλαβαίνω τι είναι το πρόβλημα. 

 

3 λεπτά πριν, Sheogorath είπε

Με την συχνότητα παίζει, κάτι που στην δική μου περίπτωση το θεωρώ "μαθηματικά αδύνατον".

Μπλε οθόνη. Αυτό που γράφεις δεν βγάζει νόημα. 

Δημοσ.
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 της έννοιας "ξεχώρησε τις μπάλες σε μπλε και κόκκινες" αλλά έχουν πολύ μεγαλύτερη βαρύτητα στην έννοια της ακολουθίας. Απο αυτή την άποψη.

Δημοσ. (επεξεργασμένο)
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 για επικοινωνία με άλλους πλανήτες. 

β) το "έχουν πολύ μεγαλύτερη βαρύτητα στην έννοια της ακολουθίας" δεν ξέρω τι σημαίνει. Τι εννοείς βαρύτητα; Τι εννοείς έννοια της ακολουθίας; 

Επεξ/σία από Fortistis
  • Thanks 1
Δημοσ. (επεξεργασμένο)
4 λεπτά πριν, Fortistis είπε

Η μόνη διαφορά είναι ότι με τα RNN μοντελοποιείς εγγενώς το conditional prob ενώ στο MLP θέλεις explicitly να το κάνεις. Κατά τα άλλα, είναι ίδια φάση (εξαιρουμένου του memory component). 

Ευχαριστώ, θα τα κοιτάξω μόλις τελειώσω απο εδώ. Πάνω στον κώδικά μου, έχεις κάποια ιδέα; Λογικά κάπου τα σκτσα, και θα ήθελα να λυθεί προγραμματιστικά, για να το μάθω και εγώ.

Το πρόβλημα είναι ότι ο καθένας έχει αρκετά διαφορετικό στυλ τουλάχιστον σε ότι είδα online, και δεν είναι consistent κατι, να μπορείς να κάνεις εύκολα ένα "Frankestein" κώδικα και να "παίξεις/πειραματιστείς".

Επεξ/σία από Sheogorath
Δημοσ.
1 λεπτό πριν, Sheogorath είπε

Ευχαριστώ, θα τα κοιτάξω μόλις τελειώσω απο εδώ. Πάνω στον κώδικά μου, έχεις κάποια ιδέα; Λογικά κάπου τα σκτσα, και θα ήθελα να λυθεί προγραμματιστικά, για να το μάθω και εγώ.

 Το πρόβλημα είναι ότι ο καθένας έχει αρκετά διαφορετικό στυλ τουλάχιστον σε ότι είδα online, και δεν είναι consistent κατι, να μπορείς να κάνεις εύκολα ένα "Frankestein" κώδικα και να "παίξεις/πειραματιστείς".

Με το λίγο που είδα και κατάλαβα από αυτά που λες, μάλλον δίνεις ndim != με αυτό που θέλει να δει το RNN σου. Είτε δίνεις ndim = 4 είτε ndim = 2. Το άλλο σενάριο είναι ότι δίνεις λάθος ndim στο embeding layer σου. 

Δημοσ.
3 λεπτά πριν, Fortistis είπε

Με το λίγο που είδα και κατάλαβα από αυτά που λες, μάλλον δίνεις ndim != με αυτό που θέλει να δει το RNN σου. Είτε δίνεις ndim = 4 είτε ndim = 2. Το άλλο σενάριο είναι ότι δίνεις λάθος ndim στο embeding layer σου. 

Το n_dim που έχω ορίσει εγώ, είναι 12, όπως και το μέγεθος του κάθε sample/vector. Σε ποιο αναφέρεσαι εσυ; Θα πρέπει να δωσω n_dim= 2*12 πιθανόν (ή παραπάνω) για να χωρέσει ακολουθία και όχι μόνο ένα sample;

Δημοσ. (επεξεργασμένο)

ndim είναι το πόσες διαστάσεις έχει το tensor που χρησιμοποιείς. 

Εάν λες για 12 διαστάσεις, τότε είτε αναφέρεσαι στο ndim του feature space σου, κάτι που είναι εντελώς διαφορετικό, είτε κάτι πάει πολύ στραβά... μα πολύ στραβά :P

Θεωρώντας ότι αναφέρεσαι στο 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 και πώς χρησιμοποιούνται. 

Επεξ/σία από Fortistis
  • Like 1
Δημοσ. (επεξεργασμένο)
1 ώρα πριν, Fortistis είπε

ndim είναι το πόσες διαστάσεις έχει το tensor που χρησιμοποιείς. 

Εάν λες για 12 διαστάσεις, τότε είτε αναφέρεσαι στο ndim του feature space σου, κάτι που είναι εντελώς διαφορετικό, είτε κάτι πάει πολύ στραβά... μα πολύ στραβά :P

Θεωρώντας ότι αναφέρεσαι στο 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, θα το εκτιμούσα.

Επεξ/σία από Sheogorath

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...