Я работаю над проектом прогнозирования фондового рынка с использованием анализа настроений. Я пытаюсь создать модель CNN, в которой я передаю данные о запасах за 4000 дней с размером пакета 100. В конце плотного слоя я хочу добавить регрессионный слой, чтобы получить цену акций.
def Model(train_data):
input_layer = tf.reshape(tf.cast(train_data, tf.float32), [-1, 1, 100, 2])
conv1 = tf.layers.conv2d(inputs=input_layer,filters=32,kernel_size=[1, 5],padding = "same",
activation=tf.nn.relu,strides=1,kernel_initializer=tf.contrib.layers.variance_scaling_initializer())
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[1, 2], strides=[1,2])
conv2 = tf.layers.conv2d(inputs=pool1,filters=8,kernel_size=[1, 5],padding = "same",activation=tf.nn.relu,
strides=1,kernel_initializer=tf.contrib.layers.variance_scaling_initializer())
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[1, 5], strides=[1,5])
conv3 = tf.layers.conv2d(inputs=pool2,filters=2,kernel_size=[1, 2],padding = "same",activation=tf.nn.relu,
strides=1,kernel_initializer=tf.contrib.layers.variance_scaling_initializer())
pool3 = tf.layers.max_pooling2d(inputs=conv3, pool_size=[1, 2], strides=[1, 2])
pool3_flat = tf.reshape(pool3, [40, 1 * 5 * 2])
dense = tf.layers.dense(inputs=pool3_flat, units=5, activation=tf.nn.relu)
dropout = tf.layers.dropout(
inputs=dense, rate=0.2, training=mode == tf.estimator.ModeKeys.TRAIN)
logits = tf.layers.dense(inputs=dropout, units=1)
Я имею в виду модель https://www.tensorflow.org/tutorials/estimators/cnn, но они проводят классификацию. Кто-нибудь может предложить подход к регрессии? Train_data для модели имеет форму [2,4000], где одна строка предназначена для нормализованных цен акций, а другая - для фактора настроения.
Слой логитов будет иметь форму [40,1]






Единственное, что вам нужно сделать, это добавить полностью связанный слой в самом конце и выбрать линейную активацию. Интуитивно это возьмет выходные данные ваших слоев Conv и применит к ним y = mx + b. Ваш полностью подключенный выходной слой будет иметь 40 узлов (по одному на каждый выход). Фактически, у вас уже есть один плотный слой в этом коде. Если ваш вывод имеет размер 40, просто сделайте 40 вместо 5.
Кстати, традиционно CNN используются для классификации изображений, и только недавно они начали переходить на другие приложения (такие как обнаружение спама). Я бы посоветовал сначала попробовать простую нейронную сеть с прямой связью, а если это не сработает, возможно, перед этим попробуйте RNN.
Я не уверен, но разве это не плотный слой и то же самое, что потом будет полностью подключено.
Да вы правы. В последних нескольких строках вашего кода, которые являются tf.layers.dense, это полностью связанные слои. Я перечитал ваш код, и на самом деле он состоит из двух плотно связанных слоев. У одного есть активация ReLU, а у другого его нет. Для вашего последнего слоя измените единицы с 1 на 40, и он должен выполнить регрессию. Единственное различие между классификацией и регрессией состоит в том, что при классификации используется softmax или логистическая активация для сжатия всех значений от 0 до 1, тогда как регрессия пропускает эту часть.
какой формы ваш результат?