Batch_norm, производительность
Я использовал простую сеть с и без batchnorm, но с batchnorm я получаю худший результат, это нормально? То же самое произошло, когда я сравнил свою простую сеть с регуляризатором и без него. Ниже показано, как я определил свою сеть с помощью пакетной нормы.
with tf.device("/gpu:0"):
x = tf.placeholder(tf.float32, [None, feature_dim], name="input")
y_ = tf.placeholder(tf.float32, [None, output_dim],name="output")
phase = tf.placeholder(tf.bool, name='phase')
weights = {
'hidden1': tf.Variable(tf.random_normal([feature_dim, hidden_num_units1], stddev=1 / np.sqrt(feature_dim)), name="w1"),
'hidden2': tf.Variable(
tf.random_normal([hidden_num_units1, hidden_num_units2], stddev=1 / np.sqrt(hidden_num_units1)), name="w2"),
'output': tf.Variable(
tf.random_normal([hidden_num_units2, output_num_units], stddev=1 / np.sqrt(hidden_num_units2)), name="w3")
}
biases = {
'hidden1': tf.Variable(tf.random_normal([hidden_num_units1], stddev=1 / np.sqrt(hidden_num_units1)), name="b1"),
'hidden2': tf.Variable(tf.random_normal([hidden_num_units2], stddev=1 / np.sqrt(hidden_num_units2)), name="b2"),
'output': tf.Variable(tf.random_normal([output_num_units], stddev=1 / np.sqrt(output_num_units)), name="b3")
}
def network1(data):
with tf.name_scope(name="layer_1"):
h1 = tf.add(tf.matmul(data, weights['hidden1']), biases['hidden1'])
h1_BN = tf.contrib.layers.batch_norm(h1,
center=True, scale=True,
is_training=phase,
scope='hidden_layer1_bn')
h1_relu = tf.nn.relu(h1_BN)
with tf.name_scope(name="layer_2"):
h2 = tf.add(tf.matmul(h1_relu, weights['hidden2']), biases['hidden2'])
h2_BN = tf.contrib.layers.batch_norm(h2,
center=True, scale=True,
is_training=phase,
scope='hidden_layer2_bn')
h2_relu = tf.nn.relu(h2_BN)
with tf.name_scope(name="output_layer"):
output_layer = tf.add(tf.matmul(h2_relu, weights['output']), biases['output'])
output__layer_BN = tf.contrib.layers.batch_norm(output_layer,
center=True, scale=True,
is_training=phase,
scope='output_bn')
output = tf.sigmoid(output__layer_BN, name="f" )
return output
Этот с отсева:
def network1(data):
weights = {
'hidden1': tf.Variable(tf.random_normal([feature_dim, hidden_num_units1], stddev=1 / np.sqrt(feature_dim)), name="w1"),
'hidden2': tf.Variable(
tf.random_normal([hidden_num_units1, hidden_num_units2], stddev=1 / np.sqrt(hidden_num_units1)), name="w2"),
'output': tf.Variable(
tf.random_normal([hidden_num_units2, output_num_units], stddev=1 / np.sqrt(hidden_num_units2)), name="w3")
}
biases = {
'hidden1': tf.Variable(tf.random_normal([hidden_num_units1], stddev=1 / np.sqrt(hidden_num_units1)), name="b1"),
'hidden2': tf.Variable(tf.random_normal([hidden_num_units2], stddev=1 / np.sqrt(hidden_num_units2)), name="b2"),
'output': tf.Variable(tf.random_normal([output_num_units], stddev=1 / np.sqrt(output_num_units)), name="b3")
}
with tf.name_scope(name = "layer_1"):
hidden_layer1 = tf.add(tf.matmul(data, weights['hidden1']), biases['hidden1'])
hidden_layer1 = tf.nn.relu(hidden_layer1)
with tf.name_scope(name = "layer_1_dropout"):
drop_out1 = tf.nn.dropout(hidden_layer1, keep_prob) # DROP-OUT here
with tf.name_scope(name = "layer_2"):
hidden_layer2 = tf.add(tf.matmul(drop_out1, weights['hidden2']), biases['hidden2'])
hidden_layer2 = tf.nn.relu(hidden_layer2)
with tf.name_scope(name = "layer_2_dropout"):
drop_out2 = tf.nn.dropout(hidden_layer2, keep_prob) # DROP-OUT here
with tf.name_scope(name = "output_layer"):
output = tf.add(tf.matmul(drop_out2, weights['output']), biases['output'])
output = tf.nn.sigmoid(output, name="f")
return output
Нормально ли это, когда вы примените их, у вас ухудшится производительность, или я допустил ошибку, когда определил это? (Параметр выпадения настроен, и производительность все еще не лучше, чем у того же структурированного NN без выпадения)