2017-04-10 100 views
2

我試圖使我的第一張張流模型,但我有一些問題。看起來它使得火車正確,但是當它做出預測時,它只會返回(幾乎)總是相同的值。下面的代碼: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) 

我已在模型的訓練過程中也檢查了預測,如果我設置keep_rate 1,我也得到幾乎總是接近尾聲不變的預測。在第一個時代有很多變化,但在最後一個時代,神經網絡總是預測每個圖像都是一樣的。它似乎收斂到一個獨特的預測值,而不考慮我傳遞給神經網絡的圖像。我查了一百次,但看不清錯誤在哪裏。

這是我所得到的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

謝謝大衛的見解。我剛剛檢查過我是否反覆提供相同的數據,但事實並非如此,所有的輸入都是不同的,並且它們「有意義」,因爲我也將它們可視化。我的恐懼是,我沒有在一些步驟中正確地提供網絡。我假設for循環中的每一步都需要train_data的一個元素,將它傳遞到網絡中並更新權重,並且每個項目最終使其達到10次(10個epoch)。 – giust

回答

0

我有同樣的問題,並花了兩個星期才找到原因。它可能會幫助你。我的問題是由於嘈雜的數據集和高學習率。由於Relu激活可能會殺死神經元,因此當數據集有噪音時,大多數Relus將死亡(不會激活任何輸入,因爲它認爲其輸入是無用的),那麼網絡可能只會學習一些最終標籤的固定分佈。所以結果是固定的任何輸入。

我的解決方案是使用tf.nn.leaky_relu(),因爲它不會終止負輸入。