使用tensorflow快速搭建 DQN环境

人工智能80

1建立网络


class AgentNet():
    def __init__(
            self,
            name,
            n_action,
            n_state,
            learning_rate=0.001,
            reward_decay=0.9,
            e_greedy=0.9,
            replace_target_iter=300,
            memory_size=50000,
            batch_size=32,
            e_greedy_increment=None
    ):
        self.n_action = n_action
        self.n_state = n_state
        self.alpha = learning_rate
        self.gamma = reward_decay
        self.epsilon_max = e_greedy
        self.replace_target_iter = replace_target_iter
        self.memory_size = memory_size
        self.batch_size = batch_size
        self.epsilon_increment = e_greedy_increment
        self.epsilon = 0 if e_greedy_increment is not None else self.epsilon_max
        self.name = name
        self.sess = sess
        self.build()

        self.learn_step_counter = 0
        self.memory = []
        self.losses = []

        '''复制网络'''
        t_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='target_net')
        e_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='eval_net')
        with tf.variable_scope('hard_replacement'):
            self.target_replace_op = [tf.assign(t, e) for t, e in zip(t_params, e_params)]


    def build(self,hidden_dim=64):
        with tf.variable_scope(self.name):
            self.s = tf.placeholder(tf.float32, [None, self.n_state], name='s')
            self.s_ = tf.placeholder(tf.float32, [None, self.n_state], name='s_')
            self.r = tf.placeholder(tf.float32, [None, ], name='r')
            self.a = tf.placeholder(tf.int32, [None, ], name='a')

            with tf.variable_scope("eval_net"):
                hidden = tf.layers.dense(self.s,hidden_dim,activation=tf.nn.relu)
                hidden = tf.layers.dense(hidden, hidden_dim, activation=tf.nn.relu)
                self.q_eval = tf.layers.dense(hidden,self.n_action)

            with tf.variable_scope("target_net"):
                hidden = tf.layers.dense(self.s_, hidden_dim, activation=tf.nn.relu)
                hidden = tf.layers.dense(hidden, hidden_dim, activation=tf.nn.relu)
                self.q_next = tf.layers.dense(hidden, self.n_action)

            with tf.variable_scope('q_target'):
                q_target = self.r + self.gamma * tf.reduce_max(self.q_next, axis=1, name='Qmax_s_')
                self.q_target = tf.stop_gradient(q_target)

            with tf.variable_scope("q_eval"):
                a_indices = tf.stack([tf.range(tf.shape(self.a)[0], dtype=tf.int32), self.a], axis=1)
                self.q_eval_wrt_a = tf.gather_nd(params=self.q_eval, indices=a_indices)

            with tf.variable_scope("loss"):
                    self.loss = tf.reduce_mean(tf.squared_difference(self.q_target, self.q_eval_wrt_a, name='TD_error'))
            with tf.variable_scope('train'):
                self._train_op = tf.train.RMSPropOptimizer(self.alpha).minimize(self.loss)

其含义是:

2 网络的使用

在与环境互动时采用

action = net.choose_action(obs)

选择动作,其中net.choose_action(state)函数是这么定义的:

 def choose_action(self,state):
       if np.random.random() > self.epsilon:
           action_chosen = np.random.randint(0, self.n_action)
       else:
           state = state[np.newaxis, :]
           actions_value = self.sess.run(self.q_eval, feed_dict={self.s: np.array(state)})
           action_chosen = np.argmax(actions_value)
       return action_chosen

按照贪心策略执行动作,当贪心时根据当前状态s运算得到q_eval,取最大值的动作返回

3 训练网络

Transition = collections.namedtuple("Transition", ["state", "action", "reward", "next_state"])
'''执行eposide次环境'''
if len(net.memory) > net.memory_size:
    net.memory.pop(0)
reward = reward if player=="agent_0" else -reward
net.memory.append(Transition(obs, action, reward, next_obs))

if len(net.memory) > net.batch_size * 4:
    batch_transition = random.sample(net.memory, net.batch_size)
    batch_state, batch_action, batch_reward, batch_next_state = map(np.array, zip(*batch_transition))
    loss = net.train(state=batch_state,
               reward=batch_reward,
               action=batch_action,
               state_next=batch_next_state,
               )
    update_iter += 1
    net.losses.append(loss)

