Neural network 在Tensorflow中,我应该使用哪种神经网络?

Neural network 在Tensorflow中,我应该使用哪种神经网络?,neural-network,tensorflow,Neural Network,Tensorflow,我正在做Tensorflow教程,了解TF是什么。但我不知道我应该在工作中使用什么样的神经网络。 我正在研究单层神经网络、CNN、RNN和LSTM RNN 有一个传感器,它可以测量某些东西,并以两种布尔方式表示结果。在这里,它们是蓝色和红色的,如下所示: 传感器每5分钟给出一次结果值。如果我们将每种颜色的值堆积起来,我们可以看到一些图案: 每个圆圈内的数字表示传感器给出的结果值序列。(107在106之后给出)当你从122到138看到时,你可以看到类似于贴花图案的图案 我想在传感器结果之前预测

我正在做Tensorflow教程,了解TF是什么。但我不知道我应该在工作中使用什么样的神经网络。 我正在研究单层神经网络、CNN、RNN和LSTM RNN

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

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

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


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

所以听起来你需要处理一系列图像。你可以同时使用CNN和RNN。一个月前,我在训练一个网络,使用一系列的个人资料图片在tinder上向左或向右滑动。你要做的是将所有的图像通过CNN,然后进入RNN。下面是我的tinder机器人的部分代码。看看我如何在序列上分配卷积,然后将其推送到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

是的,RNN(递归神经网络)适合沿序列累积状态以预测其下一个元素的任务LSTM(长-短记忆)是一种针对网络中反复出现的片段的特殊设计,在避免长期反复出现的数值挑战方面非常成功;更多信息,请参阅。(LSTM单元设计的替代方案已经存在,但我只会在很久以后进行微调,可能永远不会)

本文解释了语言模型的LSTM RNN,该语言模型从前面的n个单词中预测每n个句子的(n+1)-第一个单词(如一系列测量中的每个时间步)。您的案例比语言模型更简单,因为您只有两个单词(红色和蓝色),所以如果您阅读了关于单词嵌入的任何内容,请忽略它

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

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