1

멀티 라벨 텍스트 문서 분류를위한 신경망을 만드는 중입니다. 저는 Vector (V)에 저장된 3750 단어의 어휘를 가지고 있습니다.n 에포크 이후에 gredient descent optamization이 증가한 비용 함수 값

각 입력 문서에 대해 크기가 3750 인 벡터 (I)를 만듭니다. 입력 문서의 용어가 벡터 (V)의 x 색인에있는 어휘에서 발견되면 벡터의 x 색인은 1로 표시됩니다 0. 예. [1, 1, 0, 0, 0,1, ....]

레이블의 경우 Vector (L)에 저장된 1500 개의 레이블 어휘가 있습니다. 위와 같이 각 문서에 대해 벡터 (LB)를 만들고 문서에 레이블 x가 있으면 i 번째 인덱스를 1로 표시했습니다.

레이블 데이터는 [0, 0, 1, 0, 1, ..., 0]과 같이 1550 개의 요소가있는 벡터로 표현됩니다. i 번째 요소는 i 번째 레이블이 텍스트의 양수 레이블인지 여부를 나타냅니다. 텍스트의 레이블 수는 텍스트에 따라 다릅니다.

여기 내 코드입니다.

from __future__ import division 
import tensorflow as tf 
import numpy as np 
import time 

def csv_to_numpy_array(filePath, delimiter): 
    return np.genfromtxt(filePath, delimiter=delimiter, dtype=None) 


def import_data(): 
    print("Load training data") 
    trainX = csv_to_numpy_array("/home/shahzeb/temp/train_data/trainX.csv", delimiter=",") 
    trainY = csv_to_numpy_array("/home/shahzeb/temp/train_data/trainY.csv", delimiter=",") 
    return trainX, trainY 


startTime = time.time() 
trainX, trainY = import_data() 

learning_rate = 0.001 
training_epochs = 500 

# Network Parameters 
n_hidden_1 = 3560 # 1st layer number of features 
n_hidden_2 = 3560 # 2nd layer number of features 
n_input = trainX.shape[1] 
n_classes = trainY.shape[1] 

# tf Graph input 
input_neurons = tf.placeholder("float", [None, n_input],name="input") 
known_outputs = tf.placeholder("float", [None, n_classes],name="labels") 


def model(x): 

    with tf.name_scope("Relu_activation"): 
     # Hidden layer with RELU activation 
     w1 = tf.Variable(tf.random_normal([n_input, n_hidden_1]), name="w") 
     b1 = tf.Variable(tf.random_normal([n_hidden_1]), name="b") 
     layer_1 = tf.add(tf.matmul(x, w1), b1) 
     layer_1 = tf.nn.relu(layer_1) 
     # Hidden layer with sigmoid activation 
    with tf.name_scope("Sigmoid"): 
     w2 = tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2]), name="w") 
     b2 = tf.Variable(tf.random_normal([n_hidden_2]), name="b") 
     layer_2 = tf.add(tf.matmul(layer_1, w2), b2) 
     layer_2 = tf.nn.sigmoid(layer_2) 
     # Output layer with linear activation 
    with tf.name_scope("output"): 
     w3 = tf.Variable(tf.random_normal([n_hidden_2, n_classes]), name="w") 
     b3 = tf.Variable(tf.random_normal([n_classes]), name="b") 
     out_layer = tf.matmul(layer_2, w3) + b3 
     return out_layer,w1,w2,w3 

model_output_OP, w_1,w_2,w_3 = model(input_neurons) 

with tf.name_scope("cost"): 
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=model_output_OP, labels=known_outputs)) 

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

with tf.name_scope("accuracy"): 
    correct_predictions_OP = tf.equal(tf.argmax(model_output_OP, 1), tf.argmax(known_outputs, 1)) 
    accuracy_OP = tf.reduce_mean(tf.cast(correct_predictions_OP, "float"), name="Accuracy_op") 

with tf.name_scope("summary"): 
    model_output_OP_summary = tf.summary.histogram("output", model_output_OP) 
    accuracy_OP_summary = tf.summary.scalar("accuracy",accuracy_OP) 
    cost_summary = tf.summary.scalar("cost",cost) 
    summary_op = tf.summary.merge_all() 
    writer = tf.summary.FileWriter("/home/shahzeb/temp/summarylogs/", graph=tf.get_default_graph()) 

init = tf.global_variables_initializer() 

with tf.Session() as sess: 
    sess.run(init) 
    # Training cycle 
    for epoch in range(training_epochs): 
     _, c, summary,train_accuracy,iw1,iw2,iw3 = sess.run([optimizer, cost,summary_op,accuracy_OP, 
               w_1,w_2,w_3 
               ], 
               feed_dict={input_neurons: trainX, known_outputs: trainY}) 

     print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.9f}".format(c), "Accuracy =",train_accuracy) 
     #np.set_printoptions(threshold=np.nan) 
     #print(iw1) 
     #print(iw2) 
     #print(iw3) 
     #rint("--------------") 
     writer.add_summary(summary, epoch + 1) 

    saver = tf.train.Saver() 
    saver.save(sess, "/home/shahzeb/temp/trained_model/hidden_layer_nn.ckpt") 
print("Done") 

및 텐터 보드상의 그래프는 다음과 같다. enter image description here

특정 기간 이후에 비용 함수 값이 증가하는 이유는 무엇입니까? 무엇이 잘못되었으며 어떻게 해결할 수 있습니까?

답변

0

문제의 핵심은 에포크의 수입니다. 주어진 교육 데이터 세트에 너무 많은 데이터를 사용했을 수 있습니다. 그래서 가능성있는 설명은 여러분이 에포크 150 주변의 어떤 시점에서 과장하기 시작하고 있다는 것입니다.

이러한 문제를 처리하는 방법에 대해서는 좋은 discussion on forums.fast.ai이 있습니다. 간단한 해결책은 Tensorflow의 유효성 검사 모니터 as described in this tutorial in the Tensorflow documentation으로 "조기 정지"메커니즘을 구현하는 것입니다.

+0

답장을 보내 주셔서 감사합니다. 실제로 훈련 데이터 세트에 일부 원시 데이터가 있고 데이터가 비어있는 내 모델에 대한 의문이있었습니다.이 데이터를 사용하면 비용 기능이 너무 빠르게 증가하지는 않았지만 점차적으로 증가했습니다. 일단 제거하면 비용 함수 값이 빠르게 증가하기 시작합니다. 그게 내 모델에 대해 의심 스러웠습니다. – Shahzeb