繁体   English   中英

二进制分类问题的准确性极高

[英]Suspiciously high accuracy for binary classification problem

基于图层功能

def neuron_layer(X, n_neurons, name, activation_fn=None):
    with tf.name_scope(name):
        n_inputs = int(X.get_shape()[1])
        stddev = 2 / np.sqrt(n_inputs)
        init = tf.truncated_normal((n_inputs, n_neurons), stddev=stddev)
        W = tf.Variable(init, name="kernel")
        b = tf.Variable(tf.zeros([n_neurons]), name="bias")
        Z = tf.matmul(X, W) + b
        if activation_fn is not None:
            return activation_fn(Z)
        else:
            return Z

构建了用于二进制分类问题的以下网络:

n_hidden1 = 100
n_hidden2 = 120
n_outputs = 1 # single value prediction
n_inputs = X_test.shape[1]

reset_graph()
X = tf.placeholder(tf.float32, shape=(None, n_inputs), name="X")
y = tf.placeholder(tf.float32, shape=(None), name="y")

layer1 = neuron_layer(X, n_hidden1, "layer1", activation_fn=tf.nn.relu)
layer2 = neuron_layer(layer1, n_hidden2, "layer2", activation_fn=tf.nn.relu)
prediction = neuron_layer(layer2, n_outputs, "output",activation_fn=tf.nn.sigmoid)
cost = tf.losses.log_loss(y,prediction)
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
init = tf.global_variables_initializer()

训练程序

learning_rate = 0.01
n_epochs = 20
batch_size = 60
num_rec = X_train.shape[0]
n_batches = int(np.ceil(num_rec / batch_size))
acc_test = 0. #  assign the result of accuracy testing to this variable

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(n_epochs):
        for batch_index in range(n_batches):
            X_batch,y_batch = random_batch(X_train,Y_train,batch_size)
            _,opt = sess.run([optimizer,cost], feed_dict={X: X_batch, y: y_batch})
            loss, acc = sess.run([cost, accuracy], feed_dict={X: X_batch,y: y_batch})
        print("epoch " + str(epoch) + ", Loss= " + \
                      "{:.6f}".format(loss) + ", Training Accuracy= " + \
                      "{:.5f}".format(acc))
        print("Optimization Finished!")
    _, acc_test = sess.run([cost, accuracy], feed_dict={X:X_test,y:Y_test})

生成以下输出:

时代0,损失= -6.756775,训练精度= 1.00000优化完成! [。 。]时代19,损失= -6.769919,训练准确度= 1.00000优化完成!

测试集acc_test的准确性为1.0。

批次是由

def random_batch(X_train, y_train, batch_size):
    np.random.seed(42)
    rnd_indices = np.random.randint(0, len(X_train), batch_size)
    X_batch = X_train[rnd_indices]
    y_batch = y_train[rnd_indices]
    return X_batch, y_batch

输入形状是

print(X_batch.shape,y_batch.shape,X_test.shape,Y_test.shape) 
>(60, 3) (60, 1) (2500, 3) (2500, 1)

显然,培训和测试的准确性是不正确的。 网络,培训或评估程序中的问题可能在哪里?

由于模型过拟合,因此在初始时期您将获得异常高的准确性,为避免过度拟合,可以使用正则化方法或通过扩充来增加数据集。 使用ImageDataGenerator进行扩充,它将提供图像以进行批量建模。 尝试将辍学设置为0.2。 在回调中启用提前停止,当模型性能下降时,它将终止训练。 尽早尝试忍耐。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM