当前位置: 首页 > 知识库问答 >
问题:

神经网络(无隐藏层)与逻辑回归?

单于阳
2023-03-14

我一直在上神经网络的课,不太明白为什么我从逻辑回归的准确度得分和两层神经网络(输入层和输出层)中得到不同的结果。输出层使用sigmoid激活功能。据我所知,我们可以使用神经网络中的sigmoid激活函数来计算概率。这应该是非常相似的,如果不完全相同的逻辑回归试图完成。然后从那里使用梯度下降进行反向传播以最小化误差。这可能有一个简单的解释,但我不明白为什么准确度得分差异如此之大。在这个例子中,我没有使用任何训练或测试集,只使用简单的数据来证明我不理解的内容。

逻辑回归的准确率为71.4%。在下面的示例中,我只是为“X”和“y”数组创建了数字。当结果等于“1”时,我故意使“X”的数字更高,以便线性分类器具有一定的准确性。

import numpy as np
from sklearn.linear_model import LogisticRegression
X = np.array([[200, 100], [320, 90], [150, 60], [170, 20], [169, 75], [190, 65], [212, 132]])
y = np.array([[1], [1], [0], [0], [0], [0], [1]])

clf = LogisticRegression()
clf.fit(X,y)
clf.score(X,y) ##This results in a 71.4% accuracy score for logistic regression

然而,当我实现一个没有隐藏层的神经网络时,只需将sigmoid激活函数用于单节点输出层(所以总共有两层,输入层和输出层)。我的准确率大约是42.9%?为什么这与逻辑回归准确度得分有显著差异?为什么这么低?

import keras
from keras.models import Sequential
from keras.utils.np_utils import to_categorical
from keras.layers import Dense, Dropout, Activation

model = Sequential()

#Create a neural network with 2 input nodes for the input layer and one node for the output layer. Using the sigmoid activation function
model.add(Dense(units=1, activation='sigmoid', input_dim=2))
model.summary()
model.compile(loss="binary_crossentropy", optimizer="adam", metrics = ['accuracy'])
model.fit(X,y, epochs=12)

model.evaluate(X,y) #The accuracy score will now show 42.9% for the neural network

共有1个答案

谷梁镜
2023-03-14

你不是在比较同一件事。Sklearn的LogisticRegression设置了许多您在Keras实现中没有使用的默认值。在考虑这些差异时,我实际得到的精确度在1e-8以内,主要有:

迭代次数

在Keras中,这是在fit()期间传递的纪元。您将其设置为12。在SkLearning中,这是在Logistic Regression__init__()期间传递的max_iter。它默认为100。

优化器

您正在Keras中使用adam优化器,而默认情况下LogisticRegression使用liblinear优化器。Sklearn将其称为解算器。

正则化

Sklearn的LogisticRegression默认情况下使用L2正则化,并且您在Keras中没有进行任何权重正则化。在Sklearn中,这是惩罚,在Keras中,可以使用每层的kernel\u正则化器对权重进行正则化。

这些实现都达到了0.5714%的精度:

import numpy as np

X = np.array([
  [200, 100], 
  [320, 90], 
  [150, 60], 
  [170, 20], 
  [169, 75], 
  [190, 65], 
  [212, 132]
])
y = np.array([[1], [1], [0], [0], [0], [0], [1]])

逻辑回归

from sklearn.linear_model import LogisticRegression

# 'sag' is stochastic average gradient descent
lr = LogisticRegression(penalty='l2', solver='sag', max_iter=100)

lr.fit(X, y)
lr.score(X, y)
# 0.5714285714285714

神经网络

from keras.models import Sequential
from keras.layers import Dense
from keras.regularizers import l2

model = Sequential([
  Dense(units=1, activation='sigmoid', kernel_regularizer=l2(0.), input_shape=(2,))
])

model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.fit(X, y, epochs=100)
model.evaluate(X, y)
# 0.57142859697341919
 类似资料:
  • 例如,我的训练集是20 x 20个图像或400个特征图像来识别书写数字,我假设我在NNs中有模型3层:输入层包含400个神经元;一个隐藏层包含25个神经元,输出层包含10个神经元。我读了《神经网络与深度学习》的第一章。 最后一部分“一个简单的手写数字分类网络”(您可以使用ctrl-f进行搜索),它说“隐藏层中的神经元检测是否存在以下图像”。所以,它想说隐藏层中的神经元是通过图像呈现的吗?我认为它们

  • 神经网络 (Neural Network) 是机器学习的一个分支,全称人工神经网络(Artificial Neural Network,缩写 ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。 Perceptron (感知器) 一个典型的神经网络由输入层、一个或多个隐藏层以及输出层组成,其中箭头代表着数据流动的方向,而圆圈代表激活函数(最常用的激活函数为

  • 译者:bat67 最新版会在译者仓库首先同步。 可以使用torch.nn包来构建神经网络. 我们以及介绍了autograd,nn包依赖于autograd包来定义模型并对它们求导。一个nn.Module包含各个层和一个forward(input)方法,该方法返回output。 例如,下面这个神经网络可以对数字进行分类: 这是一个简单的前馈神经网络(feed-forward network)。它接受一

  • 第 10 章介绍了人工神经网络,并训练了我们的第一个深度神经网络。 但它是一个非常浅的 DNN,只有两个隐藏层。 如果你需要解决非常复杂的问题,例如检测高分辨率图像中的数百种类型的对象,该怎么办? 你可能需要训练更深的 DNN,也许有 10 层,每层包含数百个神经元,通过数十万个连接来连接。 这不会是闲庭信步: 首先,你将面临棘手的梯度消失问题(或相关的梯度爆炸问题),这会影响深度神经网络,并使较

  • 完全错误: 问题 我一直在努力建立一个神经网络,因为它不断抱怨收到的形状。x\u trian和y\u train的形状都是(20,)但当我将其输入为input\u形状时,它表示希望输入形状的值为20,但实际上收到了(None,1)。 我不明白(无,1)来自哪里,因为当我打印x_train和y_train的形状时,它给了我(20,)。它们都是数字数组。 代码 我试过的 然后我把input_shape

  • 我玩神经网络。我了解卷积层、完全连接层和许多其他东西是如何工作的。我还知道什么是梯度,以及如何训练这样的网络。 框架千层面包含一个称为InverseLayer的层。 InverseLayer类通过应用要反转的层相对于其输入的偏导数,对神经网络的单层执行反转操作。 我不知道这是什么意思,或者我应该在什么时候使用这个层。或者倒置偏导数背后的想法是什么? 非常感谢你