Tensorflow 的 LSTM 输入

2024-05-09

I'm trying to create an LSTM network in Tensorflow and I'm lost in terminology/basics. I have n time series examples so X=xn, where xi=[[x11x12,x13],...,[xm1xm2,xm3]] and where xii is a float. First of all I want to train a model that given the start of a sequence ([x11x12,x13]) I can predict the rest of the sequence. Then later I hope to include a classifier to predict which binary class each xi belongs to.

所以我的问题是我应该在模型的开头输入什么并从结尾取出什么?到目前为止我有一些看起来像下面的东西

class ETLSTM(object):
    """docstring for ETLSTM"""
    def __init__(self, isTraining, config):
        super(ETLSTM, self).__init__()

        # This needs to be tidied
        self.batchSize = batchSize = config.batchSize
        self.numSteps = numSteps = config.numSteps
        self.numInputs = numInputs = config.numInputs
        self.numLayers = numLayers = config.numLayers

        lstmSize = config.lstm_size
        DORate = config.keep_prob

        self.input_data = tf.placeholder(tf.float32, [batchSize, numSteps,
                                                      numInputs])
        self.targets = tf.placeholder(tf.float32, [batchSize, numSteps,
                                                   numInputs])
        lstmCell = rnn_cell.BasicLSTMCell(lstmSize, forgetbias=0.0)
        if(isTraining and DORate < 1):
            lstmCell = tf.nn.rnn_cell.DropoutWrapper(lstmCell,
                                                     output_keep_prob=DORate)
        cell = tf.nn.rnn_cell.MultiRNNCell([lstmCell]*numLayers)

        self._initial_state = cell.zero_state(batchSize, tf.float32)

        # This won't work with my data, need to find what goes in...
        with tf.device("/cpu:0"):
            embedding = tf.get_variable("embedding", [vocab_size, size])
            inputs = tf.nn.embedding_lookup(embedding, self._input_data)

        if(isTraining and DORate < 1):
            inputs = tf.nn.dropout(inputs, DORate)

EDIT: 具体来说,我如何完成__init__功能以便它与我的数据兼容?


RNN 会根据目前从 1 到 N 的值来预测 N+1 的值。 (LSTM 只是实现 RNN 单元的一种方法。)

简短的回答是:

  • train your model using back propagation on your complete sequences [[x11x12,x13],...,[xm1xm2,xm3]]
  • run your trained model forward on the start of your sequence [x11x12,x13,...] then sample from the model to predict the rest of your sequence [xm1xm2,xm3,...].

更长的答案是:

您的示例仅显示了模型的初始化。您还需要实现一个训练函数来运行反向传播以及一个预测结果的示例函数。

以下代码片段是混合和匹配的,仅用于说明目的......

对于训练,只需在数据迭代器中使用开始+休息输入完整的序列即可。

