首页 > 解决方案 > 为什么我不能使用 NN 对这个简单问题上的数据进行完美分类?

问题描述

我有一组由 10 个特征组成的观察结果,每个特征都是区间 (0,2) 中的实数。假设我想训练一个简单的神经网络来分类这些特征的平均值是高于还是低于 1.0。

除非我遗漏了什么,否则对于每层一个神经元的两层网络就足够了。激活函数将是第一层上的线性函数(即无激活函数)和输出层上的 sigmoid。具有这种架构的 NN 的一个示例是计算第一层的平均值(即所有权重 = 0.1 和偏差 = 0)并评估第二层中的平均值是高于还是低于 1.0(即权重 = 1.0和偏差 = -1.0)。

当我使用 TensorFlow 实现这一点时(见下面的代码),我显然很快就获得了非常高的准确度,但从来没有达到 100% 的准确度......我想从概念上理解为什么会这样。我不明白为什么反向传播算法没有达到一组最佳权重(可能这与我正在使用的具有局部最小值的损失函数有关?)。另外我想知道如果我使用不同的激活和/或损失函数是否可以达到 100% 的准确率。

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt 

X = [np.random.random(10)*2.0 for _ in range(10000)]
X = np.array(X)
y = X.mean(axis=1) >= 1.0
y = y.astype('int')

train_ratio = 0.8
train_len = int(X.shape[0]*0.8)
X_train, X_test = X[:train_len,:], X[train_len:,:]
y_train, y_test = y[:train_len], y[train_len:]

def create_classifier(lr = 0.001):
  classifier = tf.keras.Sequential()
  classifier.add(tf.keras.layers.Dense(units=1))
  classifier.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))#, input_shape=input_shape))
  optimizer = tf.keras.optimizers.Adam(learning_rate=lr)
  metrics=[tf.keras.metrics.BinaryAccuracy()],
  classifier.compile(optimizer=optimizer, loss=tf.keras.losses.BinaryCrossentropy(from_logits=False), metrics=metrics)  
  return classifier

classifier = create_classifier(lr = 0.1)
history = classifier.fit(X_train, y_train, batch_size=1000, validation_split=0.1, epochs=2000)

标签: tensorflowmachine-learningkerasneural-network

解决方案


忽略神经网络是解决此问题的一种奇怪方法这一事实,并回答您的具体问题 - 看起来您的学习率可能太高,这可以解释最佳点周围的波动。


推荐阅读