一维卷积网络提供恒定的输出

时间:2019-05-22 06:41:09

标签: python tensorflow neural-network deep-learning conv-neural-network

我想使用一维卷积神经网络进行回归。

我有大约1500个训练样本,每个样本都有40个特征。我正在分批训练大约200-300个样本。

我不确定代码是否设置正确。每个输入样本本质上是一个具有40个元素的一维矢量,因此在第一卷积层中,我希望每个滤波器在训练批次中都(独立地)沿着每个矢量的长度传递。我是否正确设置了宽度,高度,通道等以实现此目的?

我的代码是:

width = 40
channels = 1
n_outputs = 1

X = tf.placeholder(tf.float32, shape=[None, width], name="X")
X_reshaped = tf.reshape(X, shape=[-1, width, channels])
y = tf.placeholder(tf.float32, shape=[None, channels], name="y")
y_reshaped = tf.reshape(y, shape=[-1, channels])
training = tf.placeholder_with_default(False, shape=(), name='training')

with tf.name_scope("cnn"):
    conv1 = tf.layers.conv1d(X_reshaped, filters=24, kernel_size=4,
                             strides=2, padding='same', activation=tf.nn.relu, name="conv1")

    pool1 = tf.layers.average_pooling1d(conv1, pool_size=2, strides=2, padding='same')

    conv2 = tf.layers.conv1d(pool1, filters=32, kernel_size=2,
                             strides=2, padding='same', activation=tf.nn.relu, name="conv2")

    pool2 = tf.layers.average_pooling1d(conv2, pool_size=2, strides=2, padding='same')

    flat = tf.layers.flatten(pool2, name='flatten')

    drop = tf.layers.dropout(flat, rate=0.3, training=training)

    output = tf.layers.dense(drop, n_outputs, activation=tf.nn.tanh, name="fully_connected")

with tf.name_scope("loss"):
    loss = tf.reduce_mean(tf.square(y_reshaped - output))

initial_learning_rate = 0.01
decay_steps = 1000
decay_rate = 0.1 

with tf.name_scope("train"):
   global_step = tf.Variable(0, trainable=False, name="global_step")
    learning_rate = tf.train.exponential_decay(initial_learning_rate, global_step, decay_steps, decay_rate)
    optimizer = tf.train.RMSPropOptimizer(learning_rate, momentum=0.9)
    training_op = optimizer.minimize(loss, global_step=global_step)

我将40个输入要素缩放到[0.0,1.0]范围。换句话说,我的“ X”张量包含行中的样本,而列是各种特征。我将每一列缩放到[0.0,1.0]范围。

因为我使用的输出层带有一个激活了tanh的神经元(输出范围为[-1.0:1.0]:

  • 在训练过程中,我将预测值(y)缩放到[-1:0,1.0]
  • 当使用训练有素的网络生成预测时,我必须反转比例以获取“真实”值(因为预测值的范围为[-1.0,1.0])

这种方法正确吗?

对于所有测试样本,网络输出几乎都是相同的。这是否表示权重存在问题?我曾尝试在卷积层中设置“ kernel_initializer ='he_normal'”,但这无济于事。

在同一数据集上使用多层感知器时,我需要使用批量归一化,否则训练将失败。卷积网络有类似的东西吗?

1 个答案:

答案 0 :(得分:0)

在回归问题中,在输出层末端使用激活函数并不是一种常见的做法。激活用于分类问题,即使这样,通常还是首选Sigmoid(对于二进制分类)或softmax(对于多分类)。

我看到您使用的是MSE损失,这是回归的正确选择,但是您输入和输出的缩放比例与神经网络的假设不符(输入和输出来自正态分布:mean:0,std :1),因此人们通常在训练之前对输入和输出进行z归一化(均值减去标准差)。