首先,在每次执行完成后将{s,a,r,s_} 存入memory中,当积累到一定量之后,按批次提取memory并训练网络,net.train函数定义如下

    def train(self,state,reward,action,state_next):
        if self.learn_step_counter % self.replace_target_iter == 0:
            self.sess.run(self.target_replace_op)

        _,loss = self.sess.run([self._train_op,self.loss],
                               feed_dict={
                                   self.s:np.array(state),
                                   self.s_:np.array(state_next),
                                   self.a:np.array(action),
                                   self.r:np.array(reward)
                               })
        self.learn_step_counter += 1

        self.epsilon = self.epsilon + self.epsilon_increment if self.epsilon < self.epsilon_max else self.epsilon_max
        self.learn_step_counter += 1

        return loss

其中第一行是每隔多少步将eval_net的网络参数复制给target_net网络,其定义在类的init中.

self.sess.run()将收集到的(s,a,s_,r)传入tensorflow中,运行网络得到loss并更新了网络

其实就是建立一个网络,然后在每次执行action时调用网络,收集数据后训练网络,没了。
等我会用github时将函数传上去

Original: https://blog.csdn.net/qq_41751199/article/details/121900149
Author: 剑未佩妥已入江湖
Title: 使用tensorflow快速搭建 DQN环境



相关阅读1

Title: imdb_reviews电影评论数据集的神经网络

文章目录

如何录入信息

文字和图像不同
图像可以将对应的像素点的亮度值或者RGB值转换成张量,然后送入神经网络,但是文字又怎么办呢?
这就需要对文字进行词条化处理,也就是编码,将对应的单词,文字转换成词典中的一个数字,这样一段话,一篇文章就可以使用数字矩阵来表示了

载入数据

tensorflow-datasets中由我们需要的数据
需要pip install tensorflow-datasets

import tensorflow_datasets as tfds
imdb,info = tfds.load('imdb_reviews', with_info=True, as_supervised=True)

使用tensorflow快速搭建 DQN环境
imdb_reviews中由训练集核测试集

train_data, test_data = imdb['train'], imdb['test']
training_sentences = []
training_labels = []

testing_sentences = []
testing_labels = []
for s,l in train_data:
    training_sentences.append(str(s.numpy()))
    training_labels.append(l.numpy())
for s,l in test_data:
    testing_sentences.append(str(s.numpy()))
    testing_labels.append(l.numpy())

使用tensorflow快速搭建 DQN环境
神经网络要求输入向量,这里需要将label转换成向量

training_lable_final = np.array(training_labels)
testing_label_final = np.array(testing_labels)

使用tensorflow快速搭建 DQN环境

词条化处理

from tensorflow.keras.preprocessing.text import Tokenizer
num_words = 10000
oov_token = "##"
tokenizer = Tokenizer(num_words=num_words, oov_token=oov_token)
tokenizer.fit_on_texts(training_sentences)
word_dict = tokenizer.word_indx
print(word_dict)

使用tensorflow快速搭建 DQN环境

词条序列化

将句子中的单词按照word_dict中的数字转换成一个序列化矩阵
在此之前需要将句子序列化
词条的最大长度维120
默认在不满足长度时,在后面填充0

from tensorflow.keras.preprocessing.sequence import pad_sequences
max_length = 120
train_sequence = tokenizer.texts_to_sequence(training_sentences)
padded_train = pad_sequences(train_sequence, maxlen=max_length,truncate='post')

test_sequence = tokenizer.texts_to_sequence(testing_sentences)
padded_test = pad_sequences(test_sequence, maxlen=max_length, truncate='post')
print(padded_train)
print(padded_test)

使用tensorflow快速搭建 DQN环境

搭建神经网络

