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!