2017-04-10 1 views
2

첫 번째 텐서 흐름 모델을 만들려고하지만 몇 가지 문제가 있습니다. 그것은 기차를 정확하게 만드는 것처럼 보이지만 예측을하면 그냥 거의 같은 값을 반환합니다. 여기 코드는 : 나는 1 keep_rate를 설정하면Tensorflow가 동일한 예측을 반환합니다.

n_classes = 2 

tf.reset_default_graph() 

x = tf.placeholder('float') 
y = tf.placeholder('float') 
keep_rate = tf.placeholder(tf.float32) 

weights = {'W_conv1':tf.Variable(tf.random_normal([3,3,3,1,32]), 
      'W_conv2':tf.Variable(tf.random_normal([3,3,3,32,64])), 
      'W_fc':tf.Variable(tf.random_normal([54080,1024])), 
      'out':tf.Variable(tf.random_normal([1024, n_classes]))} 

biases = {'b_conv1':tf.Variable(tf.random_normal([32])), 
      'b_conv2':tf.Variable(tf.random_normal([64])), 
      'b_fc':tf.Variable(tf.random_normal([1024])), 
      'out':tf.Variable(tf.random_normal([n_classes]))} 


def conv3d(x, W): 
    return tf.nn.conv3d(x, W, strides=[1,1,1,1,1], padding='SAME') 

def maxpool3d(x): 
    return tf.nn.max_pool3d(x, ksize=[1,2,2,2,1], strides=[1,2,2,2,1], padding='SAME') 

def convolutional_neural_network(x, keep_rate): 
    x = tf.reshape(x, shape=[-1, IMG_SIZE_PX, IMG_SIZE_PX, SLICE_COUNT, 1]) 

    conv1 = tf.nn.relu(conv3d(x, weights['W_conv1']) + biases['b_conv1']) 
    conv1 = maxpool3d(conv1) 


    conv2 = tf.nn.relu(conv3d(conv1, weights['W_conv2']) + biases['b_conv2']) 
    conv2 = maxpool3d(conv2) 

    fc = tf.reshape(conv2,[-1, 54080]) 
    fc = tf.nn.relu(tf.matmul(fc, weights['W_fc'])+biases['b_fc']) 
    fc = tf.nn.dropout(fc, keep_rate) 

    output = tf.matmul(fc, weights['out'])+biases['out'] 

    return output 

much_data = np.load('F:/Kaggle/Data Science Bowl 2017/Script/muchdata-50-50-20.npy') 

train_data = much_data[:-100] 
validation_data = much_data[-100:] 


def train_neural_network(x): 
    prediction = convolutional_neural_network(x, keep_rate) 
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y)) 
    optimizer = tf.train.AdamOptimizer(learning_rate=1e-3).minimize(cost) 

    hm_epochs = 10 
    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 

     for epoch in range(hm_epochs): 
      epoch_loss = 0 
      for data in train_data: 
       X = data[0] 
       Y = data[1] 
       _, c = sess.run([optimizer, cost], feed_dict={x: X, y: Y, keep_rate: 0.75}) 
       epoch_loss += c 

      print('Epoch', epoch+1, 'completed out of',hm_epochs,'loss:',epoch_loss) 

      correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) 
      accuracy = tf.reduce_mean(tf.cast(correct, 'float')) 

      print('Accuracy:',accuracy.eval({x:[i[0] for i in validation_data], y:[i[1] for i in validation_data], keep_rate: 1.})) 

     print('Done. Finishing accuracy:') 
     print('Accuracy:',accuracy.eval({x:[i[0] for i in validation_data], y:[i[1] for i in validation_data], keep_rate: 1.})) 

     eval_data = np.load('F:/Kaggle/Data Science Bowl 2017/Script/eval_data-50-50-20.npy') 

     probabilities = tf.nn.softmax(prediction) 
     sol = [] 
     for data in eval_data: 
      X = data[0] 
      id = data[1] 
      probs = probabilities.eval(feed_dict={x: X, keep_rate: 1.}) 
      pred = prediction.eval(feed_dict={x: X, keep_rate: 1.}) 
      print('Outputs: ',pred) 
      print('Probs: ',probs) 
      sol.append([id, probs[0,1]]) 
     print(sol) 