embedding_dim = 16
model = tf.keras.Sequential([
    tf.keras.layers.Embedding(input_dim=num_words,
                              output_dim=embedding_dim,
                              input_length=max_length,
                              name='embed-1'),
    tf.keras.layers.GlobalAveragePooling1D(name='globalave-1'),
    tf.keras.layers.Dense(6, activation='relu', name='fully-1'),
    tf.keras.layers.Dense(1, activation='sigmoid', name='sigmoid-1')
])
model.compile(loss=tf.losses.binary_crossentropy, optimizer=tf.optimizers.Adam(), metrics=['accuracy'])
model.summary()

使用tensorflow快速搭建 DQN环境

输入数据

model.fit(padded_train,training_lable_final, epochs=10, validation_data=(padded_test, testing_label_final))

使用tensorflow快速搭建 DQN环境

可视化

import io

e = model.layers[0]
weights = e.get_weights()[0]
print(weights.shape)

reverse_word_dict = dict([(value, key) for(key, value) in word_dict.items()])
out_v = io.open("E:/datasets/tmp/language-splite/vecs.tsv", 'w', encoding='utf8')
out_m = io.open("E:/datasets/tmp/language-splite/meta.tsv", 'w', encoding='utf8')
for word_num in range(1, vocab_size):
    word = reverse_word_dict[word_num]
    embeddings = weights[word_num]
    out_m.write(word + '\n')
    out_v.write('\t'.join([str(x) for x in embeddings]) + '\n')
out_m.close()
out_v.close()

这样访问projector.tensorflow.org然后再上传tsv文件就可以看到相应的词汇的分布了(外国网站,需要科学上网)
使用tensorflow快速搭建 DQN环境

Original: https://blog.csdn.net/m0_56104219/article/details/124543062
Author: 君子以阅川
Title: imdb_reviews电影评论数据集的神经网络

相关阅读2

Title: 激光slam课程学习笔记--第11课:3D激光SLAM介绍

前言:这系列笔记是学习曾书格老师的激光slam课程所得,这里分享只是个人理解,有误之处,望大佬们赐教。这节课主要介绍一些3d slam数学知识,以及典型代表loam。

1. 3d激光SLAM

1.1 介绍

使用tensorflow快速搭建 DQN环境
[在地图上,2d的是三个自由度的;3d的是六个自由度的;三维包含微分流形(多次的三个自由度导致的)(个人没理解)]

; 1.2 对比

使用tensorflow快速搭建 DQN环境

1.3 3d slam的帧间匹配--点到面距离方法

使用tensorflow快速搭建 DQN环境
[回环检测,本质也是帧间匹配]
[这里的目标函数表示的是点到面的距离]

; 1.4 帧间匹配算法--基于特征的方法

使用tensorflow快速搭建 DQN环境
[由于其采用的多线雷达,匹配时可类似采用图像的方式(基于特征方法)进行帧间匹配]

1.5 NDT方法

使用tensorflow快速搭建 DQN环境
[该方法和似然场方法类似][目标函数的每个方格是连续的]
[老师说,在领域中,公式是基础,但是最重要的是奇思妙想,因为公式是大家都是知道的,但是区别别人的,就是个人的奇思妙想]

; 2. LOAM

[介绍基本流程+代码]
[这里的loam方法,只有匹配,没有回环]

2.1 loam

[该方法没有做了回环的]
使用tensorflow快速搭建 DQN环境
[帧间匹配+单帧局部子图匹配]
[特征匹配方法,提取特征进行匹配;老师建议多种方法使用最好]

; 2.2 框架

使用tensorflow快速搭建 DQN环境

2.3 激光里程计模块

使用tensorflow快速搭建 DQN环境
[edge point 指的是两个面的交接处的点;planar point 指的是面上的点(非边界处)][两种点的划分,是根据曲率进行划分的,利用点的附近点进行曲率计算;曲率大的称为edge point,小的称为planar point]

[去除不稳定点,左侧图的b点是跟射线平行的,这种点会被剔除;右侧图的a点从一个角度看是edge point,从另外一个角度看,其又属于planar point,故直接剔除]

; 2.4 特征点匹配

使用tensorflow快速搭建 DQN环境
[注意当前的数据pk是不完整的]
使用tensorflow快速搭建 DQN环境
[点到线的距离][点到面的距离]

