Hej,
jakiś czas temu budowałem sieć neuronową uczoną przez wzmacnianie. Na wejście podaję dwa ciągi danych, na wyjściu oczekuję 3 różnych stanów.
Sieć tę opisałem w temacie:
https://4programmers.net/Forum/Python/323748-tensorflow_uczenie_przez_wzmacnianie_przygotowanie_sieci_pelniacej_role_polityki?p=1573830#id1573830

Finalnie mam sieć:

n_inputs = 2 
n_steps = liczba_danych
n_neurons = 20  # 200 
n_hidden = 4
n_outputs = 3 

learning_rate = 0.01

initializer = tf.contrib.layers.variance_scaling_initializer()

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) 

out_softmax = tf.nn.softmax(logits)

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

action = tf.multinomial(tf.log(3_actions), num_samples=1)

y = tf.to_float(action)

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

optimizer = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(xentropy)

gradients = [grad for grad, variable in grads_and_vars]

Teraz kwestia wykorzystania takiej sieci. Powiedzmy, że sieć została wyuczona z wykorzystaniem OpenAi gym, reaguje w miarę właściwie. Tworzę więc wektor danych wejściowych o rozmiarze [1, n_steps, n_inputs]. Oznacza to że na sieć podaję 2 n_inputs wiejść, każde w ilości n_steps w tył.
Czyli np. dwie przesunięte wobec siebie sinusoidy.

1.
W takim przypadku, X_batch_new posiada rozmiar tak jak wyżej napisałem - [1, n_steps, n_inputs].

action_val, gradients_val = sess.run([action, gradients], feed_dict={X: X_batch_new})

niestety pojawia się błąd:

2019-05-08 20:00:41.405955: F .\tensorflow/core/framework/tensor.h:657] Check failed: NDIMS == new_sizes.size() (2 vs. 1)

Process finished with exit code -1073740791 (0xC0000409)

2.
W przypadku, gdy używam X_batch_new o rozmiarze [2, n_steps, n_inputs] (w miejsce2 może być każda wartość większa od 1) nie pojawia się błąd.
Uzyskuję odpowiednio wektor 2-elementowy action_val. (lub w przypadku większych rozmiarów odpowiedni większy wektor action_val)

action_val, gradients_val = sess.run([action, gradients], feed_dict={X: X_batch_new})

Takiego działania się spodziewałem (przypadek 2). Jednak dlaczego dla przypadku 1. pojawia się tego typu błąd?
Niegdyś budowałem inną sieć rekurencyjną (jednak nie uczoną przez wzmacnianie a uczoną "z nauczycielem"), gdzie taki problem się nie pojawiał. Dla obu przypadków sieć działała prawidłowo.

Czy jest ktoś w stanie podpowiedzieć co robię źle?