我刚开始学习神经网络和人工智能。我的大学项目是尝试让一个智能体驾驶汽车朝向在一个平面上随机放置的目标。这是我的模型代码:
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 modeldef __init__(self, load='', epsilon=0.8): self.input_shape = (90,120,3) # 训练超参数 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('|| ------------ 初始化模型加载: {0}'.format(load)) self.model = load_model(load) self.target_model = load_model(load) else: print('|| ------------ 无加载。正在初始化') 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的三通道图像作为输入,并输出一个基于图像可以采取的5个可能动作的Q值向量。我阅读了这篇研究论文(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张图片的时间序列,你需要一个新的batch size: (1, 10, 120, 90, 3)。这是一个5D张量。虽然我之前从未尝试过,你可以尝试这个层: https://keras.io/layers/recurrent/#convlstm2d它接受5D张量并输出典型的4D张量。有了这个输出,你可以简单地继续像之前一样进行卷积和池化操作。
如果你想使用多个convlstm2d层,你需要在除了最后一个conv2lstm层之外的所有层中设置return_sequences=True。