#python #tensorflow #keras #deep-learning
#python #тензорный поток #keras #глубокое обучение #tensorflow
Вопрос:
Я создаю сеть глубокого Q-обучения на основе LSTM с помощью Python, Keras и Tensorflow и столкнулся со следующей проблемой. После того, как я создал сеть с заданной формой batch_input_shape и пытаюсь подогнать сеть к данным этой формы, я получаю следующую ошибку:
ПРЕДУПРЕЖДЕНИЕ:tensorflow: Модель была сконструирована с использованием формы (64, 1, 10) для тензора ввода («lstm_34_input: 0», shape= (64, 1, 10), dtype = float32), но она была вызвана для ввода с несовместимой формой (32, 1, 10).
Я создал следующий игрушечный пример, чтобы просто продемонстрировать код, который вызывает проблему.
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.python.keras.layers import Flatten
from tensorflow.keras.layers import Dense, Dropout, LSTM
from tensorflow.keras.optimizers import Adam
# Hyperparameters
action_space = range(0, 10)
input_length = 10
batch_size = 64
timesteps = 1
learning_rate = 0.0001
# Create random input variables
state = np.random.randint(0, 100, size=(batch_size, timesteps, input_length))
target = np.random.randint(0, 100, size=(batch_size, len(action_space)))
# Build the model
model = Sequential()
model.add(LSTM(10, batch_input_shape=(batch_size, timesteps, input_length), return_sequences=True, activation="tanh",
recurrent_dropout=0, stateful=False))
model.add(LSTM(10, activation="tanh", return_sequences=True, recurrent_dropout=0, stateful=False))
model.add(Flatten())
model.add(Dense(len(action_space), activation="relu"))
model.compile(loss="mean_squared_error", optimizer=Adam(lr=learning_rate))
# Fit the model
model.fit(state, target, epochs=1, verbose=1)
Это создает ошибку, описанную выше.
Я понимаю, что входной слой должен ожидать получения пакета формы (64, 1, 10), и мы передаем ему эту форму. Однако входной слой, похоже, принимает форму (32, 1, 10). Мы можем проверить, что state.shape равен (64, 1, 10), как и ожидалось, поэтому на каком-то этапе происходит изменение формы этого ввода, или, возможно, ошибка относится к вводу в скрытый или выходной слой?
Буду признателен за любую помощь.
Обновление Я использую Tensorflow GPU версии 2.3.0 и Keras версии 2.3.1
Комментарии:
1. Я не могу воспроизвести это поведение с
'tf 2.1'
2. Спасибо, Николас, я обновил вопрос, включив в него тот факт, что я использую tf 2.3.0 и Keras 2.3.1. Я постараюсь повысить / понизить свои версии, чтобы посмотреть, прольет ли это какой-либо свет.
3. добавьте batch_size = batch_size в модель. подходит для простого исправления, но на самом деле вам не следует жестко кодировать размер пакета в вашей сети. Для формы ввода вы можете просто использовать input_shape=(time_steps, input_length) (или, если вы хотите использовать batch_input_shape (None, time_steps, input_length) или даже (None, Ни один, input_length))
4. Спасибо, Саймон. Ранее я использовал последнее, однако я исследовал использование statefulness, для которого, как я полагаю, требуется batch_size. Вскоре я попробую первое решение и посмотрю, решит ли оно проблему — спасибо, что взглянули
Ответ №1:
Для всех, кто пытается найти способ реализовать batch_input_shape
, чтобы использовать LSTM с сохранением состояния, ответ взят из комментария Саймона выше:
добавить
batch_size=batch_size
вmodel.fit
Вы также можете добавить его в model.predict()
для DQN.