【问题标题】:In Tensorflow, What kind of neural network should I use?在 Tensorflow 中,我应该使用什么样的神经网络?
【发布时间】:2017-03-05 11:49:55
【问题描述】:

我正在做 TensorFlow 教程,了解 TF 是什么。但我对在工作中应该使用什么神经网络感到困惑。 我正在研究单层神经网络、CNN、RNN 和 LSTM RNN。

有一个传感器可以测量某物并以 2 种布尔方式表示结果。在这里,它们是蓝色和红色,如下所示:

传感器每 5 分钟给出一次结果值。如果我们将每种颜色的值堆积起来,我们可以看到一些模式:

每个圆圈内的数字代表传感器给出的结果值序列。 (107 是在 106 之后给出的)当你从 122 到 138 看时,你可以看到类似 decalcomanie 的图案。

我想在传感器结果之前预测下一个布尔值。我可以使用过去的结果进行监督学习。但我不确定哪种神经网络或方法适合。考虑到这项工作需要使用过去结果的模式(必须查看上下文)并记住过去的结果,LSTM RNN(长短期记忆循环神经网络)可能是合适的。你能告诉我什么是正确的吗?

【问题讨论】:

    标签: neural-network tensorflow


    【解决方案1】:

    是的,RNN(循环神经网络)适合沿着序列累积状态以预测其下一个元素的任务。 LSTM(长短期记忆)是一种针对网络循环部分的特殊设计,在避免长期循环带来的数值挑战方面非常成功;有关更多信息,请参阅colah's much-cited blogpost。 (存在 LSTM 单元设计的替代方案,但我只会在很久以后进行微调,可能永远不会。)

    TensorFlow RNN codelab 解释了语言模型情况下的 LSTM RNN,它从前面的 n 个单词中预测一个句子的第 (n+1)-st 个单词,对于每个 n(就像你的测量系列中的每个时间步长一样) )。您的案例比语言模型更简单,因为您只有两个词(红色和蓝色),因此如果您阅读任何有关词嵌入的内容,请忽略它。

    您还提到了其他类型的神经网络。这些并非旨在沿序列累积状态,例如您的红色/蓝色输入的布尔序列。但是,您的第二张图片表明连续红色/蓝色值的 计数 序列中可能存在模式。您可以尝试使用过去的 k 个计数作为普通前馈(即非递归)神经网络的输入,该网络预测下一次测量与当前测量具有相同颜色的概率。 - 也许这适用于单层,或者两层甚至三层效果更好;实验会告诉我们。与 RNN 相比,这是一种不那么花哨的方法,但如果它足够好,它会为您提供一个更简单的解决方案,并且无需担心技术问题。

    CNNs(卷积神经网络)不是我的首选。这些旨在发现输入中不同位置的一组固定比例特征,例如图像中任何位置的一些纹理或弯曲边缘。但是您只想预测扩展输入序列的下一个项目。一个普通的神经网络(见上文)可能会在 k 个先前值上发现有用的模式,并且使用所有早期的部分序列对其进行训练将有助于它找到这些模式。 CNN 方法将有助于在预测期间在输入的早已消失的部分发现它们;我不知道为什么会有帮助。

    【讨论】:

      【解决方案2】:

      听起来您需要处理一系列图像。你实际上可以同时使用 CNN 和 RNN。一个月前,我在训练网络使用个人资料图片序列在火种上向左或向右滑动时这样做了。你要做的是将所有图像通过 CNN,然后进入 RNN。下面是我的火种机器人的部分代码。看看我如何将卷积分布在序列上,然后将其推入 RNN。最后,我在最后一个时间步上放置了一个 softmax 分类器来进行预测,但是在你的情况下,我认为你会及时分配预测,因为你想要序列中的下一个项目。

      self.input_tensor = tf.placeholder(tf.float32, (None, self.max_seq_len, self.img_height, self.img_width, 3), 'input_tensor')
      self.expected_classes = tf.placeholder(tf.int64, (None,))
      self.is_training = tf.placeholder_with_default(False, None, 'is_training')
      self.learning_rate = tf.placeholder(tf.float32, None, 'learning_rate')
      self.tensors = {}
      activation = tf.nn.elu
      rnn = tf.nn.rnn_cell.LSTMCell(256)
      with tf.variable_scope('series') as scope:
          state = rnn.zero_state(tf.shape(self.input_tensor)[0], tf.float32)
          for t, img in enumerate(reversed(tf.unpack(self.input_tensor, axis = 1))):
              y = tf.map_fn(tf.image.per_image_whitening, img)
              features = 48
              for c_layer in range(3):
                  with tf.variable_scope('pool_layer_%d' % c_layer):
                      with tf.variable_scope('conv_1'):
                          filter = tf.get_variable('filter', (3, 3, y.get_shape()[-1].value, features))
                          b = tf.get_variable('b', (features,))
                          y = tf.nn.conv2d(y, filter, (1, 1, 1, 1), 'SAME') + b
                          y = activation(y)
                          self.tensors['img_%d_conv_%d' % (t, 2 * c_layer)] = y
      
                      with tf.variable_scope('conv_2'):
                          filter = tf.get_variable('filter', (3, 3, y.get_shape()[-1].value, features))
                          b = tf.get_variable('b', (features,))
                          y = tf.nn.conv2d(y, filter, (1, 1, 1, 1), 'SAME') + b
                          y = activation(y)
                          self.tensors['img_%d_conv_%d' % (t, 2 * c_layer + 1)] = y
      
                      y = tf.nn.max_pool(y, (1, 3, 3, 1), (1, 3, 3, 1), 'SAME')
                      self.tensors['pool_%d' % c_layer] = y
                      features *= 2
                      print(y.get_shape())
      
              with tf.variable_scope('rnn'):
                  y = tf.reshape(y, (-1, np.prod(y.get_shape().as_list()[1:])))
                  y, state = rnn(y, state)
                  self.tensors['rnn_%d' % t] = y
      
              scope.reuse_variables()
      
          with tf.variable_scope('output_classifier'):
              W = tf.get_variable('W', (y.get_shape()[-1].value, 2)) 
              b = tf.get_variable('b', (2,))
              y = tf.nn.dropout(y, tf.select(self.is_training, 0.5, 1.0))
              y = tf.matmul(y, W) + b
              self.tensors['classifier'] = y
      

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 2017-05-06
        • 2018-04-21
        • 2017-11-14
        • 2017-11-15
        • 2023-03-14
        • 1970-01-01
        • 2018-05-18
        • 2016-07-28
        相关资源
        最近更新 更多