1

3D畳み込みニューラルネットワークを実行しようとしているときに、次のエラーが発生しています。理由は何でしょうか?cnnを使用したResourceExhaustedError

ResourceExhaustedError(トレースバックするための上記参照):OOM形状と テンソルを割り当てる[54080,1024] [ノード:= 割り当て[T = DT_FLOAT、_class = [ "LOC Variable_10 /アダム/割当:@ Variable_10 "]、use_locking =真、 validate_shape =真、 _device =" /ジョブ:ローカルホスト/レプリカ:0 /タスク:0/GPU:0" (Variable_10 /アダム、zeros_4)]]

これは私が使用したコードです:

import tensorflow as tf 
import numpy as np 

IMG_SIZE_PX = 50 
SLICE_COUNT = 20 

n_classes = 2 
batch_size = 10 

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

keep_rate = 0.8 
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): 

    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]))} 


    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('muchdata-50-50-20.npy') 
# If you are working with the basic sample data, use maybe 2 instead of 100 here... you don't have enough data to really do this 
train_data = much_data[:-100] 
validation_data = much_data[-100:] 


def train_neural_network(x): 
    prediction = convolutional_neural_network(x) 
    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()) 

     successful_runs = 0 
     total_runs = 0 

     for epoch in range(hm_epochs): 
      epoch_loss = 0 
      for data in train_data: 
       total_runs += 1 
       try: 
        X = data[0] 
        Y = data[1] 
        _, c = sess.run([optimizer, cost], feed_dict={x: X, y: Y}) 
        epoch_loss += c 
        successful_runs += 1 
       except Exception as e: 
        # I am passing for the sake of notebook space, but we are getting 1 shaping issue from one 
        # input tensor. Not sure why, will have to look into it. Guessing it's 
        # one of the depths that doesn't come to 20. 
        pass 
        #print(str(e)) 

      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]})) 

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

     print('fitment percent:',successful_runs/total_runs) 

train_neural_network(x) 

私はtensorflow-gpuバージョンを使ってこれを実行しています。私はGTX970Mを使用しており、CUDAをインストールし、cudnnファイルを適切にインポートしました。最後のコマンドを実行すると、次のエラーが表示されます。親切に助けてください!

+0

GTX970Mにはどのくらいのメモリがありますか? – Jason

答えて

0

何らかの理由でメモリが不足しています。 GPUを使用しているアプリケーションがあるかもしれません(別のテンソルフローセッションがまだ有効です)。そうでない場合はチェックしてください。 (それを監視するにはnvidia-smiを使用できます)。

そうでない場合は、主にモデルのサイズとGPUのメモリサイズのためです。あなたができることは、CPUモードで起動し、tf.Variablesですべての変数をリストし、それが表すメモリの量を計算し、それがGPUに収まるかどうかを確認することです。

これまで、私が提供できるアドバイスはこれ以上ありませんでした。

+0

はい、以前のセッションのテンソルフローは、プロセスが停止していてもまだ私のGPUを使用していたという問題でした。私はcmdを閉じて、GPUを使い始めるためにもう一度やり直さなければならなかった。 –

関連する問題