Предварительно обрабатывать данные с несколькими экземплярами с 1 меткой для тензорного потока нейронной сети

Я тренирую нейронную сеть, чтобы предсказать число фанатов роста страницы Facebook на основе отсутствия сообщений, категории сообщений (видео, ссылка, статус и т. Д.) И количества акций, таких как комментарии и комментарии к каждому сообщению. Таким образом, существует единая метка против нескольких экземпляров, когда метка (fan_growth) вычисляется для каждого дня (не для каждого сообщения): введите описание изображения здесь

Поэтому, если я использую одну горячую кодировку для категориальных данных: введите описание изображения здесь

здесь присутствуют дата, день, ссылка, видео, статус, реакции, комментарии и акции, а fan_growth – ярлык. Как использовать единую метку для более чем одного экземпляра? С использованием «100» снова все 1-е 3-х экземпляры были бы неправильными.

Если я правильно понимаю, в основном у вас есть переменное количество событий, которые могут произойти в данный день (размещены видео, ссылка или статус нуль или более раз каждый), и для каждого из них у вас есть связанные реакции, комментарии и акции. Затем вы хотите предсказать рост вентилятора в день на основе этого переменного количества действий, предпринятых за один день. Пожалуйста, поправьте меня, если я ошибаюсь.

То, что вы можете сделать, – это организовать рекуррентную нейронную сеть на последовательностях данных переменной длины. Вы бы структурировали свои входные данные как:

x_ij = [category, reactions, comments, shares]_i for day j i = 1, 2, ..., n_j (number of posts in day "j") j = 1, 2, ..., N (number of days in dataset) 

Вы можете думать о каждом x_ij как временном шаге в день j . Тогда полная последовательность ввода в течение одного дня будет выглядеть так:

 X_j = [x_1j, x_2j, ..., x_nj] 

И ваш выходной вектор будет Y = [y_1, y_2, ..., y_N] где каждый y_j является ростом вентилятора в течение дня j . В принципе, процесс обучения включает в себя настройку вашей рекуррентной нейронной сети с использованием tf.nn.dynamic_rnn и использование sequence_length чтобы указать, как долго будет каждая входная последовательность. Он будет выглядеть примерно так (здесь будет много деталей реализации, которые я пропущу здесь):

 cell = tf.contrib.rnn.GRUCell(num_hidden) # Any additional things like tf.contrib.rnn.DropoutWrapper you want here cell = tf.contrib.rnn.OutputProjectionWrapper(cell, 1) # only one output number, right? output, _ = tf.nn.dynamic_rnn(cell, data, sequence_length=sequence_length) 

Обратите внимание, что я использую ячейки GRU здесь ( документы TF ) вместо LSTM ( документы TF ). Это отчасти предпочтение, но в основном GRU может делать все, что LSTM может, но более эффективно. Затем вы запускаете свой учебный процесс, передавая партии данных размера [batch_size, num_steps_per_day, num_features] и тензора sequence_length размера [batch_size, 1] который дает количество шагов в день. Что-то вроде:

 with tf.Session() as sess: for epoch in range(num_epochs): shuffle_training_set() for batch in range(num_batches): d = get_next_batch() t = get_next_target_batch() s = # length of each data sample in your batch sess.run(optimize, feed_dict={data: d, targets: t, sequence_length: s}) # periodically validate and stop when you stop improving 

Здесь optimize может быть определена следующим образом:

 cost = # your cost function here... optimizer = tf.train.AdamOptimizer() # I usually have luck with this optimizer optimize = optimizer.minimize(cost) 

Ознакомьтесь с этим превосходным примером (а не с моим контентом), чтобы начать работу над некоторыми деталями реализации. В этом примере показана маркировка последовательности, но ее довольно просто изменить, чтобы предсказать рост вентилятора.

Я не думаю, что RNN следует применять в день в этом случае.

Вы могли бы просто суммировать всю информацию за 1 день?

Например: введите описание изображения здесь

вы могли бы:

 {1st row: {day:1, link: 2, video: 1, status: 0, reactions: 489+964+964, comments: 0, shares: 0}, 2nd row: {day: 3, link:1, video: 1, status: 0, reactions: 685, comments: 0, shares: 0}} 

То, что возможно с RNN, – это видеть каждый день как последовательность и видеть, как вещи развиваются во времени.