例如,在示例代码 tensorflow/models/rnn/ptb_word_lm.py 中,训练循环针对目标(即按一个时间步移动的 input_data)计算一批 input_data 的成本函数

        # compute a learning rate decay
        session.run(tf.assign(self.learning_rate_variable, learning_rate))

        logger.info("Epoch: %d Learning rate: %.3f" % (i + 1, session.run(self.learning_rate_variable)))


        """Runs the model on the given data."""
        epoch_size = ((len(training_data) // self.batch_size) - 1) // self.num_steps
        costs = 0.0
        iters = 0
        state = self.initial_state.eval()
        for step, (x, y) in enumerate(self.data_iterator(training_data, self.batch_size, self.num_steps)):

            # x and y should have shape [batch_size, num_steps]
            cost, state, _ = session.run([self.cost_function, self.final_state, self.train_op],
                                     {self.input_data: x,
                                      self.targets: y,
                                      self.initial_state: state})
            costs += cost
            iters += self.num_steps

请注意,tensorflow/models/rnn/reader.py 中的数据迭代器将输入数据返回为“x”,将目标返回为“y”,仅从 x 向前移动一步。 (您需要创建一个像这样的数据迭代器来打包您的训练序列集。)

def ptb_iterator(raw_data, batch_size, num_steps):
  raw_data = np.array(raw_data, dtype=np.int32)

  data_len = len(raw_data)
  batch_len = data_len // batch_size
  data = np.zeros([batch_size, batch_len], dtype=np.int32)
  for i in range(batch_size):
    data[i] = raw_data[batch_len * i:batch_len * (i + 1)]

  epoch_size = (batch_len - 1) // num_steps

  if epoch_size == 0:
    raise ValueError("epoch_size == 0, decrease batch_size or num_steps")

  for i in range(epoch_size):
    x = data[:, i*num_steps:(i+1)*num_steps]
    y = data[:, i*num_steps+1:(i+1)*num_steps+1]
    yield (x, y)

训练后,您可以通过输入序列的开头 start_x=[X1, X2, X3,...] 来向前运行模型以对序列进行预测...此片段假设表示类的二进制值,您必须调整浮点值的采样函数。

def sample(self, sess, num=25, start_x):

    # return state tensor with batch size 1 set to zeros, eval
    state = self.rnn_layers.zero_state(1, tf.float32).eval()

    # run model forward through the start of the sequence
    for char in start_x:

        # create a 1,1 tensor/scalar set to zero
        x = np.zeros((1, 1))

        # set to the vocab index
        x[0, 0] = char


        # fetch: final_state
        # input_data = x, initial_state = state
        [state] = sess.run([self.final_state], {self.input_data: x, self.initial_state:state})

    def weighted_pick(weights):

        # an array of cummulative sum of weights
        t = np.cumsum(weights)

        # scalar sum of tensor
        s = np.sum(weights)

        # randomly selects a value from the probability distribution
        return(int(np.searchsorted(t, np.random.rand(1)*s)))

    # PREDICT REST OF SEQUENCE
    rest_x = []

    # get last character in init
    char = start_x[-1]

    # sample next num chars in the sequence after init
    score = 0.0

    for n in xrange(num):

        # init input to zeros
        x = np.zeros((1, 1))

        # lookup character index
        x[0, 0] = char

        # probs = tf.nn.softmax(self.logits)
        # fetch: probs, final_state
        # input_data = x, initial_state = state
        [probs, state] = sess.run([self.output_layer, self.final_state], {self.input_data: x, self.initial_state:state})

        p = probs[0]
        logger.info("output=%s" % np.shape(p))
        # sample = int(np.random.choice(len(p), p=p))

        # select a random value from the probability distribution
        sample = weighted_pick(p)
        score += p[sample]
        # look up the key with the index
        logger.debug("sample[%d]=%d" % (n, sample))
        pred = self.vocabulary[sample]
        logger.debug("pred=%s" % pred)

        # add the car to the output
        rest_x.append(pred) 

        # set the next input character
        char = pred
    return rest_x, score
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tensorflow 的 LSTM 输入 的相关文章

随机推荐

  • 尝试使用资源/使用/多个资源

    我使用的 Java API 大量使用了 Autoclosable Interface 因此在 Java try with resources 中 然而在Java中你可以指定 try res1 res2 res3 我们有办法使用多种资源吗 它
  • Eclipse Package Explorer:隐藏部分长包名称?

    我一直在寻找一个让我烦恼了一段时间的 问题 但没有任何运气 我正在开发一个Android应用程序 其包名相当长com kennethbrodersen simplecaster 该项目包含许多子包 问题是所有这些包在包资源管理器中都显示有完
  • 如何获取日期格式的日期选择器值?

    我的日期选择器有问题 我使用代码来获取日期 月份和年份 如下所示 DatePicker datePicker datePicker DatePicker findViewById R id dateselect int day datePi
  • gensym 在 Lisp 中做什么?

    我听到一些同学谈论他们如何使用该功能gensym为此 我问他们它做了什么 甚至在网上查了一下 但我真的无法理解这个函数的作用是什么两者都不为什么或何时最好使用它 特别是 我对它在 Lisp 中的作用更感兴趣 谢谢你们 独特且未被拘禁的符号
  • FIND_IN_SET 具有多个值[重复]

    这个问题在这里已经有答案了 我想从数据库字段搜索多个值 以下是我的查询 SELECT FROM tablename WHERE FIND IN SET 12 13 15 15 category id 我如何搜索它对我不起作用 FIND IN
  • 将多个图像添加到 Word 文档的特定位置 OpenXML

    我正在使用 Office Open XML 并且必须在特定点添加图像 在文档上我有一个 标签 这样我就可以很好地找到它 但是 当我添加多个图像时 它会损坏文件 这是我的代码 修改自https msdn microsoft com en us
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • 方案中的多维向量?

    我之前问过一个关于方案中数组的问题 结果它们被称为向量 但在其他方面基本上与您期望的相同 有没有一种简单的方法可以在 PLT 方案中处理多维 arrays 向量 出于我的目的 我想要一个名为make multid vector或者其他的东西
  • 将列添加到 ASP.NET Identity 中的 AspNetUserClaims

    我在用着Microsoft AspNet Identity Core 2 2 1在我的解决方案中 我需要将其与另一个应自动添加声明的系统集成 为了跟踪哪些声明是手动添加的以及哪些是由外部系统创建的 我希望在我的AspNetUserClaim
  • 从 PHP 执行 SQL Server 存储过程

    我尝试从 PHP 调用 SQL Server 存储过程 这是我的存储过程 CREATE procedure dbo tester id NVARCHAR MAX AS BEGIN DECLARE tab TABLE myxml XML IN
  • 导入错误:无法导入名称“IntEnum”

    我正在尝试安装upstox 这是一个用于连接市场数据的 Python API 我无法在Python3 5上安装它 我的配置是Python 3 5 3 v3 5 3 1880cb95a742 Jan 16 2017 15 51 26 MSC
  • 我在 JIRA 中评论的问题

    根据 JIRA 文档http www atlassian com software jira docs latest http www atlassian com software jira docs latest 以下过滤器将显示我 当前
  • 有没有办法将 JSON 模式转换为 XSD? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我目前正在寻找一种将 JSON 架构转换为 XSD 或 XML 架构的方法 我没有找到任何关于这个主题
  • 将 spring boot 应用导入到另一个项目中

    因此 我尝试在另一个项目 测试框架 中添加一个 spring boot 可执行 jar 作为依赖项 但是一旦添加到 pom 并导入 Java 导入无法正常工作 如果我查看 jar 内部 所有包都带有以下前缀 BOOT INF classes
  • 当 Jupyter 单元包含函数、循环或其他块时,是否可以将其拆分为多个单元?

    Jupyter 的一项功能是能够一次执行一个单元 如果一个单元格有很多语句 通常可以 希望 将其拆分为更小的单语句单元格 除非涉及块 例如 if for def 等 这个问题之前以不同的方式提出过 在Jupyter中逐步执行算法 https
  • 使用Retrofit获取base64图像错误com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:

    我正在尝试从经过身份验证的网站下载图像 该网站返回图像的 Base64 版本 这是改造的正确方法吗 如何获取图像并将其设置为我的图像视图 GET img avatars id public void getProfilePic Path i
  • 如何在 Eclipse 中使用正则表达式将大写字母替换为小写字母?

    我想检查所有源代码文件并替换所有出现的k Xyyy with k xyyy 交换后面的第一个字母k 从大写到小写 我正在使用 Eclipse 对话框来搜索和替换多个文件 现在我有正则表达式 bk A Z 如何指定正则表达式的替换字符串 我刚
  • 从 SQLite 迁移到 Android Room 持久性库

    我有一个正在使用的应用程序SQLite数据库 我正在尝试替换AndroidSQLite with Android Room API 我已经创建了 DAO 类 实体类和 DB 但是在执行数据库查询时Async任务我收到以下错误 引起原因 ja
  • GDI+ 中绘图坐标的硬界限是什么?

    我这样渲染插值曲线 e Graphics DrawLines new Pen Color Red interpolationPoints ToArray 有时会抛出 OverflowException 对 interpolationPoin
  • Tensorflow 的 LSTM 输入

    I m trying to create an LSTM network in Tensorflow and I m lost in terminology basics I have n time series examples so X