Многопоточная программа не дает ожидаемого результата - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь сделать вывод с помощью модели глубокого обучения на тестовых изображениях. Так как у меня есть gpu для генерации прогнозов на основе модели для подсчета очков костей, я должен выполнить манипулирование данными с массивами numpy, которые работают на одном процессоре и занимают часы. Чтобы ускорить процесс, я использовал библиотеку job lib, чтобы использовать мою 48-ядерную машину. Но теперь, когда я изменил свой код так, чтобы он мог работать параллельно, он не обновляет мои глобальные переменные соответствующим образом, и, следовательно, после завершения процесса значения моих numpy массивов по-прежнему равны 0. Я попытался взглянуть на некоторые документы, но не смог найти решение. Фрагмент кода прилагается ниже для справки.

def calculate_dice_all(idx):
        global X_test
        global y_test
        global predictions
        global corrput_images
        global n_full
        global n_core
        global n_advancing
        global necrosis
        global edema
        global noadv
        #print(X_test[idx].shape,y_test[idx].shape)
        label_img = y_test[idx].reshape(1,256,256,1)
        test_img = X_test[idx].reshape(1,256,256,4)
        #test_img_pred = model.predict(test_img)
        test_img_pred = predictions[idx]
        #test_img_pred = np.argmax(test_img_pred,axis=3)
        label_img = label_img.reshape(256,256,1)
        test_img = test_img.reshape(256,256,4)
        test_img_pred = test_img_pred.reshape(256,256,1)
        #print(test_img.shape,test_img_pred.shape,label_img.shape)
        try:
           full, core, advancing, cross_1, cross_2, cross_3 = get_dice(test_img,test_img_pred,label_img)
           #print(full, core, advancing, cross_1, cross_2, cross_3)
        except:
           #print(test_img.shape,test_img_pred.shape,label_img.shape)
           corrput_images = corrput_images + 1
           return
        n_full += full
        n_core += core
        n_advancing += advancing
        necrosis += cross_1
        edema += cross_2
        noadv += cross_3

    n_full=np.zeros(6); n_core=np.zeros(6); n_advancing=np.zeros(6); necrosis = np.zeros(6); edema = np.zeros(6); noadv = np.zeros(6)

    corrput_images = 0
    predictions = model.predict(X_test)
    predictions = np.argmax(predictions,axis=3)

    from joblib import Parallel, delayed
    Parallel(n_jobs=48)(delayed(calculate_dice_all)(idx) for idx in progressbar.progressbar(range(0,X_test.shape[0])))

    print(n_full, n_core, n_advancing, necrosis, edema, noadv)
    print("Total Corrupt Images"+str(corrput_images))

    d_full= 2*float(n_full[0]) / float(n_full[1]+n_full[2])
    d_core= 2*float(n_core[0]) / float(n_core[1]+n_core[2])
    d_advancing= 2*float(n_advancing[0]) / float(n_advancing[1]+n_advancing[2])

    #print (architect
    print ('Region_________________| Dice Coefficient')
    print ('Complete Tumor_________| {0:.4f}'.format(d_full))
    print ('Core Tumor_____________| {0:.4f}'.format(d_core))
    print ('Enhancing Tumor________| {0:.4f}'.format(d_advancing))
...