AttributeError: у объекта 'generator' нет атрибута 'ndim' - PullRequest
0 голосов
/ 20 июня 2019

Я работаю в сетях Triplets на Keras, чтобы найти сходство изображений. Тем не менее, я получаю сообщение об ошибке при подаче триплетов на модель. Прошу вас помочь в этом.

В основном я пытаюсь почувствовать модель с 3 входами (якорь, положительный, отрицательный)

Я работаю над Python3 и подгоняю модель с помощью fit_model, используя Keras. Это моя функция тренировать модель:

def train(trainDB, testDB, n_iter, batch_size, evaluate_every, test_size, 
loss_every):
    print("Starting training process!")
    print("-------------------------------------")

    best = -1
    t_start = time.time()

    inputs=trainDB.getTripletTrainData(batch_size)
    targets=np.ones([batch_size])

    for i in range(0, n_iter):
        loss=tripletNet.fit(inputs, targets)

        #print("Loss: {0}".format(loss)) 

        if i % evaluate_every == 0:
            print("Time for {0} iterations: {1}".format(i, time.time()-t_start))
            val_acc = self.test_oneshot(testDB, test_size)
            if val_acc > best:
                print("Current best: {0}, previous best: {1}".format(val_acc, best))
                print("Saving weights to: {0} \n".format(weights_path))
                self.tripletNet.save_weights(weights_path)
                best=val_acc

        if i % loss_every == 0:
            print("iteration {}, training loss: {:.2f},".format(i,loss))

Сообщение об ошибке:

Starting training process!
-------------------------------------
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-163-b5442e61de2d> in <module>()
----> 1 train(trainDatabase, testDatabase, n_iter, batch_size, evaluate_every, test_size, loss_every)

5 frames
<ipython-input-161-f417f0ebcfc7> in train(trainDB, testDB, n_iter, batch_size, evaluate_every, test_size, loss_every)
     10 
     11     for i in range(0, n_iter):
---> 12         loss=tripletNet.fit(inputs, targets)
     13 
     14         #print("Loss: {0}".format(loss))

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)
    950             sample_weight=sample_weight,
    951             class_weight=class_weight,
--> 952             batch_size=batch_size)
    953         # Prepare validation data.
    954         do_validation = False

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
    749             feed_input_shapes,
    750             check_batch_axis=False,  # Don't enforce the batch size.
--> 751             exception_prefix='input')
    752 
    753         if y is not None:

/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
     90         data = data.values if data.__class__.__name__ == 'DataFrame' else data
     91         data = [data]
---> 92     data = [standardize_single_array(x) for x in data]
     93 
     94     if len(data) != len(names):

/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in <listcomp>(.0)
     90         data = data.values if data.__class__.__name__ == 'DataFrame' else data
     91         data = [data]
---> 92     data = [standardize_single_array(x) for x in data]
     93 
     94     if len(data) != len(names):

/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in standardize_single_array(x)
     25                 'Got tensor with shape: %s' % str(shape))
     26         return x
---> 27     elif x.ndim == 1:
     28         x = np.expand_dims(x, 1)
     29     return x

**AttributeError: 'generator' object has no attribute 'ndim'**

Если я использую fit_generator .. Я получаю ошибку ниже ..

Starting training process!
-------------------------------------
Epoch 1/1
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-194-b5442e61de2d> in <module>()
----> 1 train(trainDatabase, testDatabase, n_iter, batch_size, evaluate_every, test_size, loss_every)

3 frames
<ipython-input-193-8ad964a9916f> in train(trainDB, testDB, n_iter, batch_size, evaluate_every, test_size, loss_every)
     10 
     11     for i in range(0, n_iter):
---> 12         loss=tripletNet.fit_generator(inputs, targets)
     13 
     14         #print("Loss: {0}".format(loss))

/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs)
     89                 warnings.warn('Update your `' + object_name + '` call to the ' +
     90                               'Keras 2 API: ' + signature, stacklevel=2)
---> 91             return func(*args, **kwargs)
     92         wrapper._original_function = func
     93         return wrapper

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
   1416             use_multiprocessing=use_multiprocessing,
   1417             shuffle=shuffle,
-> 1418             initial_epoch=initial_epoch)
   1419 
   1420     @interfaces.legacy_generator_methods_support

/usr/local/lib/python3.6/dist-packages/keras/engine/training_generator.py in fit_generator(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
    178             steps_done = 0
    179             batch_index = 0
--> 180             while steps_done < steps_per_epoch:
    181                 generator_output = next(output_generator)
    182 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
...