Tensorflow - uczenie przez wzmacnianie, przygotowanie sieci (pełniącej rolę polityki)

Odpowiedz Nowy wątek
2019-03-07 14:40
0

Cześć!
Od jakiegoś czasu "bawię się" w Tensorflow i testuję różne topologie sieci oraz metody uczenia.
Natknąłem się na pewien problem podczas próby implementacji uczenia przez wzmacnianie.
Pracuję na podstawie książki "Uczenie maszynowe z użyciem Scikit Learn i Tensorflow", tu znalazłem przykład sieci uczonej przez wzmacnianie o 4 wejściach oraz jednym wyjściu:

n_inputs = 4
n_hidden = 4
n_outputs = 1

X = tf.placeholder(tf.float32, shape=[None, n_inputs])

hidden = fully_connected(X, n_hidden, activation_fn=tf.nn.elu, weights_initializer=initializer)
logits = fully_connected(hidden, n_outputs, activation_fn=None)
outputs = tf.nn.sigmoid(logits) 
2_actions= tf.concat(axis=1, values=[outputs, 1 - outputs])
action = tf.multinomial(tf.log(2_actions), num_samples=1)

y = 1. - tf.to_float(action)
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits)

Wyjście sieci to prawdopodobieństwo czynności_1, przy czym czynność_2 to prawdopodobieństwo 1 - prawdopodobieństwo(czynność_1)

Teraz kwestia leży po stronie mojej próby stworzenia podobnej sieci, ale z 3 wyjściami, oraz siecią rekurencyjną zamiast warstwy ukrytej, każde wyjście odpowiada jednej czynności:

n_inputs = 2
n_steps = 30
n_neurons = 10
n_outputs = 3

X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])

basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons) # używam zwykłej komórki dla rnn
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)

logits = tf.layers.dense(states, n_outputs) # states bo nie potrzebuje calego ciagu wyjsciowego z sieci rnn tylko ostateczny stan wyjsciowy (states)

out_softmax = tf.nn.softmax(logits) # oczekuje kilku wyjść dlatego nie funkcja softmax zamiast logistycznej sigmoidalnej

3_actions= tf.concat(axis=1, values=out_softmax)

action = tf.multinomial(tf.log(3_actions), num_samples=1) # action to prawdopodobieństwo realizacji jednej z 3 czynności

y = tf.to_float(action) # wyjscie sieci to jedna z 3 czynności 

#funkcja kosztu:
xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits) 

Już na etapie fazy konstrukcyjnej sieci pojawia mi się błąd:

ValueError: Rank mismatch: Rank of labels (received 2) should equal rank of logits minus 1 (received 2).

Oczywiście rozumiem co oznacza, jednak nie wiem jak rozwiązać problem. Najwyraźniej błędnie rozumiem któryś z etapów budowy sieci.
Problem leży najprawdopodobniej nad postacią wartości y, jednak szukając w różnych źródłach, nie udało mi się natknąć na żadne pomocne materiały.
(na tę chwilę zmienna y jest tensorem o rozmiarze (?,3) natomiast tensor logits ma rozmiar (?,1))
Czy jest w stanie ktoś coś podpowiedzieć?

A może posiada ktoś jakieś materiały dotyczące samego uczenia maszynowego z użyciem tensorflow, z naciskiem na samouczenie, uczenie ze wzmacnianiem, a także sieciami SOM? Chętnie poszperam :)

Pozdrawiam wszystkich!

edytowany 2x, ostatnio: CzakuGim, 2019-03-07 15:10

Pozostało 580 znaków

2019-03-07 15:36
softmax_cross_entropy_with_logits_v2
labels: Each vector along the class dimension should hold a valid
      probability distribution e.g. for the case in which labels are of shape
      `[batch_size, num_classes]`, each row of `labels[i]` must be a valid
      probability distribution.

sparse_softmax_cross_entropy_with_logits
`labels` must have the dtype of `int32` or `int64`.

entorpy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=logits)

btw nie wiem jakiego oczekujesz y dlatego jesli jest to onehotvector to sparse_softmax_cross_entropy_with_logits, a jesli jest to numer klasy to softmax_cross_entropy_with_logits
softmax_cross_entropy_with_logits -> czyli onehotvector
sparse_softmax_cross_entropy_with_logits -> czyli int

edytowany 6x, ostatnio: komuher, 2019-03-07 15:42

Pozostało 580 znaków

2019-03-07 15:50
0

Dzięki za zainteresowanie i szybką odpowiedź!
Numer klasy -> rozumiem, że stosowane np. dla zadania klasyfikacji (mam 10 cyfr) i w zależności od tego czy wyjściem jest 0...9 - klasyfikuję obraz.
A onehotvector?
Jak stosowane, w jakich przypadkach?

Pozostało 580 znaków

2019-03-07 15:55
1
CzakuGim napisał(a):

Dzięki za zainteresowanie i szybką odpowiedź!
Numer klasy -> rozumiem, że stosowane np. dla zadania klasyfikacji (mam 10 cyfr) i w zależności od tego czy wyjściem jest 0...9 - klasyfikuję obraz.
A onehotvector?
Jak stosowane, w jakich przypadkach?

onehotvector to np. -> [0., 0., 0., 1.] -> czyli klasa numer 4
int to po prostu 4
Ale jako że wyjście softmax przy np. 10 klasach to bedzie -> [0.02, 0.01, ..., 0.95] zeby policzyc entropie potrzebujesz vectora y w postaci -> [0., 0., ..., 1] w kazdym problemie klasyfikacyjnym (oprócz binarnych gdzie stosujemy sigmoida) stosuje się taki format czyli na wyjsciu prawdopodobienstwa (zalezy od frameworku albo softmax i pozniej funkcja straty albo po prostu zwykle wyjscie liniowe i pozniej funkcja straty ktora sama narzuca softmaxa / logsoftmaxa)

edytowany 1x, ostatnio: komuher, 2019-03-07 15:58

Pozostało 580 znaków

2019-03-07 16:17
0

W porządku,
byłbyś w stanie polecić jakąś literaturę pod tensorflow i uczenie maszynowe? Poza pozycją, którą już zacytowałem w pierwszym poście.

Pozostało 580 znaków

2019-03-07 16:27
1

Chyba każda książka jest outdated jeśli chodzi o deep learning a jesli chodzi o podstawy to ta ksiązka którą podałęś jest spoko plus pierwsze pare rozdzialow z "Deep Learning" Ian Goodfellow

https://github.com/janishar/mit-deep-learning-book-pdf

edytowany 1x, ostatnio: komuher, 2019-03-07 16:28

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0