Keras : 단순 데이터가 작동하지 않는 단순 신경망
저는 매우 간단한 신경망을 만들려고합니다. 하나의 은닉층에 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)])

여기 모델이 있습니다
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 에서 패키지 로 테스트하는 경우 입니다. 많은 시드를 테스트해야했지만이 모델을 찾았습니다.

이것이 제가 keras로 만들고 싶었던 구조입니다. 하나는 2 개의 뉴런이있는 은닉층입니다. 활성화 함수는 시그 모이 드입니다.
그래서 keras가 초기화와 동일한 문제가 있는지 궁금합니다. nnet
R 의이 패키지 를 사용하면 "완벽한"패키지가 아니라고 생각했습니다. 그리고 나는 keras가 더 성능이 좋을 것이라고 생각했습니다. 초기화가 중요한 경우 keras는 다른 초기화를 테스트합니까? 이유가 아니라면? 일반적으로 더 많은 데이터 (및 더 많은 기능)가 더 많은 초기화를 테스트하지 않고도 더 잘 작동하기 때문일까요?
예를 들어 kmeans를 사용하면 다른 초기화가 테스트되는 것처럼 보입니다.
답변
이 질문은 신경망에 대한 입력 데이터 정규화의 중요성을 보여줍니다. 정규화가 없으면 최적화가 일부 로컬 최소값에서 멈출 수 있기 때문에 신경망 훈련이 때때로 어렵습니다.
데이터 세트 시각화부터 시작하겠습니다. 데이터 세트는 1D이며 표준 정규화로 정규화 한 후 다음과 같습니다.
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()

이는 로지스틱 회귀와 같은 단일 계층 네트워크가이 데이터 세트를 분류 할 수 없음을 의미합니다. 그러나 비선형 활성화가 뒤 따르는 두 개의 계층이있는 신경망은 데이터 세트를 분류 할 수 있어야합니다.
이제 정규화와 다음 학습 스크립트를 통해 모델은 포인트 분류 방법을 쉽게 배울 수 있습니다.
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 최적화 프로그램보다 모델을 학습하는 데 시간이 더 오래 걸릴 수 있습니다.