# actor-critic代码逐行解析（tensorflow版）

## 深度强化学习算法actor-critic代码逐行解析（tensorflow版）

Critic网络继承了Q-learning 的传统，依然可以逐步更新。

[En]

There is nothing to say about importing the required packages first.

import numpy as np
import tensorflow as tf
import gym
import matplotlib.pyplot as plt

np.random.seed(2)
tf.set_random_seed(2)

OUTPUT_GRAPH = False
MAX_EPISODE = 5
DISPLAY_REWARD_THRESHOLD = 200
MAX_EP_STEPS = 500
RENDER = False
GAMMA = 0.9
LR_A = 0.001
LR_C = 0.01

env = gym.make('CartPole-v0')
env.seed(1)
env = env.unwrapped

N_F = env.observation_space.shape[0]
N_A = env.action_space.n


Actor网络

class Actor(object):
def __init__(self, sess, n_features, n_actions, lr=0.001):
self.sess = sess

self.s = tf.placeholder(tf.float32, [1, n_features], "state")
self.a = tf.placeholder(tf.int32, None, "act")
self.td_error = tf.placeholder(tf.float32, None, "td_error")

with tf.variable_scope('Actor'):
l1 = tf.layers.dense(
inputs=self.s,
units=20,
activation=tf.nn.relu,
kernel_initializer=tf.random_normal_initializer(0., .1),
bias_initializer=tf.constant_initializer(0.1),
name='l1'
)

self.acts_prob = tf.layers.dense(
inputs=l1,
units=n_actions,
activation=tf.nn.softmax,
kernel_initializer=tf.random_normal_initializer(0., .1),
bias_initializer=tf.constant_initializer(0.1),
name='acts_prob'
)

with tf.variable_scope('exp_v'):
log_prob = tf.log(self.acts_prob[0, self.a])
self.exp_v = tf.reduce_mean(log_prob * self.td_error)

with tf.variable_scope('train'):

def learn(self, s, a, td):
s = s[np.newaxis, :]
feed_dict = {self.s: s, self.a: a, self.td_error: td}
_, exp_v = self.sess.run([self.train_op, self.exp_v], feed_dict)
return exp_v

def choose_action(self, s):
s = s[np.newaxis, :]
probs = self.sess.run(self.acts_prob, {self.s: s})
return np.random.choice(np.arange(probs.shape[1]), p=probs.ravel())


1、两个全连接层网络，一层神经元的个数为20个，第二层的输入是第一层l1的输出。
3、训练步骤。喂入动作，状态。和td误差即可。
4、选择动作.

Critic网络

[En]

Enter the discount reward for the current status, current award, and next status:

class Critic(object):
def __init__(self, sess, n_features, lr=0.01):
self.sess = sess

self.s = tf.placeholder(tf.float32, [1, n_features], "state")
self.v_ = tf.placeholder(tf.float32, [1, 1], "v_next")
self.r = tf.placeholder(tf.float32, None, 'r')

with tf.variable_scope('Critic'):
l1 = tf.layers.dense(
inputs=self.s,
units=20,
activation=tf.nn.relu,

kernel_initializer=tf.random_normal_initializer(0., .1),
bias_initializer=tf.constant_initializer(0.1),
name='l1'
)

self.v = tf.layers.dense(
inputs=l1,
units=1,
activation=None,
kernel_initializer=tf.random_normal_initializer(0., .1),
bias_initializer=tf.constant_initializer(0.1),
name='V'
)

with tf.variable_scope('squared_TD_error'):
self.td_error = self.r + GAMMA * self.v_ - self.v
self.loss = tf.square(self.td_error)
with tf.variable_scope('train'):

def learn(self, s, r, s_):
s, s_ = s[np.newaxis, :], s_[np.newaxis, :]

v_ = self.sess.run(self.v, {self.s: s_})
td_error, _ = self.sess.run([self.td_error, self.train_op],
{self.s: s, self.v_: v_, self.r: r})
return td_error



1、两个全连接层网络，一层神经元的个数为20个，第二层的输入是第一层l1的输出。可以发现这个输出只有一维度。就是a做这个动作的奖励。
2、loss：时间差分值的平方（取出下一时刻的动作的奖励）
.

sess = tf.Session()
actor = Actor(sess, n_features=N_F, n_actions=N_A, lr=LR_A)
critic = Critic(sess, n_features=N_F, lr=LR_C)
sess.run(tf.global_variables_initializer())

if OUTPUT_GRAPH:
tf.summary.FileWriter("logs/", sess.graph)
track_r = []

for i_episode in range(MAX_EPISODE):
s = env.reset()
t = 0

while True:
if RENDER: env.render()
a = actor.choose_action(s)
s_, r, done, info = env.step(a)
if done: r = -20

track_r.append(r)
td_error = critic.learn(s, r, s_)
actor.learn(s, a, td_error)
s = s_
t += 1

if done or t >= MAX_EP_STEPS:

ep_rs_sum = sum(track_r)
if 'running_reward' not in globals():
running_reward = ep_rs_sum
else:
running_reward = running_reward * 0.95 + ep_rs_sum * 0.05
if running_reward > DISPLAY_REWARD_THRESHOLD: RENDER = True
print("episode:", i_episode, "  reward:", int(running_reward))
break



