2016-10-23 3 views
2

Я занимаюсь учебником Tensorflow, получая TF. Но я смущен тем, что нейронная сеть должна использовать в моей работе. Я смотрю нейронную сеть с одним слоем, CNN, RNN и LSTM RNN.В Tensorflow, какую нейронную сеть я должен использовать?

Есть датчик, который что-то измеряет и представляет результат в 2 булевых способах. Здесь они синие и красные, как это:

enter image description here

датчик дает результирующие значения каждый 5минет. Если мы взгромоздить значения для каждого цвета, мы можем увидеть некоторые закономерности:

enter image description here

число внутри каждого круга представляет последовательность значений результирующих данных от датчика. (107 было дано сразу после 106), когда вы видите от 122 до 138, вы можете увидеть рисунок, похожий на декалькоманию.

Я хочу предсказать следующее булево значение перед результатом датчика. Я могу заниматься наблюдением, используя прошлые результаты. Но я не уверен, какая нейронная сеть или метод подходит. Думая, что эта работа нуждается в шаблоне с использованием прошлых результатов (нужно видеть контекст) и запоминать прошлые результаты, возможно, подходит LSTM RNN (долговременная краткосрочная память, нейронная сеть). Не могли бы вы рассказать мне, что правильно?

ответ

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 
2

Да, РНН (рецидивирующий нейронная сеть) подходит задачу аккумулирования состояния вдоль вдоль последовательности, чтобы предсказать его следующий элемент. LSTM (длинная кратковременная память) - это особый дизайн для повторяющихся частей сети, который оказался очень успешным, избегая числовых проблем из долговременных повторений; см. colah's much-cited blogpost для больше. (Альтернативы конструкции ячейки LSTM существуют, но я бы только тонко настраивал это намного позже, возможно, никогда.)

TensorFlow RNN codelab объясняет LSTM RNN для случая языковых моделей, которые предсказывают (n + 1) -ное слово предложение из предыдущих n слов, для каждого n (как для каждого временного интервала в вашей серии измерений). Ваш случай проще, чем языковые модели, поскольку у вас есть только два слова (красный и синий), поэтому, если вы читаете что-либо о вложениях слов, игнорируйте его.

Вы также упомянули другие типы нейронных сетей. Они не нацелены на накопление состояния по последовательности, такой как ваша логическая последовательность красных/синих входов. Тем не менее, ваше второе изображение предполагает, что в последовательности может указываться число последовательных значений красного/синего. Вы могли бы попытаться использовать прошлое количество k в качестве входных данных для нулевой сети простой (например, нерекурсивной) нейронной сети, которая прогнозирует вероятность следующего измерения с тем же цветом, что и текущий. - Может быть, это работает с одним слоем, а может быть, два или даже три лучше работают; экспериментирует.Это менее привлекательный подход, чем RNN, но если он работает достаточно хорошо, он дает вам более простое решение с меньшим количеством технических проблем, о которых нужно беспокоиться.

CNNs (сверточные нейронные сети) не был бы моим первым выбором здесь. Они направлены на то, чтобы обнаружить набор функций фиксированной шкалы в разных местах ввода, например, некоторые текстуры или кривые края в любом месте изображения. Но вы хотите только предсказать следующий элемент, который расширяет вашу последовательность ввода. Обычная нейронная сеть (см. Выше) может обнаружить полезные шаблоны для k предыдущих значений, и обучение ее со всеми более ранними частичными последовательностями поможет найти эти шаблоны. Подход CNN поможет обнаружить их во время предсказания на давно ушедших частях ввода; У меня нет интуиции, почему это поможет.

Смежные вопросы