TF之RNN:实现利用scope.reuse_variables()告诉TF想重复利用RNN的参数的案例-阿里云开发者社区

开发者社区> 一个处女座的程序猿> 正文

TF之RNN:实现利用scope.reuse_variables()告诉TF想重复利用RNN的参数的案例

简介: TF之RNN:实现利用scope.reuse_variables()告诉TF想重复利用RNN的参数的案例
+关注继续查看

输出结果

后期更新


代码设计

import tensorflow as tf

# 22 scope (name_scope/variable_scope)

from __future__ import print_function

class TrainConfig:

   batch_size = 20

   time_steps = 20

   input_size = 10

   output_size = 2

   cell_size = 11

   learning_rate = 0.01

class TestConfig(TrainConfig):

   time_steps = 1

class RNN(object):

   def __init__(self, config):

       self._batch_size = config.batch_size

       self._time_steps = config.time_steps

       self._input_size = config.input_size

       self._output_size = config.output_size

       self._cell_size = config.cell_size

       self._lr = config.learning_rate

       self._built_RNN()

   def _built_RNN(self):

       with tf.variable_scope('inputs'):

           self._xs = tf.placeholder(tf.float32, [self._batch_size, self._time_steps, self._input_size], name='xs')

           self._ys = tf.placeholder(tf.float32, [self._batch_size, self._time_steps, self._output_size], name='ys')

       with tf.name_scope('RNN'):

           with tf.variable_scope('input_layer'):

               l_in_x = tf.reshape(self._xs, [-1, self._input_size], name='2_2D')  # (batch*n_step, in_size)

               # Ws (in_size, cell_size)

               Wi = self._weight_variable([self._input_size, self._cell_size])

               print(Wi.name)

               # bs (cell_size, )

               bi = self._bias_variable([self._cell_size, ])

               # l_in_y = (batch * n_steps, cell_size)

               with tf.name_scope('Wx_plus_b'):

                   l_in_y = tf.matmul(l_in_x, Wi) + bi

               l_in_y = tf.reshape(l_in_y, [-1, self._time_steps, self._cell_size], name='2_3D')

           with tf.variable_scope('cell'):

               cell = tf.contrib.rnn.BasicLSTMCell(self._cell_size)

               with tf.name_scope('initial_state'):

                   self._cell_initial_state = cell.zero_state(self._batch_size, dtype=tf.float32)

               self.cell_outputs = []

               cell_state = self._cell_initial_state

               for t in range(self._time_steps):

                   if t > 0: tf.get_variable_scope().reuse_variables()

                   cell_output, cell_state = cell(l_in_y[:, t, :], cell_state)

                   self.cell_outputs.append(cell_output)

               self._cell_final_state = cell_state

           with tf.variable_scope('output_layer'):

               # cell_outputs_reshaped (BATCH*TIME_STEP, CELL_SIZE)

               cell_outputs_reshaped = tf.reshape(tf.concat(self.cell_outputs, 1), [-1, self._cell_size])

               Wo = self._weight_variable((self._cell_size, self._output_size))

               bo = self._bias_variable((self._output_size,))

               product = tf.matmul(cell_outputs_reshaped, Wo) + bo

               # _pred shape (batch*time_step, output_size)

               self._pred = tf.nn.relu(product)    # for displacement

       with tf.name_scope('cost'):

           _pred = tf.reshape(self._pred, [self._batch_size, self._time_steps, self._output_size])

           mse = self.ms_error(_pred, self._ys)

           mse_ave_across_batch = tf.reduce_mean(mse, 0)

           mse_sum_across_time = tf.reduce_sum(mse_ave_across_batch, 0)

           self._cost = mse_sum_across_time

           self._cost_ave_time = self._cost / self._time_steps

       with tf.variable_scope('trian'):

           self._lr = tf.convert_to_tensor(self._lr)

           self.train_op = tf.train.AdamOptimizer(self._lr).minimize(self._cost)

   @staticmethod

   def ms_error(y_target, y_pre):

       return tf.square(tf.subtract(y_target, y_pre))

   @staticmethod

   def _weight_variable(shape, name='weights'):

       initializer = tf.random_normal_initializer(mean=0., stddev=0.5, )

       return tf.get_variable(shape=shape, initializer=initializer, name=name)

   @staticmethod

   def _bias_variable(shape, name='biases'):

       initializer = tf.constant_initializer(0.1)

       return tf.get_variable(name=name, shape=shape, initializer=initializer)

if __name__ == '__main__':

   train_config = TrainConfig()  #定义train_config

   test_config = TestConfig()

#     # the wrong method to reuse parameters in train rnn

#     with tf.variable_scope('train_rnn'):

#         train_rnn1 = RNN(train_config)