는 또한 나는 또한 거의 항상 끝으로 일정 예측을 얻을, 모델의 훈련 기간 동안 예측을 확인하고있다. 첫 번째 신기원에는 많은 변화가 있지만 마지막 신기원에서는 신경망이 항상 모든 이미지에 대해 동일한 것을 예측하고있는 것처럼 보입니다. 그것은 신경망에 어떤 이미지를 전달하는지 고려하지 않고 고유 한 예측 값으로 수렴하는 것 같습니다. 나는 백 번 점검했지만 실수가 어디인지는 알 수 없습니다.

내가 eval_data에서 일부 이미지 무엇을 얻을의 예 (내가 train_data에 대한 인쇄 같은 동작)입니다 :

그들은 거의 항상 동일하지만 때때로 내가 볼 것을
Probs: [[ 0.76099759 0.23900245]] 
Outputs: [[-0.017277 -1.1754334]] 
Probs: [[ 0.76099759 0.23900245]] 
Outputs: [[-0.017277 -1.1754334]] 
Probs: [[ 0.76099759 0.23900245]] 
Outputs: [[ 117714.1953125 -47536.32421875]] 
Probs: [[ 1. 0.]] 
Outputs: [[-0.017277 -1.1754334]] 
Probs: [[ 0.76099759 0.23900245]] 
Outputs: [[-0.017277 -1.1754334]] 
Probs: [[ 0.76099759 0.23900245]] 
Outputs: [[-0.017277 -1.1754334]] 
Probs: [[ 0.76099759 0.23900245]] 

공지 사항 일부 기괴한 가치 같은

Outputs: [[ 117714.1953125 -47536.32421875]] 
Probs: [[ 1. 0.]] 

희망 누군가가 대답을 가지고,이 두통을주고있다.

양해 해 주셔서 감사합니다. 나는 여전히 Tensorflow의 초보자입니다. D

+1

이 결과는 일반적으로 네트워크가 전혀 학습하지 않는다는 것을 의미합니다. 출력 세트를 얻고 입력이 전혀없는 것처럼 결과를 최대한 최적화합니다. 이것은 아마도 무언가 잘못되었다는 것을 의미합니다 (예 : 버그). 모델 (데이터 및 레이블)에 대한 입력을 사용하여 디버깅을 시작합니다. 모델에 어떤 것을 공급하고 있는지 정확히 출력하고 시각화하고 모델에 실제로 무엇을 준다고 믿는지를 스스로 증명할 수 있습니다.이 시점에서 수많은 버그가 발생합니다. 어떤 종류의 결과가 나올 때까지 모델을 단순화 한 다음 다시 추가하십시오. –

+1

이 결과를 생성하는 또 다른 일반적인 실수는 모델에 동일한 데이터 배치를 반복해서 보내는 것입니다. 데이터 배치를 몇 개 버리고 실제로 시각화하면 팝업이 표시됩니다. 여기서 문제는 사소한 일이며 종종 그렇게 사소하지는 않다는 것을 알게됩니다. –

+0

David 님의 통찰력에 감사드립니다. 나는 똑같은 데이터를 계속해서 반복적으로 먹고 있는지를 두 번 확인했지만 그럴 수는 없다. 모든 입력은 다르고 그들이 "시각화했다"는 것처럼 이해할 수있다. 내 두려움은 내가 어떤 단계에서 네트워크에 올바르게 공급하지 못한다는 것이다. 나는 for 루프의 모든 단계에서 train_data의 한 요소를 가져 와서 그물을 통과시키고 가중치를 업데이트한다고 가정하고, 항목 당 10 번 (10 epochs)에 끝납니다. – giust

답변

0

나는 동일한 문제가있어서 그 이유를 찾는데 2 주가 걸렸습니다. 도움이 될지도 모릅니다. 내 문제는 시끄러운 데이터 세트와 높은 학습 속도 때문입니다. Relu 활성화가 뉴런을 죽일 수 있기 때문에, 데이터 세트가 잡음이 많은 경우, Relus의 대부분은 죽을 것입니다 (입력이 쓸모 없다고 생각하기 때문에 어떤 입력에 대해서도 활성화되지 않습니다). 그러면 네트워크는 최종 레이블의 일부 고정 분포 만 학습 할 수 있습니다. 결과는 모든 입력에 고정됩니다.

내 솔루션은 음수 입력을 죽이지 않기 때문에 tf.nn.leaky_relu()를 사용하고 있습니다.

관련 문제