目前,我有一个神经网络,内置于 tensorflow 中,用于将时间序列数据分类为 6 个类别之一。该网络由以下部分组成:
2 个全连接层 -> LSTM 单元 -> softmax -> 输出
所有层都以 dropout 和/或层归一化的形式进行正则化。为了加快训练过程,我使用了小批量数据,其中小批量大小 = # of categories = 6。每个 mini-batch 包含 6 个类别中的每一个的一个样本,在 mini-batch 中随机排列。下面是前馈代码,其中 x 的形状为 [batch_size、时间步数、特征数],各种 get 命令是用于创建标准全连接层和具有正则化的 LSTM 单元的简单定义。
def getFullyConnected(input ,hidden ,dropout, layer, phase):
weight = tf.Variable(tf.random_normal([input.shape.dims[1].value,hidden]), name="weight_layer"+str(layer))
bias = tf.Variable(tf.random_normal([1]), name="bias_layer"+str(layer))
layer = tf.add(tf.matmul(input, weight), bias)
layer = tf.contrib.layers.batch_norm(layer,
center=True, scale=True,
is_training=phase)
layer = tf.minimum(tf.nn.relu(layer), FLAGS.relu_clip)
layer = tf.nn.dropout(layer, (1.0 - dropout))
return layer
def RNN(x, weights, biases, time_steps):
#shape the input as [batch_size*time_steps, input_depth]
x = tf.reshape(x, [-1,input_depth])
layer1 = getFullyConnected(input=x, hidden=16, dropout=full_drop, layer=1, phase=True)
layer2 = getFullyConnected(input=layer1, hidden=input_depth*3, dropout=full_drop, layer=2, phase=True)
rnn_input = tf.reshape(layer2, [-1,time_steps,input_depth*3])
# 1-layer LSTM with n_hidden units.
LSTM_cell = getLSTMcell(n_hidden)
#generate prediction
outputs, state = tf.nn.dynamic_rnn(LSTM_cell,
rnn_input,
dtype=tf.float32,
time_major=False)
#good old tensorboard saves
tf.summary.histogram('weight', weights['out'])
tf.summary.histogram('bias',biases['out'])
#there are time_steps outputs, but only grab the last output for the classification
return tf.sigmoid(tf.matmul(outputs[:,-1,:], weights['out']) + biases['out'])
令人惊讶的是,这个网络训练得非常好,在我的测试数据上给了我大约 99.75% 的准确率(这是经过训练的网络从未见过的)。但是,只有当我将训练数据以与训练期间相同的 mini-batch 大小输入网络时,它才得分这么高,6.如果我一次只输入一个样本(mini-batch size = 1) ,网络得分约为 60%。奇怪的是,如果我只用单个样本(mini-batch size = 1)训练网络,一旦网络训练好,训练后的网络就可以很好地工作并且准确度很高。这让我得出一个奇怪的结论,即网络几乎正在学习在其学习中利用批量大小,以至于它变得依赖于小批量来正确分类。
深度网络是否会在训练期间变得依赖于小批量的大小,以至于最终训练的网络需要输入数据具有相同的小批量大小才能正确执行?
所有的想法或想法都会被喜欢!