Hyperas TypeError: неверный тип операнда для унарного символа:: 'list' - PullRequest
0 голосов
/ 11 мая 2018

Я делаю эту сверточную нейронную сеть, которая может обнаруживать между 4 типами изображений (сейчас это «Кошки», «Собаки», «Самолеты» и «Мотоциклы», которые я использую в качестве теста), и я хочу оптимизировать определенные параметры с помощью Hyperas.Сейчас я только оптимизирую показатель отсева, как тест.

Однако я продолжаю получать эту ошибку, и я не знаю, что она вообще значит и что я могу сделать, чтобы исправить ее.

Это мой код:

 import numpy as np
 import matplotlib.pyplot as plt
 import matplotlib.image as mpimg
 import os
 from keras import layers, models, optimizers
 from keras.preprocessing.image import ImageDataGenerator
 from hyperas import optim
 from hyperopt import Trials, STATUS_OK, tpe
 from hyperas.distributions import choice, uniform, conditional
 from PIL import Image as im
 from os import listdir
 from keras.datasets import mnist
 from keras.utils import np_utils
 from scipy import misc

 from keras import backend as K

 K.set_image_dim_ordering('tf')

 def data():

    tag_dict = {'airplane':0, 'cat':1, 'dog':2, 'motorbike':3}

    base_directory      = "."
    train_data_dir      = base_directory + "/Train"
    validation_data_dir = base_directory + "/Validation"

    maxsize = (100, 100)

    trainlen = sum([len(files) for r, d, files in os.walk(train_data_dir)])
    validlen = sum([len(files) for r, d, files in os.walk(validation_data_dir)])

    train_array = np.ones((trainlen, 100, 100, 3))
    train_tags  = np.ones((trainlen,))

    val_array = np.ones((validlen, 100, 100, 3))
    val_tags  = np.ones((validlen,))

    itemcounter = 0
    for folder in listdir(train_data_dir):
        for picture in listdir(train_data_dir + "/" + folder):

            tempdirec = train_data_dir + "/" + folder + "/" + picture

            img = im.open(tempdirec)
            img = img.resize(maxsize, im.ANTIALIAS)

            data = np.asarray(img, dtype='int32')

            if data.shape != (100, 100, 3):

                data = np.stack((data, data, data), axis=2)

            train_array[itemcounter] = data
            train_tags[itemcounter] = tag_dict[folder]

            itemcounter += 1

    itemcounter = 0
    for folder in listdir(validation_data_dir):
        for picture in listdir(validation_data_dir + "/" + folder):

            tempdirec = validation_data_dir + "/" + folder + "/" + picture

            img = im.open(tempdirec)
            img = img.resize(maxsize, im.ANTIALIAS)

            data = np.asarray(img, dtype='int32')

            if data.shape != (100, 100, 3):

                data = np.stack((data, data, data), axis=2)

            val_array[itemcounter] = data
            val_tags[itemcounter] = tag_dict[folder]

            itemcounter += 1

    def shuffle(array, seed=16):

        np.random.seed(seed)
        np.random.shuffle(array)

        return array

    nb_classes = 4

    train_array,    train_tags   = shuffle(train_array), shuffle(train_tags)
    val_array,      val_tags     = shuffle(val_array),   shuffle(val_tags)  

    train_tags = np_utils.to_categorical(train_tags, nb_classes)     
    val_tags = np_utils.to_categorical(val_tags, nb_classes)

    return (train_array, train_tags), (val_array, val_tags)

 def create_model(train_generator, validation_generator):

      model = models.Sequential()
     model.add(layers.Conv2D(16, (3, 3), activation='tanh', input_shape= 
                                                         (150, 150, 3)))
     model.add(layers.MaxPooling2D((2, 2)))
     model.add(layers.Conv2D(32, (3, 3), activation='tanh'))
     model.add(layers.MaxPooling2D((2, 2)))
     model.add(layers.Conv2D(64, (3, 3), activation='tanh'))
     model.add(layers.MaxPooling2D((2, 2)))
     model.add(layers.Conv2D(64, (3, 3), activation='tanh'))
     model.add(layers.MaxPooling2D((2, 2)))
     model.add(layers.Flatten())
     model.add(layers.Dropout(rate={{choice([0.2, 0.25, 0.3, 0.35, 0.4])}}))
     #model.add(layers.Dropout(0.25))
     model.add(layers.Dense(64, activation='sigmoid'))
     model.add(layers.Dense(4, activation='softmax'))

     model.compile(loss='categorical_crossentropy', 
                    optimizer=optimizers.RMSprop(lr=0.001), metrics=['acc'])

     model.summary()

     history = model.fit_generator(train_generator,
                          steps_per_epoch=4,
                          epochs=2,
                          validation_data=validation_generator,
                          validation_steps=7)

     acc         = history.history['acc']
     val_acc     = history.history['val_acc']
     loss        = history.history['loss']
     val_loss    = history.history['val_loss']
     epochs      = range(1, len(acc) + 1)


     plt.plot(epochs, acc, 'r-', label='Training acc')
     plt.plot(epochs, val_acc, 'g-', label='Validation acc')
     plt.title('Training and validation accuracy')
     plt.legend()
     plt.figure()
     plt.plot(epochs, loss, 'r-', label='Training loss')
     plt.plot(epochs, val_loss, 'g-', label='Validation loss')
     plt.title('Training and validation loss')
     plt.legend()
     plt.pause(0.05)
     plt.show()

     return {'loss': -acc, 'status': STATUS_OK, 'model': model}
 (x_train, y_train), (x_val, y_val) = data()

 create_model(x_train, y_train, x_val, y_val)

 #if __name__ == '__main__':
     #train_generator, validation_generator = data()
     #best_run, best_model = optim.minimize(model=create_model,
                                      #data=data,
                                      #algo=tpe.suggest,
                                      #max_evals=5,
                                      #trials=Trials())

     #print("Best performing model chosen hyper-parameters:")
     #print(best_run)

После выполнения одного прогона оптимизации, это вывод:

Traceback (most recent call last):

File "<ipython-input-33-df9a5e0e117e>", line 1, in <module>
runfile('C:/Users/lucky/OneDrive/Machine Learning/Crack_Net_5.py', 
wdir='C:/Users/lucky/OneDrive/Machine Learning')

File "C:\Users\lucky\Anaconda3\lib\site- 
packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
execfile(filename, namespace)

File "C:\Users\lucky\Anaconda3\lib\site- 
packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Users/lucky/OneDrive/Machine Learning/Crack_Net_5.py", line 161, in 
<module>
create_model(x_train, y_train, x_val, y_val)

File "C:/Users/lucky/OneDrive/Machine Learning/Crack_Net_5.py", line 157, in 
create_model
return {'loss': -acc, 'status': STATUS_OK, 'model': create_model}

TypeError: bad operand type for unary -: 'list'

Я еще не запускаю его с Hyperas. Если у кого-то есть идеи, что вызывает эту ошибку и как ее исправить, это было бы удивительно!

...