#     with tf.variable_scope('test_rnn'):

#         test_rnn1 = RNN(test_config)

   # the right method to reuse parameters in train rnn

   #目的使train的RNN调用参数,然后利用variable_scope方法共享RNN,让test的RNN再次调用一样的参数,

   with tf.variable_scope('rnn') as scope:

       sess = tf.Session()

       train_rnn2 = RNN(train_config)

       scope.reuse_variables()        #告诉TF想重复利用RNN的参数

       test_rnn2 = RNN(test_config)

       # tf.initialize_all_variables() no long valid from

       # 2017-03-02 if using tensorflow >= 0.12

       if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:

           init = tf.initialize_all_variables()

       else:

           init = tf.global_variables_initializer()

       sess.run(init)


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
程序员如何高效学好数据结构与算法?
  主题:   1. 为什么要学数据结构   2. 数据结构学习秘籍   3. 算法为什么那么难   4. 算法学习秘籍   5. 如何打开数据结构与算法这两扇门   随着科学技术的发展,人工智能已渗透到各个行业,算法工程师非常火 爆,急缺大量人才,年薪也越来越高。刚毕业30-40万很常见。很多人想入手 学习算法,那么多算法,究竟该如何下手呢?   很多人看到招聘要求,算法工程师有很多具体分支:
3 0
在阿里云 ECS 上试图安装 SAP Commerce Cloud 的 137 错误
在阿里云 ECS 上试图安装 SAP Commerce Cloud 的 137 错误
5 0
SAP ABAP和Hybris的源代码生成工具
SAP ABAP和Hybris的源代码生成工具
4 0
非常有意思的几个库
非常有意思的几个库
6 0
推荐一个免费的论文查询,检索和查重网站
推荐一个免费的论文查询,检索和查重网站
5 0
一个传入自定义 user.properties 文件生成 jMeter 执行报表出错的错误消息
一个传入自定义 user.properties 文件生成 jMeter 执行报表出错的错误消息
5 0
程序员遇到不认识的花是这样识别的
  如何实施   可以使用图像分类华为ML套件服务。它将图像中的元素分类为直观的类别,以定义图像主题和使用场景。该服务既支持设备上的识别模式,也支持云上的识别模式,前者识别400多个类别的项目,后者识别12000多个类别。它还允许创建自定义图像分类模型。   制剂   1.创建一个应用程序的应用程序连接和配置签名证书指纹。   2.配置华为Maven存储库地址,并添加对图像分类服务的构建依赖项。   dependencies{// Import the basic SDK.implementation'com.huawei.hms:ml-computer-vision-classif
1 0
程序员学数据科学需要掌握的常用算法和方法术语
  数据科学是一门有关机器学习、统计学与数据挖掘的交叉学科,它的目标是通过算法和统计分析方法从现存数据中获取新知识。下面小编将介绍数据科学中的算法和方法术语。   k最近邻算法:一种预测未知数据项的算法,未知数据项(的值)近似于其k个最近邻居的多数值。朴素贝叶斯分类器:使用关于条件概率的贝叶斯定理,即P(A|B)=(P(B|A) * P(A))/P(B),来分类数据项的一种方法,假设数据的特定变量之间相互独立。决策树:一种模型,根据树上的分支与实际数据项之间的匹配属性,将数据项分类到叶子节点中的一个类中。随机决策树:决策树的一种,其中的每个分支在构建时仅使用可用变量的随机子集。随机森林:基
1 0
程序员学人工智能必须掌握的定义AI的4种方法
  定义AI的4种方法   正如前一节所描述的,首先要理解的概念是AI与人类智能没有真正的关系。当然,一些AI被建模为模仿人类智能,但仅是模仿而已。想到AI时,需注意到目标探索、用于达成该目标的数据处理和为了更好地理解目标的数据获取之间的相互作用。AI根据算法得到一个结果,该结果可能与人类的目标或实现这些目标的方法无关。基于此,可以将AI分为4种。   行为类似人类:   计算机行为类似人类,这在图灵测试中有很好的反映,当无法区分计算机和人类时,计算机在图灵测试中胜出。这也反映了媒体对AI的看法。你可以看到它被应用于自然语言处理、知识表示、自动推理和机器学习等技术中(所有这4种都必须通
1 0
+关注
一个处女座的程序猿
国内互联网圈知名博主、人工智能领域优秀创作者,全球最大中文IT社区博客专家、CSDN开发者联盟生态成员、中国开源社区专家、华为云社区专家、51CTO社区专家、Python社区专家等,曾受邀采访和评审十多次。仅在国内的CSDN平台,博客文章浏览量超过2500万,拥有超过57万的粉丝。
1701
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载