Почему DQNAgent.подходит для добавления дополнительных измерений к моим входным данным?

#python #tensorflow #dqn #keras-rl

Вопрос:

Я использую один из агентов глубокого q-обучения Keras: DQNAgent. Когда я передаю свою среду в DQNAgent.fit, я получаю следующую ошибку:

 **3 dqn.fit(env, nb_steps=50000, visualize=False, verbose=1)**
 

/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training_utils_v1.py
в стандарте_input_data(данные, имена, фигуры, check_batch_axis,
exception_prefix)

 655                            ': expected '   names[i]   ' to have '  
656                            str(len(shape))   ' dimensions, but got array '
**657                            'with shape '   str(data_shape))**
658         if not check_batch_axis:
659           data_shape = data_shape[1:]
 

Ошибка значения: Ошибка при проверке ввода: ожидается, что dense_18_input будет иметь
2 измерения, но получил массив с формой (1, 1, 65)

Состояния и пространства моей среды определяются следующим образом:

 self.state = np.zeros(65, dtype=int)
self.action_space = spaces.Tuple((spaces.Discrete(64), spaces.Discrete(64)))
self.observation_space = spaces.Box(low=0, high=16, shape=(65,), dtype=np.int)
 

и я использую следующую модель:

 states = env.observation_space.shape
actions = 64**2
def build_model(states, actions):
    model = Sequential()    
    model.add(Dense(100, activation='relu', input_shape=states))
    model.add(Dense(200, activation='relu'))
    model.add(Dense(actions, activation='linear'))
    return model
 

Вектор состояния моей среды имеет форму (65,), но метод подгонки увеличивает его до (1, 1, 65), что приводит к несоответствию формы. Чтобы быть ясным, самосознание возвращается как наблюдение из окружающей среды. Кто — нибудь знает, почему это происходит?

Ответ №1:

Прежде всего, когда Вы указываете входные данные модели, Keras добавит еще одно измерение, потому что он ожидает пакет. Например:

 input_shape=(65,) --> (None, 65)
 

Итак, когда вы передаете одно наблюдение в свою модель, Керас предполагает batch_size=1 . По этой причине размер вашего ввода становится:

 (None, 65) --> (1,65)
 

Теперь, чтобы получить ввод с формой (1,1,65) , это означает, что Вы подали и наблюдали с размером batch_size (1,65) = (1,1,65) . Это означает, что по какой-то причине Ваше наблюдение транспонируется (изменяется), прежде чем фактически будет передано в сеть.

Вы проверили форму наблюдения, прежде чем передавать ее в сеть?