目前,我有一个神经网络,内置张量流,用于将时间序列数据分类为6个类别之一 . 该网络由以下部分组成:
2个完全连接的层 - > LSTM单元 - > softmax - >输出
所有层都以丢失和/或层归一化的形式进行正则化 . 为了加快训练过程,我使用的是迷你批量数据,其中 mini-batch size = # of categories = 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% . However, it only scored this high when I fed the training data into the network with a mini-batch size the same as during training, 6. 如果我一次只给一个样本提供训练数据(小批量大小= 1),那么网络得分约为60% . 奇怪的是,一旦网络训练完毕,就具有高精度的_2545497 . 这让我得出一个奇怪的结论,即网络几乎学会在学习中利用批量大小,以至于它依赖于小批量来正确分类 .
深度网络在培训期间是否依赖于小批量的大小,以至于最终经过培训的网络要求输入数据具有相同的小批量大小才能正确执行?
所有的想法或想法都会被爱!