我想使用一维卷积神经网络进行回归。
我有大约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]:
这种方法正确吗?
对于所有测试样本,网络输出几乎都是相同的。这是否表示权重存在问题?我曾尝试在卷积层中设置“ kernel_initializer ='he_normal'”,但这无济于事。
在同一数据集上使用多层感知器时,我需要使用批量归一化,否则训练将失败。卷积网络有类似的东西吗?
答案 0 :(得分:0)
在回归问题中,在输出层末端使用激活函数并不是一种常见的做法。激活用于分类问题,即使这样,通常还是首选Sigmoid(对于二进制分类)或softmax(对于多分类)。
我看到您使用的是MSE损失,这是回归的正确选择,但是您输入和输出的缩放比例与神经网络的假设不符(输入和输出来自正态分布:mean:0,std :1),因此人们通常在训练之前对输入和输出进行z归一化(均值减去标准差)。