在Tensorflow中,我应该使用什么样的神经网络?

时间:2016-10-23 17:40:22

标签: neural-network tensorflow

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

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

enter image description here

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

enter image description here

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

是的, RNN (递归神经网络)适合沿着序列累积状态的任务,以便预测其下一个元素。 LSTM (长期短期记忆)是网络的经常性部分的一种特殊设计,已经证明非常成功地避免了长期复发带来的数字挑战;有关详情,请参阅colah's much-cited blogpost。 (存在LSTM单元设计的替代方案,但我只会稍微调整一下,可能永远不会。)

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

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

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