#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)
. Это означает, что по какой-то причине Ваше наблюдение транспонируется (изменяется), прежде чем фактически будет передано в сеть.
Вы проверили форму наблюдения, прежде чем передавать ее в сеть?