将 lstm 单元添加到神经网络以进行强化学习
Add lstm cell to neural network for reinforcement learning
我刚开始学习神经网络和人工智能。对于我的大学项目,我试图让代理人驾驶汽车驶向放置在飞机上随机位置的目标。这是我的模型代码:
def CreateModel(self):
model = Sequential()
model.add(Conv2D(40, kernel_size=(7, 9), strides=(1, 1), input_shape=self.input_shape, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(70, kernel_size=(5, 5), strides=(1, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(90, kernel_size=(4, 5), strides=(1, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(768))
model.add(Activation('relu'))
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dense(5))
model.add(Activation('softmax'))
model.compile(loss="mean_squared_error", optimizer=keras.optimizers.Adam(lr=self.learning_rate))
return model
def __init__(self, load='', epsilon=0.8):
self.input_shape = (90,120,3)
# Training hyperparameters
self.gamma = 0.99
self.epsilon = epsilon
self.epsilon_min = 0.3
self.epsilon_decay = 0.9998
self.learning_rate = 0.001
self.tau = 0.05
self.memory_size = 2000
self.memory = deque(maxlen=self.memory_size)
if (load != ''):
print('|| ------------ Init model load: {0}'.format(load))
self.model = load_model(load)
self.target_model = load_model(load)
else:
print('|| ------------ No load. Initializing')
self.model = self.CreateModel()
self.target_model = self.CreateModel()
def Act(self, state):
self.epsilon *= self.epsilon_decay
self.epsilon = max(self.epsilon_min, self.epsilon)
print("|| ---- Epsilon: {0}".format(self.epsilon))
if np.random.random() < self.epsilon:
return np.random.randint(low=0,high=5)
return (self.model.predict(state)).argmax(axis=1)[0]
它采用单个 120 x 90 3 通道图像作为输入,并输出 Q 值向量,用于根据图像可以采取的 5 种可能操作。我阅读了这篇研究论文 (https://link.springer.com/content/pdf/10.1007%2Fs00521-017-3241-z.pdf) 并以此为基础对我的网络进行了建模。我已经训练了一段时间,但结果令人失望。
我想合并一个 LSTM 单元来处理 10 个连续帧而不是 1 个连续帧的序列,并为每个序列输出相同的单个 5 元素数组。我试图理解 Keras LSTM 和 TimeDistributed 层,但无法理解如何对我的模型进行相应的更改。请帮助我或将我引导至以新手方式解决此主题的页面?
现在您的输入形状应该是 (1,120, 90, 3),其中 1 指的是 batch_size。
对于包含 5 张图片的时间序列,您需要一个新的批量大小:(1, 10, 120, 90, 3)。这是一个 5D 张量。
虽然在你可以尝试这一层之前我从未尝试过这个:https://keras.io/layers/recurrent/#convlstm2d
这接受 5D 张量并输出典型的 4D 张量。有了这个输出,你就可以像以前一样简单地恢复卷积和池化。
如果您想使用多个 convlstm2d 层,您必须在除最后一个 conv2lstm 层之外的所有层中设置 return_sequences=True。
我刚开始学习神经网络和人工智能。对于我的大学项目,我试图让代理人驾驶汽车驶向放置在飞机上随机位置的目标。这是我的模型代码:
def CreateModel(self):
model = Sequential()
model.add(Conv2D(40, kernel_size=(7, 9), strides=(1, 1), input_shape=self.input_shape, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(70, kernel_size=(5, 5), strides=(1, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(90, kernel_size=(4, 5), strides=(1, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(768))
model.add(Activation('relu'))
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dense(5))
model.add(Activation('softmax'))
model.compile(loss="mean_squared_error", optimizer=keras.optimizers.Adam(lr=self.learning_rate))
return model
def __init__(self, load='', epsilon=0.8):
self.input_shape = (90,120,3)
# Training hyperparameters
self.gamma = 0.99
self.epsilon = epsilon
self.epsilon_min = 0.3
self.epsilon_decay = 0.9998
self.learning_rate = 0.001
self.tau = 0.05
self.memory_size = 2000
self.memory = deque(maxlen=self.memory_size)
if (load != ''):
print('|| ------------ Init model load: {0}'.format(load))
self.model = load_model(load)
self.target_model = load_model(load)
else:
print('|| ------------ No load. Initializing')
self.model = self.CreateModel()
self.target_model = self.CreateModel()
def Act(self, state):
self.epsilon *= self.epsilon_decay
self.epsilon = max(self.epsilon_min, self.epsilon)
print("|| ---- Epsilon: {0}".format(self.epsilon))
if np.random.random() < self.epsilon:
return np.random.randint(low=0,high=5)
return (self.model.predict(state)).argmax(axis=1)[0]
它采用单个 120 x 90 3 通道图像作为输入,并输出 Q 值向量,用于根据图像可以采取的 5 种可能操作。我阅读了这篇研究论文 (https://link.springer.com/content/pdf/10.1007%2Fs00521-017-3241-z.pdf) 并以此为基础对我的网络进行了建模。我已经训练了一段时间,但结果令人失望。 我想合并一个 LSTM 单元来处理 10 个连续帧而不是 1 个连续帧的序列,并为每个序列输出相同的单个 5 元素数组。我试图理解 Keras LSTM 和 TimeDistributed 层,但无法理解如何对我的模型进行相应的更改。请帮助我或将我引导至以新手方式解决此主题的页面?
现在您的输入形状应该是 (1,120, 90, 3),其中 1 指的是 batch_size。 对于包含 5 张图片的时间序列,您需要一个新的批量大小:(1, 10, 120, 90, 3)。这是一个 5D 张量。 虽然在你可以尝试这一层之前我从未尝试过这个:https://keras.io/layers/recurrent/#convlstm2d 这接受 5D 张量并输出典型的 4D 张量。有了这个输出,你就可以像以前一样简单地恢复卷积和池化。
如果您想使用多个 convlstm2d 层,您必须在除最后一个 conv2lstm 层之外的所有层中设置 return_sequences=True。