Original: https://blog.csdn.net/u014136435/article/details/123585523
Author: Blackquiten
Title: actor-critic代码逐行解析（tensorflow版）

(0)

### 大家都在看

• #### K近邻算法

一、K近邻算法简介 1.某种距离计算概念 2.彼此接近的点具有相似的性质 即对于一个新样本，算法在已有数据中寻找与它最相似的K个数据，或者说”离它最近”的K…

人工智能 2023年7月3日
0133
• #### Linux安装Anaconda教程

1. 首先上Linux官网下载最新 对应版本 的Anaconda安装包 链接: Anaconda官网下载 2. 因为我们是在Linux系统下安装Anaconda，所以选择Linux…

人工智能 2023年7月29日
0139
• #### tensor与numpy的相互转换

tensor与numpy的相互转换 * – + 1. numpy转tensor + * 命令1：torch.tensor() * 命令2：torch.as_tensor…

人工智能 2023年7月20日
0111
• #### 使用Pytorch框架自己制作做数据集进行图像分类（三）

第三章： Pytorch框架构建DenseNet神经网络 第一章： Pytorch框架制作自己的数据集实现图像分类第二章： Pytorch框架构建残差神经网络(ResNet)第三章…

人工智能 2023年7月1日
0148
• #### python 金融知识图谱_从零搭建金融证券知识图谱-Part1

引言 前年，无意中发现 Python 中金融数据包 TUSHARE 当时就萌生想要搭建一个金融证券图谱的想法。 疫情期间隔离在家，就一鼓作气把它完成了，为避免过于冗长，打算用四篇文…

人工智能 2023年6月10日
0168
• #### 如何使用labelme标注语义分割数据集，最详细的深度学习打标签教程

环境window10 + python3.7 +anaconda3 如果没有安装anaconda3，可以跟着 anaconda安装配置教程 安装一下，深度学习必备工具。 一、安装 …

人工智能 2023年7月9日
0212
• #### 交通流预测爬坑记（一）：交通流数据集，原始数据

目录 主要数据类型 * 个人出行数据，轨迹数据 高速公路观察点数据集 其他 出行数据集 高速公路数据集 其他 赠人玫瑰 如今网上有非常多的数据集，在CSDN，知乎什么搜一下可以找到…

人工智能 2023年6月15日
0157
• #### [[概率论与数理统计-2]：随机函数、概率、概率函数、概率分布函数

作者主页(文火冰糖的硅基工坊)：文火冰糖（王文兵）的博客_文火冰糖的硅基工坊_CSDN博客 本文网址：https://blog.csdn.net/HiWangWenBing/art…

人工智能 2023年7月2日
0186
• #### middles在python中什么意思_在Python中解析大型RDF

如果您正在寻找快速性能，那么我建议您将Raptor与Redland Python Bindings一起使用。用C语言编写的Raptor的性能比RDFLib好得多。如果您不想处理C，…

人工智能 2023年6月10日
0207
• #### 【LeetCode】647. 回文子串

题目描述 给你一个字符串 s ，请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是 正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同…

人工智能 2023年6月27日
0127
• #### 5个例子介绍Pandas的merge并对比SQL中join

本文的重点是在合并和连接操作方面比较Pandas和SQL。Pandas是一个用于Python的数据分析和操作库。SQL是一种用于管理关系数据库中的数据的编程语言。两者都使用带标签的…

人工智能 2023年7月8日
0144
• #### 使用keras快速搭建深度神经网络实现鸢尾花分类（深度神经网络快速搭建入门）

文章目录 * – + * 背景介绍 * 搭建步骤 * – 一、导入Keras模型库，创建模型对象，构建网络 – Keras对象实例 &#8211…

人工智能 2023年7月2日
0139
• #### （环境配置）TDD-net

本文为PCB缺陷检测论文TDD-net源码配置的步骤记录 paper：https://ietresearch.onlinelibrary.wiley.com/doi/10.1049…

人工智能 2023年5月24日
0133
• #### HCIA VLAN间通信 多臂路由与单臂路由

一、 前言 前面我们讲过交换机VLAN的HYBRID模式可实现跨VLAN通信，但必须是同网段的IP，在讲路由器原理的时候说过路由器可以隔离广播域并将不同网段连在一起实现通信。很明显…

人工智能 2023年6月27日
0140
• #### 博客反抄袭工作的一些思考和尝试

近日开始着手反抄袭工作，做了一些思考和尝试。 现状与动机 目前看，比较明显，容易判定的抄袭行为，主要包括: 直接完整复制，虽然容易被识破，但是因为成本低，甚至有些抄袭者使用 爬虫进…

人工智能 2023年5月30日
0147
• #### 如何处理数据的缺失值和异常值

问题描述 在数据分析和机器学习任务中，经常会遇到数据中存在缺失值和异常值的情况。缺失值指的是一些变量在某些样本/观测中没有被观测到或者获取到值的情况，而异常值则是指与其他值明显不同…

人工智能 2023年12月31日
0141