2017-10-09 3 views
0

Keras로 기계 학습을 시작하려고합니다.Keras : 정확도가 0으로 유지됩니다.

저는 수학자가 아니며 신경망이 어떻게 작동하는지 (하하는 이해할 수있는 것)에 대해서만 기본적으로 이해하고 있으므로 쉽게 이해할 수 있습니다.

이 내 현재 코드입니다 :

from keras.utils import plot_model 
from keras.models import Sequential 
from keras.layers import Dense 
from keras import optimizers 
import numpy 

# fix random seed for reproducibility 
numpy.random.seed(7) 

# split into input (X) and output (Y) variables 
X = [] 
Y = [] 
count = 0 

while count < 10000: 
    count += 1 
    X += [count/10000] 
    numpy.random.seed(count) 
    #Y += [numpy.random.randint(1, 101)/100] 
    Y += [(count + 1)/100] 
print(str(X) + ' ' + str(Y)) 

# create model 
model = Sequential() 
model.add(Dense(50, input_dim=1, kernel_initializer = 'uniform', activation='relu')) 
model.add(Dense(50, kernel_initializer = 'uniform', activation='relu')) 
model.add(Dense(1, kernel_initializer = 'uniform', activation='sigmoid')) 

# Compile model 
opt = optimizers.SGD(lr=0.01) 
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy']) 

# Fit the model 
model.fit(X, Y, epochs=150, batch_size=100) 

# evaluate the model 
scores = model.evaluate(X, Y) 
predictions = model.predict(X) 
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) 
print (str(predictions)) 
##plot_model(model, to_file='C:/Users/Markus/Desktop/model.png') 

정확도는 제로 유지하고 예측이 하나의 배열입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

2

분류 문제 (하나의 핫 벡터 스타일 출력/범주에 입력 입력)보다는 회귀 문제 (부동 소수점 함수 출력)를 해결하려고하는 것을 볼 수 있습니다.

시그마 이드 최종 레이어는 0과 1 사이의 출력만을 제공하므로 NN이 원하는 Y 값 범위를 훨씬 더 높게 예측할 수 있습니다. 귀하의 NN은 가능한 한 가까이 가려고하지만, 귀하는 그것을 제한하고 있습니다! 출력 레이어의 시그 모이 드는 단일 클래스 예/아니요 출력에는 적합하지만 회귀에는 적합하지 않습니다.

따라서 마지막 레이어에 입력이 합산되는 선형 활성화가 필요합니다. S 자형 대신에 이런 것이 있습니다. model.add(Dense(1, kernel_initializer='lecun_normal', activation='linear'))

적어도 학습 속도가 충분히 낮은 경우에는 작동합니다.

유용한 링크에 대한 Google "keras regression"

1

binary_crossentropy 손실 기능이있는 이진 분류를 시도하는 것 같습니다. 그러나 클래스 레이블 Y은 수레입니다. 라벨은 0 또는 1이어야합니다. 따라서 가장 큰 문제는 입력 데이터에 있으며 모델에 교육을 제공하는 것입니다.

당신은 예를 들어, 두 개의 데이터가 두 개의 서로 다른 정규 분포에서 샘플링 클래스 및 레이블을 더 의미가 일부 데이터를 시도 할 수 있습니다

각 관측 0 또는 1입니다

X = np.concatenate([np.random.randn(10000)/2, np.random.randn(10000)/2+1]) 

Y = np.concatenate([np.zeros(10000), np.ones(10000)]) 

모델해야 이 유형의 데이터로 어딘가에 갈 수 있어야합니다.

+0

float 예측을하는 방법이 없습니까? –

+0

가능합니다. 손실 함수를 평균 제곱 오차와 같은 것으로 변경해야합니다. 이것을 확인하십시오 : [] (https://keras.io/losses/). 또한 마지막 레이어에서 시그마 이드 활성화를 제거하려고합니다. –

+0

그래, 작동하도록했습니다. 그러나 손실은 거의 없으며 작은 단계만으로 감소합니다. 어떤 매개 변수를 사용하면 어떤 종류의 네트워크를 추천합니까? –

관련 문제