2017-12-10 8 views
0

안녕 모두,Tensorflow는 - 신경 네트워크는 항상 내가 특정 기능에 따라 급여를 분류 신경망을 위해 노력 해왔다 같은 일

을 예측. 그러나이 신경망의 tensorflow 코드를 실행하면 어떤 기능이든 관계없이 동일한 것을 예측합니다. 신경망 개념 등을 읽었으며 내 코드가 개념적 지식으로 체크 아웃하므로 내가 뭘 잘못하고 있는지 혼란스러워. 제가이 분야에서 여전히 무지한만큼 당신이 철저하게 찾은 것을 설명하십시오. 나는 등, 학습 속도를 변경, 기본 정상화를 시도

Predicted Value : [140000] Expected Value : [150000] 
Predicted Value : [140000] Expected Value : [90000] 
Predicted Value : [140000] Expected Value : [140000] 
Predicted Value : [140000] Expected Value : [170000] 
Predicted Value : [140000] Expected Value : [105000] 
Predicted Value : [140000] Expected Value : [95000] 
Predicted Value : [140000] Expected Value : [145000] 
Predicted Value : [140000] Expected Value : [110000] 
Predicted Value : [140000] Expected Value : [160000] 
Predicted Value : [140000] Expected Value : [145000] 
Predicted Value : [140000] Expected Value : [130000] 
Predicted Value : [140000] Expected Value : [101000] 
... 

: 예측이처럼 보이는 판명 무엇

import tensorflow as tf 
import numpy as np 

n_inputs = 4 
n_hidden1 = 2 
n_hidden2 = 2 
n_outputs = 1000000 

X = tf.placeholder(tf.float32, shape=(None, n_inputs), name="X") 
y = tf.placeholder(tf.int64, shape=(None), name="y") 

with tf.name_scope("dnn"): 


    hidden1 = tf.layers.dense(X, n_hidden1, name="hidden1", 
           activation=tf.nn.relu) 

    hidden2 = tf.layers.dense(hidden1, n_hidden2, name="hidden2", 
           activation=tf.nn.relu) 

    logits = tf.layers.dense(hidden2, n_outputs, name="outputs") 

with tf.name_scope("loss"): 
    xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits) 
    loss = tf.reduce_mean(xentropy, name="loss") 

learning_rate = 0.1 

with tf.name_scope("train"): 
    optimizer = tf.train.GradientDescentOptimizer(learning_rate) 
    training_op = optimizer.minimize(loss) 



init = tf.global_variables_initializer() 

saver = tf.train.Saver() 

# Training data. In every 1-D array, the first 4 elements are features and the last element is a label/output. 
train_x = [[11, 3, 2, 4, 150000], [9, 2, 1, 2, 90000], [10, 4, 3, 1, 140000], [11, 3, 4, 4, 170000], 
      [8, 2, 1, 3, 105000], [7, 2, 1, 2, 95000], [11, 4, 2, 4, 145000], [10, 4, 1, 4, 110000], 
      [9, 3, 4, 4, 160000], [8, 2, 3, 4, 145000], [7, 4, 2, 4, 130000], [8, 2, 1, 2, 101000], 
      [10, 2, 2, 3, 130000], [10, 3, 3, 3, 140000], [8, 3, 1, 2, 105000], [7, 4, 1, 3, 95000], 
      [10, 3, 4, 3, 165000], [10, 3, 4, 4, 167000], [10, 4, 4, 1, 166000], [8, 4, 2, 4, 137000], 
      [9, 2, 2, 4, 140000], [8, 2, 2, 2, 142000], [9, 2, 2, 3, 143000], [9, 2, 2, 4, 144000], [8, 4, 2, 2, 140000], 
      [6, 4, 1, 4, 110000], [7, 3, 1, 2, 100000], [8, 3, 1, 3, 101000], [7, 2, 1, 3, 100000], [7, 2, 1, 3, 950000], 
      [7, 4, 1, 4, 980000], [8, 4, 1, 4, 100000], [8, 3, 1, 4, 100000], [9, 3, 1, 2, 101000], [8, 3, 1, 2, 107000], 
      [8, 3, 2, 2, 110000], [8, 2, 2, 3, 115000], [7, 4, 2, 2, 112000], [8, 2, 2, 4, 120000], [8, 4, 2, 4, 122000], 
      [8, 2, 2, 3, 120000], [8, 3, 2, 4, 123000], [8, 3, 2, 4, 121000], [8, 2, 2, 4, 121000], [8, 4, 2, 2, 120000]] 

with tf.Session() as sess: 
    init.run() 

#Training 
    for i in range(0, 45): 

     X_batch = [train_x[i][:4]] 
     y_batch = train_x[i][4:] 

     sess.run(training_op, feed_dict={X: X_batch, y: y_batch}) 

# Testing 
    for i in range(0, 45): 
     pred_data = logits.eval(feed_dict={X: [train_x[i][:4]]}) 
     pred = np.argmax(pred_data, axis=1) 
     print("Predicted Value : ", pred, " Expected Value :", train_x[i][4:]) 

이것은 :

이 내 코드입니다. 다른 게시물 및 질문에서 가져 왔지만 어디에도 없습니다.

는 당신의 도움을 주셔서 감사합니다.

+0

더 많은 데이터가 필요할 수 있습니다. 적어도 수백 개의 샘플들처럼 – Zoe

+0

이 좋겠지 만, 데이터를 여러 번 복제하고 수정하여 테스트 해 보았습니다. 귀하의 의견을 주셔서 감사합니다! –

답변

4

문제는이 회귀 문제를 분류 문제로 생각하고 있다고 생각합니다. 급여의 달러 수를 직접 예측하는 대신, 1,000,000 개의 길이 벡터를 생성 한 다음 가장 큰 값을 갖는 인덱스를 선택하는 것으로 보입니다.

이 접근 방식에는 4 가지 문제가 있습니다. 먼저, (4 x 2) + (2 x 2) + (2 x 1,000,000) = 2,000,012 에지 가중치를 45 개의 예제만으로 학습하려고합니다. 거의 충분하지 않습니다.

둘째, 분류 문제로 취급하고 싶다고 가정하면 입력 한 y은 정수이고 출력은 1,000,000 길이의 벡터입니다. 이 정수를 길이가 1,000,000 인 하나의 핫 벡터로 변환하여 입력 및 출력을 비교할 수있는 곳은 어디에도 없습니다.

셋째, 라벨이 상호 배타적 인 (즉, 누군가의 급여가 동시에 $ 15,000 및 $ 18,000 일 수없는) 여러 클래스 분류 문제의 경우 표준 절차는 출력에 softmax activation function을 부여하는 것입니다. 그물 효과는 훈련 동안 네트워크는 1에 가까운 값을 가진 출력 노드를 가지며 다른 모든 것은 0에 가깝다는 것을 학습합니다.

넷째, 급여 예측을 분류 문제로 처리하면 네트워크는 예상 값에서 $ 1 인 예상 급여를 $ 10,000의 예상 급여만큼 나쁘다고 간주합니다. 이것은 분명히 사실이 아닙니다. 1,000,000 개의 노드 출력을 훈련하는 대신 단일 노드를 교육 해보십시오 (부정적인 급여를 피하기 위해 relu 활성화가 있음). 그런 다음 출력 노드의 값을 argmax 대신 예측 된 급여로 사용하십시오.