Я делаю эту сверточную нейронную сеть, которая может обнаруживать между 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. Если у кого-то есть идеи, что вызывает эту ошибку и как ее исправить, это было бы удивительно!