gpt4 book ai didi

python - Keras:简单数据的简单神经网络不起作用

转载 作者:行者123 更新时间:2023-12-03 23:44:48 26 4
gpt4 key购买 nike

我尝试创建一个非常简单的神经网络:一个隐藏层,带有 2 个神经元。对于一些非常简单的数据:只有一个特征。

import numpy as np
X=np.concatenate([np.linspace(0,10,100),np.linspace(11,20,100),np.linspace(21,30,100)])
y=np.concatenate([np.repeat(0,100),np.repeat(1,100),np.repeat(0,100)])
enter image description here
这是模型
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(2, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.fit(X, y, epochs=200)
理论上,这个模型应该有效。但即使在 1000 个 epoch 之后,准确率仍然是 0.667。
Epoch 999/1000
10/10 [==============================] - 0s 1ms/step - loss: 0.5567 - accuracy: 0.6667
Epoch 1000/1000
10/10 [==============================] - 0s 2ms/step - loss: 0.5566 - accuracy: 0.6667
我想我做错了什么。你能建议一些修改吗?
好像有很多 本地最小值 初始化 可以更改最终模型。使用包 nnet 进行测试时就是这种情况在 R. 我不得不测试很多种子,我发现了这个模型(等等)。
enter image description here
这就是我想用 keras 创建的结构:一个带有 2 个神经元的隐藏层。激活函数是 sigmoid。
所以我想知道keras是否有同样的初始化问题。有了这个包裹 nnet在 R 中,我认为它不是一个“完美”的包。我认为 keras 的性能会更好。如果初始化很重要,keras 会测试不同的初始化吗?如果不是为什么?也许是因为一般来说,拥有更多数据(和更多功能),效果会更好(无需测试许多初始化)?
例如,使用kmeans,似乎测试了不同的初始化。

最佳答案

这个问题显示了输入数据归一化对神经网络的重要性。如果没有标准化,训练神经网络有时会很困难,因为优化可能会卡在某些局部最小值处。
我想从数据集的可视化开始。数据集是一维的,在使用标准归一化进行归一化后,它看起来如下所示。

X_original = np.concatenate([np.linspace(0, 10, 100), np.linspace(
11, 20, 100), np.linspace(21, 30, 100)])
X = (X_original - X_original.mean())/X_original.std()

y = np.concatenate(
[np.repeat(0, 100), np.repeat(1, 100), np.repeat(0, 100)])
plt.figure()
plt.scatter(X, np.zeros(X.shape[0]), c=y)
plt.show()
enter image description here
将这些数据点分成各自类别的最佳方法是在输入空间上画两条线。由于输入空间是一维的,分类边界只是一维点。
这意味着逻辑回归等单层网络无法对这个数据集进行分类。但是具有两层后跟非线性激活的神经网络应该能够对数据集进行分类。
现在通过归一化和以下训练脚本,模型可以轻松学习对点进行分类。
model = Sequential()
model.add(Dense(2, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.Adam(1e-1), metrics=['accuracy'])
model.fit(X, y, epochs=20)

Train on 300 samples
Epoch 1/20
300/300 [==============================] - 1s 2ms/sample - loss: 0.6455 - accuracy: 0.6467
Epoch 2/20
300/300 [==============================] - 0s 79us/sample - loss: 0.6493 - accuracy: 0.6667
Epoch 3/20
300/300 [==============================] - 0s 85us/sample - loss: 0.6397 - accuracy: 0.6667
Epoch 4/20
300/300 [==============================] - 0s 100us/sample - loss: 0.6362 - accuracy: 0.6667
Epoch 5/20
300/300 [==============================] - 0s 115us/sample - loss: 0.6342 - accuracy: 0.6667
Epoch 6/20
300/300 [==============================] - 0s 96us/sample - loss: 0.6317 - accuracy: 0.6667
Epoch 7/20
300/300 [==============================] - 0s 93us/sample - loss: 0.6110 - accuracy: 0.6667
Epoch 8/20
300/300 [==============================] - 0s 110us/sample - loss: 0.5746 - accuracy: 0.6667
Epoch 9/20
300/300 [==============================] - 0s 142us/sample - loss: 0.5103 - accuracy: 0.6900
Epoch 10/20
300/300 [==============================] - 0s 124us/sample - loss: 0.4207 - accuracy: 0.9367
Epoch 11/20
300/300 [==============================] - 0s 124us/sample - loss: 0.3283 - accuracy: 0.9833
Epoch 12/20
300/300 [==============================] - 0s 124us/sample - loss: 0.2553 - accuracy: 0.9800
Epoch 13/20
300/300 [==============================] - 0s 138us/sample - loss: 0.2030 - accuracy: 1.0000
Epoch 14/20
300/300 [==============================] - 0s 124us/sample - loss: 0.1624 - accuracy: 1.0000
Epoch 15/20
300/300 [==============================] - 0s 150us/sample - loss: 0.1375 - accuracy: 1.0000
Epoch 16/20
300/300 [==============================] - 0s 122us/sample - loss: 0.1161 - accuracy: 1.0000
Epoch 17/20
300/300 [==============================] - 0s 115us/sample - loss: 0.1025 - accuracy: 1.0000
Epoch 18/20
300/300 [==============================] - 0s 126us/sample - loss: 0.0893 - accuracy: 1.0000
Epoch 19/20
300/300 [==============================] - 0s 121us/sample - loss: 0.0804 - accuracy: 1.0000
Epoch 20/20
300/300 [==============================] - 0s 132us/sample - loss: 0.0720 - accuracy: 1.0000
由于模型非常简单,学习率和优化器的选择会影响学习的速度。使用 SGD 优化器和学习率 1e-1,与具有相同学习率的 Adam 优化器相比,模型可能需要更长的时间来训练。

关于python - Keras:简单数据的简单神经网络不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63495532/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com