100x100阵列的慢keras拟合方法,我怎样才能让它更快?

数据挖掘 Python 神经网络 喀拉斯 张量流 强化学习
2022-02-28 22:22:58

我怎样才能使这种培训更快?当我在 100 x 100 矩阵上调用 fit 方法时,速度非常慢

我的模型是顺序的

h = self.model.fit(
        inputs,
        targets,
        epochs=epochs,
        batch_size=16,
        verbose=1,
)

这是我的矩阵

def build(n):
    mat=np.ones(N*N)
    return mat.reshape((N,N))

这是我的 Qtraining

qt = Qtraining(model,
               env,
               n_epoch=200,
               max_memory=500,
               data_size=100,
               name='model100')

这是体验方法

def get_data(self, data_size=10):
        env_size = self.memory[0][0].shape[1]  # env_state 1d size (1st element of episode)
        mem_size = len(self.memory)
        data_size = min(mem_size, data_size)
        inputs = np.zeros((data_size, env_size)) # metti Nsize righe di 0 , e envSize elementi 0
        targets = np.zeros((data_size, self.num_actions))#
        for i, j in enumerate(np.random.choice(range(mem_size), data_size, replace=False)):
            env_state, action, reward, next_env_state, game_over = self.memory[j]
            inputs[i] = env_state
            # There should be no target values for actions not taken.
            # Thou shalt not correct actions not taken #deep (quote by Eder Santana)
            targets[i] = self.predict(env_state)
            # Q_sa = derived policy = max quality env/action = max_a' Q(s', a')
            Q_sa = np.max(self.predict(next_env_state))
            if game_over:
                targets[i, action] = reward
            else:
                # reward + gamma * max_a' Q(s', a')
                targets[i, action] = reward + self.discount * Q_sa
       
        return inputs, targets

使用 50 x 50 矩阵,我得到 2500 个单元,在构建神经网络时,我有一个 2500x2500 参数 + 2500,总共 6252500。我认为这会减慢操作速度。并且只有 3 个 Danse 层,最后一个是 size 4,因为可能的动作是 4。是否可以通过添加更多的 Danse 层来减少操作时间?

这是我的模型

def build_model(env, **opt):
loss = opt.get('loss', 'mse')
a = opt.get('alpha', 0.24)
model = Sequential()
esize = env.maze.size
model.add(Dense(esize, input_shape=(esize,)))
model.add(LeakyReLU(alpha=a))
model.add(Dense(esize))
model.add(LeakyReLU(alpha=a))
model.add(Dense(num_actions))
model.compile(optimizer='adam', loss='mse')
return model
2个回答

有几种方法可以加速你的代码:

  • 使用现有框架。看来您正在做强化学习 (RL)。keras-rl是一个现有的 RL 框架,它可能比您的代码更有效。
  • 始终将所有内容都保存在计算机内存中。它将加速您的代码以定义更小的游戏内存重播缓冲区,并且仅使用当前相关的环境子集。

您可以使用 TensorFlow GPU 模块。Keras 建立在 TensorFlow 之上,它有很大帮助。它很难安装,但我可以帮助你。总共我得到了 40 倍的加速: https ://www.tensorflow.org/install/gpu

视频:https : //www.youtube.com/watch? v=IubEtS2JAiY 或 https://www.youtube.com/watch?v=hHWkvEcDBO0