2.5 运动估计

使用tensorflow快速搭建 DQN环境
[位姿涉及线性插值]
使用tensorflow快速搭建 DQN环境

; 2.6 总结--里程计模块

使用tensorflow快速搭建 DQN环境

2.7 总结--激光建图模块

使用tensorflow快速搭建 DQN环境
[Qk,是去除畸变的完整sweep]

; 2.8 总结--直线匹配

使用tensorflow快速搭建 DQN环境

2.9 例子

使用tensorflow快速搭建 DQN环境
[帧间匹配+建图+定位+图优化--->激光slam算法,老师认为这些知识都讲解了,我们应该可以自己编写一个简单的激光slam算法(个人表示还不会,实在惭愧)]

[跑马观花,公式原理都没有理解,代码也没有理解]
该系列课程2022年正月初二晚上22:13结

图片版权归原作者所有
致谢曾老师的付出

不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈

Original: https://blog.csdn.net/qq_45701501/article/details/124368673
Author: 鸿_H
Title: 激光slam课程学习笔记--第11课:3D激光SLAM介绍

相关阅读3

Title: vite2 打包的时候vendor-xxx.js文件过大的解决方法

vite2是一个非常好用的工具,只是随着代码的增多,打包的时候 vendor-xxxxxx.js 文件也越来越大,这就郁闷了。

输出文件名字/static/vendor.9b5698e4.js 806.03kb / brotli: skipped (large chunk)

Some chunks are larger than 500kb after minification. Consider:

  • Using dynamic import() to code-split the application
  • Use build.rollupOptions.output.manualChunks to improve chunking: rollup.js
  • Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.

由于打包时有些依赖包体积过于庞大,提示你进行配置分割;

  module.exports = {
    build: {
      rollupOptions: {
          output:{
              manualChunks(id) {
                if (id.includes('node_modules')) {
                    return id.toString().split('node_modules/')[1].split('/')[0].toString();
                }
            }
          }
      }
    }
  }

尝试了一下,确实可以分成多个文件,但是问题又来了,分成的文件有大有小,大文件可以接受,但是一堆几k的小文件看着就烦了,于是又想了想,发现可以这样。

   build: {
      sourcemap: true,
      outDir: 'distp', //指定输出路径
      assetsDir: 'static/img/', // 指定生成静态资源的存放路径
      rollupOptions: {
        output: {
          manualChunks(id) {
            if (id.includes('node_modules')) {
              const arr = id.toString().split('node_modules/')[1].split('/')
              switch(arr[0]) {
                case '@kangc':
                case '@naturefw':
                case '@popperjs':
                case '@vue':
                case 'axios':
                case 'element-plus':
                  return '_' + arr[0]
                  break
                default :
                  return '__vendor'
                  break
              }
            }
          },
          chunkFileNames: 'static/js1/[name]-[hash].js',
          entryFileNames: 'static/js2/[name]-[hash].js',
          assetFileNames: 'static/[ext]/[name]-[hash].[ext]'
        },
        brotliSize: false, // 不统计
        target: 'esnext',
        minify: 'esbuild' // 混淆器,terser构建后文件体积更小
      }
    },

按照模块分开打包,大模块独立打包,小模块合并打包,这样就不会出现一大堆小文件了。

经过不断尝试发现,@kangc(@kangc/v-md-editor)也就是md的编辑器不能单独打包,会报错。
还有 axios 也不能单独打包,会报错。

 if (id.includes('node_modules')) {
              const arr = id.toString().split('node_modules/')[1].split('/')
              switch(arr[0]) {
                case '@naturefw': // 自然框架
                case '@popperjs':
                case '@vue':
                case 'element-plus': // UI 库
                case '@element-plus': // 图标
                  return '_' + arr[0]
                  break
                default :
                  return '__vendor'
                  break
              }
            }

这几个可以分开打包,其他的遇到再说。

Original: https://www.cnblogs.com/jyk/p/16029074.html
Author: 金色海洋(jyk)
Title: vite2 打包的时候vendor-xxx.js文件过大的解决方法