当前位置:   article > 正文

人工智能--深度强化模型_model.add(activation('relu'))

model.add(activation('relu'))

目录

一、学习目标

二、学习内容

三、学习过程

四、源码

五、学习产出


一、学习目标

  1. 理解深度强化模型的基本原理。
  2. 掌握利用深度强化模型训练网络的方法。

二、学习内容

  1. 利用深度强化模型的代码,改变网络结构和奖励策略,提高网络的平均得分。


三、学习过程

调整网络结构,全连接层的参数改为161616200次迭代,gamma=0.95,结果如下:

  全连接层的参数改为3232322000次迭代,gamma=0.95,结果如下:

  全连接层的参数改为6464642000次迭代,gamma=0.95,结果如下:

  全连接层的参数改为1281281282000次迭代,gamma=0.99,结果如下:

  全连接层的参数改为2562562562000次迭代,gamma=0.90,结果如下:


四、源码

  1. # 要先安装gym模块
  2. # pip install gym
  3. # pip install pyglet==1.2.4
  4. import random
  5. import numpy as np
  6. import matplotlib.pyplot as plt
  7. from keras.layers import Dense, Activation
  8. from keras.models import Sequential
  9. from keras import backend as K
  10. from collections import deque
  11. import gym
  12. '''
  13. bellman函数:
  14. target = reward + gamma * np.amax(model.predict(new_state)[0])
  15. Q(s,a) = r + gamma* max(Q(s',a'))
  16. 参数含义:
  17. s 代表当前的状态,a 代表当前状态所采取的行动,
  18. s’ 代表这个行动所引起的下一个状态,a’ 是这个新状态时采取的行动,
  19. r 代表采取这个行动所得到的奖励 reward,gamma是加权因子,
  20. 由公式可以看出 s,a 对的 Q 值等于 即时奖励 + 未来奖励* gamma。
  21. gamma决定了未来奖励的重要性有多大。
  22. 比如说,我们到了一个状态,它虽然离目标状态远了一些,但是却离游戏失败远了一些,
  23. 那这个状态的即时奖励就很小,但是未来奖励就很多。
  24. '''
  25. # In[0]: 小车载杆问题
  26. # 控制滑块左右移动,不让竖着的柱子掉下来
  27. # state:(位置x,x加速度, 角加速度, 偏移角度theta)
  28. # 小车的世界,就一条x轴,
  29. # 变量env.x_threshold里存放着小车坐标的最大值(=2.4),
  30. # 超过这个数值,世界结束
  31. # 每step()一次,就会奖励 1
  32. env = gym.make('CartPole-v1') #小车载杆模型
  33. state = env.reset()
  34. #env.render()
  35. #env.close()
  36. # In[1]:
  37. # 0或1 表示让小车向 左或右 移动
  38. action = 0
  39. # env.step(action)表示给环境发送命令
  40. new_state, reward, done , info = env.step(action)
  41. print((new_state, reward, done, info))
  42. new_state, reward, done , info = env.step(action)
  43. print((new_state, reward, done, info))
  44. new_state, reward, done , info = env.step(action)
  45. print((new_state, reward, done, info))
  46. # In[2]:
  47. def random_actions_game(episodes):
  48. for episode in range(episodes):
  49. env.reset()
  50. score = 0
  51. done = False
  52. while not done:
  53. #随机向环境发生命令
  54. action = random.choice([0, 1])
  55. new_state, reward, done, info = env.step(action)
  56. score += 1
  57. print('Episode: {} score: {}'.format(episode + 1, score))
  58. random_actions_game(10)
  59. # In[3]: 构建网络,预测当前状态下每个action的获得的奖励
  60. # states=4, actions=2
  61. def agent(states, actions):
  62. model = Sequential()
  63. model.add(Dense(256, input_dim = states))
  64. model.add(Activation('relu'))
  65. model.add(Dense(256))
  66. model.add(Activation('relu'))
  67. model.add(Dense(256))
  68. model.add(Activation('relu'))
  69. #网络最后输出两种结果,分别对应在当前状态下采取两种行动时所得最终回报
  70. model.add(Dense(actions))
  71. model.add(Activation('linear'))
  72. return model
  73. # In[4]: epsilon随机贪婪算法选择行动
  74. '''
  75. 根据epsilon贪婪算法,对于给定epsilon,在[0,1]内构造一个随机数,
  76. 如果随机数的值比epsilon小,那么我们随机在两种行动中选择一种,
  77. 如果比episilon大,我们让网络来决定当前状态
  78. '''
  79. def agent_action(model, epsilon, state, actions):
  80. if np.random.rand() <= epsilon:
  81. #随机在两种行动中选一种
  82. act = random.randrange(actions)
  83. else:
  84. act = np.argmax(model.predict(state)[0])
  85. return act
  86. # In[5]: 画图函数,训练结果显示
  87. def performance_plot(scores, target_score):
  88. scores_arr = np.array(scores)
  89. scores_arr[np.where(scores_arr > target_score)] = target_score
  90. plt.figure(figsize = (20, 5))
  91. plt.title('Plot of Score v/s Episode')
  92. plt.xlabel('Episodes')
  93. plt.ylabel('Scores')
  94. plt.plot(scores_arr)
  95. plt.show()
  96. # In[6]:
  97. '''
  98. 将状态点,行动,环境反馈,下一个状态点等信息存储在队列里,
  99. 输入网络,让网络识别如何在给定状态的中选择合适的行动
  100. '''
  101. def replay_back(epsilon, gamma, epislon_min, epsilon_decay, model, training_data,
  102. batch_size = 64):
  103. idx = random.sample(range(len(training_data)), min(len(training_data), batch_size))
  104. train_batch = [training_data[j] for j in idx]
  105. for state, new_state, reward, done, action in train_batch:
  106. target = reward
  107. '''
  108. 在当前状态(state)采取给定行动(action),进入下一个状态(next_state),
  109. 如果next_state不是终止状态,那意味着在在当前状态state采取给定行动action是正确的,
  110. 于是我们根据Bellman函数迭代更新当前状态采取给定行动后的回报,然后训练网络识别状态点,行动
  111. 以及回报之间存在的关系,然后根据这种训练后的能力去识别新状态点在采取不同行动后的回报
  112. '''
  113. if not done:
  114. # bellman函数迭代状态点执行给定行动后的回报
  115. target = reward + gamma * np.amax(model.predict(new_state)[0])
  116. target_f = model.predict(state)
  117. #修正网络在给定状态下对给定行动后回报的预测
  118. target_f[0][action] = target
  119. #让网络重新识别给定状态采取给定行动后所得回报间的联系
  120. model.fit(state, target_f, epochs = 1, verbose = 0)
  121. if epsilon > epsilon_min:
  122. #不断缩小epsilon的值,这样在agent_action中会更多的让网络做出决策
  123. epsilon *= epsilon_decay
  124. return epsilon
  125. # In[35]: 运行程序
  126. # 参数设置
  127. gamma = 0.90
  128. epsilon = 1.0
  129. epsilon_min = 0.01
  130. epsilon_decay = 0.99
  131. deque_len = 20000 # 训练集的样本数
  132. #我们的目标是训练网络能在一个episode中获得200分
  133. target_score = 200
  134. episodes = 2000 #2000,已改为2000
  135. batch_size = 64
  136. optimizer = 'adam'
  137. loss = 'mse'
  138. env = gym.make('CartPole-v1')
  139. seed_val = 456
  140. np.random.seed(seed_val)
  141. env.seed(seed_val)
  142. random.seed(seed_val)
  143. states = env.observation_space.shape[0]
  144. actions = env.action_space.n
  145. training_data = deque(maxlen=deque_len)
  146. if (1):
  147. print('---training---')
  148. K.clear_session()
  149. scores = []
  150. model = agent(states, actions)
  151. model.compile(loss = loss, optimizer = optimizer)
  152. for episode in range(1, episodes + 1):
  153. state = env.reset()
  154. #转换成1*4向量
  155. state = state.reshape(1, states)
  156. done = False
  157. time_step = 0
  158. while not done:
  159. #使用贪婪算法获得行动类型
  160. action = agent_action(model, epsilon, state, actions)
  161. new_state, reward, done, info = env.step(action)
  162. '''
  163. 如果当前行动导致的下个状态是终止状态,它对应的回报要对应负值
  164. '''
  165. reward = reward if not done else -10
  166. new_state = new_state.reshape(1, states)
  167. # 把状态转换信息存储起来用于训练网络
  168. # 当前状态,新状态,奖励,游戏是否结束,行动
  169. training_data.append((state, new_state, reward, done, action))
  170. state = new_state
  171. time_step += 1 # 当前网络下,走了多少步游戏终止,即获得的积分
  172. # 用所有的状态转换信息去训练网络
  173. epsilon = replay_back(epsilon, gamma, epsilon_min, epsilon_decay, model, training_data)
  174. scores.append(time_step)
  175. if episode % 100 == 0:
  176. print('episod {}, socre {}, epsilon {:4}'.format(episode, time_step,
  177. epsilon))
  178. print('Avg Score over last 100 epochs: ', sum(scores[-100:])/100)
  179. if sum(scores[-100: ])/100 > target_score:
  180. print('----Goal Achived After {} Episodes------'.format(episode))
  181. performance_plot(scores, target_score)
  182. break
  183. model.save('CartPole.h5')

源码下载


五、学习产出

  1. 只调整了网络结构的参数,显然迭代次数越多,网络结构中全连接层的参数为256的强化模型的平均得分会更高。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/347002
推荐阅读
相关标签
  

闽ICP备14008679号