tensorflow - 为什么我不能使用 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)
解决方案
忽略神经网络是解决此问题的一种奇怪方法这一事实,并回答您的具体问题 - 看起来您的学习率可能太高,这可以解释最佳点周围的波动。
推荐阅读
- javascript - 如何让一个函数在运行之前等待另一个函数的完成
- css - Bootstrap 类留下了一些我需要删除的空格
- vue.js - Vuetify `v-file-input` 在选择文件后立即提交文件,而不是在点击提交后
- python - 创建一个 pdf 文件,在其中写入并使用 PyMuPDF 返回其字节流
- javascript - 制表器在添加/更新行后不会重新排序数据
- javascript - JavaScript 如何在 DIV 中打印标签?
- laravel - 在 laravel 中全局搭建 vue 的问题
- pandas - Jupyter notebook 500 错误和 Dataframe 问题
- linux - 如何将挂载的文件夹链接到 Laravel 项目?
- powerbi - PowerQuery - 当第二个表中的行在第一个表中不存在时,将行从第二个表添加到表中