2016-08-02 4 views
1

공식 사이트 tf.contrib.learn Quickstart의 예제에서와 같이 tensorflow를 사용하여 문장 분류기를 만들려고합니다. 그러나 내 자신의 데이터를 사용하여 먼저 모든 내 데이터 (다양한 길이의 문자열)를 사전을 사용하여 각 문장을 정수 배열로 변환합니다.Tensorflow DNNClassifier가 잘못된 예측을 반환합니다.

교육을위한 각 레코드에는 자체 지정된 레이블이 있습니다.

문제는 예측이 정확하지 않고, 일부만이 아니라 입력이 교육 자료 레코드와 같아도 결과가 잘못되었다고해도 문제가되지 않습니다.

def launchModelData(values, labels, sample, actionClasses): 

    #Tensor for trainig data 
    v = tf.Variable(values) 
    l = tf.Variable(labels) 

    #Data Sample 
    s = tf.Variable(sample) 

    # Build 3 layer DNN with 10, 20, 10 units respectively. 
    classifier = tf.contrib.learn.DNNClassifier(hidden_units=[10, 20, 10], n_classes=actionClasses) 

    # Add an op to initialize the variables. 
    init_op = tf.initialize_all_variables() 

    # Later, when launching the model 
    with tf.Session() as sess: 
     # Run the init operation. 
     sess.run(init_op) 

     # Fit model. 
     classifier.fit(x=v.eval(), y=l.eval(), steps=200) 

     # Classify one new sample. 
     new_sample = np.array(s.eval(), dtype=int) 
     y = classifier.predict(new_sample) 
     print ('Predictions: {}'.format(str(y))) 

    return y 

가치와 클래스 axample :
내 코드는 다음과 같이 보입니다

[0 1] 0 
[0 2] 0 
[0 4] 0 
[7 8] 1 
[7 9] 1 
[ 7 13] 1 
[14 15] 2 
[14 16] 2 
[14 18] 2 
[20 21] 3 
[26 27] 5 
[29 27] 5 
[31 32] 5 
... 

내가 그래서 덜 복잡 가능하게하려고 tensorflow에 새로 온 사람을, 어떤 도움도 환영 할 것이다.

편집
내 실제 훈련 데이터는 내가, 내가 더 큰 코퍼스 필요 그래서 아마, 내가 잘 시도하고 새로운 편집 내 출력을 보여줍니다 된 8 개 클래스와 예측에 그것을 시도 this.

입니다 . EDIT2

은 이제 다섯 층 [N, 2N, 4N, 8N, 16N : n 번째 클래스와 같이 = 20000의 조성물을 사용하여,이 손실을 감소시키고 실제로 잘 정확성을 높이지만 다시 한번 더 많은 양의 예측 (10 개 aprox)으로 예측이 잘못되게됩니다.

+0

첫째, 신경 네트워크는 학습 데이터의 스냅 샷을 저장하지 않습니다. 따라서 훈련 된 네트워크가 교육용 데이터에 대해 올바른 레이블을 출력 할 것으로 기대하지는 마십시오. 이러한 문제는 일반적으로 교육 자료가 충분하지 않아 발생합니다. 더 큰 훈련 세트를 사용해 보셨습니까? 추가 도움이 필요하면 연수에 대한 링크를 공유하십시오. –

+0

[data] (https://drive.google.com/open?id=0B3uEZ76zDg_wNXJnT3g5c0lWWjQ) 이것은 내 데이터입니다.이 경우 더 필요하다고 생각하십니까? 나는 60 개의 샘플 (값)과 8 개의 클래스 (타겟)와 같은 더 작은 세트로 같은 코드를 시도한다.그리고 예측이 좋았습니다. 그래서 더 많은 클래스 (타겟)가있을 때 더 많은 데이터가 필요하다고 생각했습니다. 도와 주셔서 감사합니다! –

+0

입력은 단지 두 단어입니까? – Aaron

답변

0

을, 그래서 DNN 분류에 대한 매개 변수를 변경하고 내 신체의 크기를 증가하고 작동 : 코드는 다음과 유사합니다 .
씩 단계적 = 25000+
-Layers = N/2, N * 2, N * 4 * N 8
* N = 번호 :이 파라미터 함께 aprox 내이었다 끝에

클래스
-Corpus 크기 = 30000 개 샘플
- 번호

(40)는 그래서 손실이 0.0945에 동일한 얻는다 이렇게 클래스 = ...와 정확도 = 0.896 ...,이 변경을 수행하는 사람을 도울 수 있는지 잘 모릅니다 만 그것은 나를 위해 않습니다.

0

세션 및 그래프 작성을 담당하는 tf.learn의 견적 도구. input_fn을 통해 입력 텐서를 얻습니다. 모든 적합/평가/예측은 새로운 세션과 그래프를 생성합니다. 내가 코드의 일부 내용을 변경했지만 전혀 진전이 없었다 결국

# Build 3 layer DNN with 10, 20, 10 units respectively. 
my_feature = tf.contrib.layers.real_valued_column('my_feature') 
classifier = tf.contrib.learn.DNNClassifier(feature_columns=[my_feature], hidden_units=[10, 20, 10], n_classes=actionClasses) 

def _my_train_data(): 
    return {'my_feature': tf.constant(values), tf.constant(labels) 

classifier.fit(input_fn=_my_train_data, steps=200) 

# Classify one new sample. 
def _my_predict_data(): 
    return {'my_feature': tf.Constant(s) 
y = classifier.predict(input_fn=_my_predict_data) 
print ('Predictions: {}'.format(str(y))) 

return y 
+0

흠 .. 나는 당신의 코드 중 일부를 사용하려고하지만 다음 줄은 나에게 오류를주기 때문에'return { 'my_feature': tf.constant (values), tf.constant (labels)}' 'classifier.fit (input_fn = _my_train_data, steps = 200) '에 의 압축을 풀려면 1 개 이상의 값이 필요합니다. 그런데 도움에 감사드립니다. –

+0

'return { 'my_feature': tf.constant (values)}, tf.constant (labels)'로 변경했는데 다음 줄에서 오류가 발생했습니다 :'250 요소로 텐서를 다시 만들 수 없습니다 [125, 1 ]'. –

관련 문제