目前,我有一个神经网络,内置张量流,用于将时序数据分类为6个类别之一。该网络由以下部分组成:
2个完全连接的层 - > LSTM单元 - > softmax - >输出
所有层都以丢失和/或层规范化的形式进行正则化。为了加快培训过程,我使用的是迷你批处理数据,其中小批量大小=类别数= 6 。每个小批量包含6个类别中每个类别的一个样本,在小批量中随机排列。下面是前馈代码,其中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%。 但是,当我将训练数据输入到与训练期间相同的小批量大小的网络时,它只获得了这么高的分数。如果我一次只提供一个样本的训练数据(小批量大小= 1),网络得分率在60%左右。奇怪的是,如果我只使用单个样本(小批量大小= 1)训练网络,一旦网络训练,训练好的网络就能以高精度完美地工作。这让我得出一个奇怪的结论,即网络几乎学会在学习中利用批量大小,以至于它依赖于小批量来正确分类。
深度网络在培训期间是否依赖于小批量的大小,以至于最终经过培训的网络要求输入数据具有相同的小批量大小才能正确执行?
所有想法或想法都会被喜爱!