UnboundLocalError: локальная переменная 'zip', на которую ссылаются перед присваиванием: Ошибка генератора - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь построить семантическую модель сегментации в керасе.Поскольку я использую пользовательские данные, я решил написать собственный генератор, чтобы передать его функции keras _.fit_generator, и я зашел в тупик при решении этой ошибки генератора, которая говорит:

UnboundLocalError: local variable 'zipped' referenced before assignment

После некоторогоИсследования github и stackover, я обнаружил, что "https://github.com/keras-team/keras/issues/1638#issuecomment-182139908" ans похож на мою проблему, и даже это решение, похоже, не работает, выдает ту же ошибку снова

def image_segmentation_generator( PROC_DATA, target_size, 
batch_size , gen, do_augment=False):
    if gen=='train':
        images_path = PROC_DATA+'/train_images/images'
        segs_path = PROC_DATA+'/train_labels/labels'
    elif 'val':
        images_path = PROC_DATA+'/val_images/images'
        segs_path = PROC_DATA+'/val_labels/labels'

    img_seg_pairs = get_pairs_from_paths( images_path , segs_path)
    random.shuffle( img_seg_pairs )
    zipped = itertools.cycle( img_seg_pairs  )
    while True:

        X = []
        Y = []
        for _ in range( batch_size) :
            im , seg = next(zipped)
            im = cv2.imread(im , 1 )
            im = cv2.resize(im,(target_size[0],target_size[1]))
            seg = cv2.imread(seg , 0 )
            seg = ia.imresize_single_image(seg, (target_size), 
interpolation='nearest')
            if do_augment:
                img , seg[:,:,0] = augment_seg( img , seg[:,:,0] )
            X.append( get_image_arr(im )  )
            Y.append( get_segmentation_arr( seg )  )

        yield np.array(X) , np.array(Y) 

my_gen = image_segmentation_generator(...)

my_gen.next() должно датьфреймы изображений и меток с заданным размером пакета.

трассировка стека: im, seg = next (zip) UnboundLocalError: локальная переменная 'zipped', на которую ссылается перед присваиванием

Как это исправить?

1 Ответ

0 голосов
/ 27 мая 2019

Для дальнейшего использования. Я нашел обходной путь для этого. Похоже, что объект функции при создании в качестве генератора должен быть самодостаточным без зависимости от дополнительных аргументов. Следовательно, объект итератора с адресом должен передаваться по функции.

Zipped = объект, созданный перед вызовом image_segmentation_generator_1

def image_segmentation_generator_1 (zipped = Zipped, target_size = (1242, 378), batch_size = 4, do_augment = False): в то время как True:

    image_list = []
    label_list = []
    _image_list = []
    _label_list = []
    for _ in range((batch_size/2)) :
        im , seg = next(zipped)
        im = cv2.imread(im , 1 )
        im = cv2.resize(im,(target_size[0],target_size[1]))
        seg = cv2.imread(seg , 0 )
        seg = ia.imresize_single_image(seg, (target_size[0],target_size[1]), interpolation='nearest')
        if do_augment:
            _image_list , _label_list = augment_seg( im , seg)
        else :
            _image_list = im
            _label_list = seg
        _image_list = get_image_arr(_image_list)
        image_list = image_list + _image_list
        label_list = label_list + _label_list

    yield np.array(image_list) , np.array(label_list) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...