ich derzeit Probleme bei der Verwendung hyperas optimiser in meinem Netzwerk mit mehreren Eingängen ..hyperas Rastersuche mit Netzwerk mit mehreren Eingängen
Dies ist, wie ich es implementiert habe:
def data():
X_train, Y_train = next(train_generator())
X_test, Y_test = next(test_generator())
datagen = ImageDataGenerator()
train_list = []
for input in X_train:
train_list.append(datagen.fit(input))
return datagen, train_list, Y_train, X_test, Y_test
ich bin mit data_generator, da nicht alle Daten im RAM enthalten sein können. Basierend auf der data example haben sie gemacht, ich habe dies gemacht.
def fws(datagen, X_train, Y_train, X_test, Y_test):
#Input shape: (batch_size,40,45,3)
#output shape: (1,15,50)
# number of unit in conv_feature_map = splitd
filter_size = 8
pooling_size = 28
stride_step = 2
pool_splits = ((splits - pooling_size)+1)/2
temp_list = []
sun_temp_list = []
conv_featur_map = []
pool_feature_map = []
print "Printing shapes"
list_of_input = [Input(shape = (window_height,total_frames_with_deltas,3)) for i in range(splits)]
#convolution
shared_conv = Conv2D(filters = 150, kernel_size = (filter_size,45), activation='relu')
for i in range(splits):
conv_featur_map.append(shared_conv(list_of_input[i]))
#Pooling
input = Concatenate()(conv_featur_map)
input = Reshape((splits,-1))(input)
pooled = MaxPooling1D(pool_size = pooling_size, strides = stride_step)(input)
#fc
dense1 = Dense(units = 1000, activation = 'relu', name = "dense_1")(pooled)
dense2 = Dense(units = 1000, activation = 'relu', name = "dense_2")(dense1)
dense3 = Dense(units = 50 , activation = 'softmax', name = "dense_3")(dense2)
model = Model(inputs = list_of_input , outputs = dense3)
sgd = keras.optimizers.SGD(lr = {{uniform(0, 1)}}, decay = {{uniform(0, 1)}}, momentum = {{uniform(0, 1)}}, nesterov = True)
model.compile(loss="categorical_crossentropy", optimizer=sgd , metrics = [metrics.categorical_accuracy])
hist_current = model.fit_generator(datagen.flow(X_train, Y_train),
steps_per_epoch=32,
epochs = 1000,
verbose = 1,
validation_data = (X_test, Y_test),
validation_steps=32,
pickle_safe = True,
workers = 4)
score, acc = model.evaluate(X_test, Y_test, verbose=0)
return {'loss': -acc, 'status': STATUS_OK, 'model': model}
Speziell für dieses Netzwerk ist, dass es mehrere Eingänge einnimmt. Ich hätte es nur in einer Eingabe machen und eine Lambda-Ebene verwenden können, um sie zu teilen, aber da das Teilen ziemlich langweilig ist, entschied ich mich dafür, es gespaltet zu speichern und es gespalten zu geben, um 33 Eingaben zu erzeugen. Ansonsten ist das Netzwerk ziemlich Standard. (Visualisierung schneller von Netzwerk)
if __name__ == '__main__':
datagen, X_train, Y_train, X_test, Y_test = data()
best_run, best_model = optim.minimize(model=fws,
data=data,
algo=tpe.suggest,
max_evals=5,
trials=Trials())
print("Evalutation of best performing model:")
print(best_model.evaluate(X_test, Y_test))
Dies, wo ich die Optimierung beginnen, und wo auch ich erhalte mir Fehlermeldung:
Traceback (most recent call last):
File "keras_cnn_phoneme_original_fit_generator_hyperas.py", line 211, in <module>
trials=Trials())
File "/usr/local/lib/python2.7/dist-packages/hyperas/optim.py", line 43, in minimize
notebook_name=notebook_name, verbose=verbose)
File "/usr/local/lib/python2.7/dist-packages/hyperas/optim.py", line 63, in base_minimizer
model_str = get_hyperopt_model_string(model, data,functions,notebook_name, verbose, stack)
File "/usr/local/lib/python2.7/dist-packages/hyperas/optim.py", line 130, in get_hyperopt_model_string
imports = extract_imports(cleaned_source, verbose)
File "/usr/local/lib/python2.7/dist-packages/hyperas/utils.py", line 44, in extract_imports
import_parser.visit(tree)
File "/usr/lib/python2.7/ast.py", line 241, in visit
return visitor(node)
File "/usr/lib/python2.7/ast.py", line 249, in generic_visit
self.visit(item)
File "/usr/lib/python2.7/ast.py", line 241, in visit
return visitor(node)
File "/usr/local/lib/python2.7/dist-packages/hyperas/utils.py", line 14, in visit_Import
if (self._import_asnames(node.names)!=''):
File "/usr/local/lib/python2.7/dist-packages/hyperas/utils.py", line 36, in _import_asnames
return ''.join(asname)
TypeError: sequence item 0: expected string, NoneType found
Ich bin nicht sicher, wie dieser Fehler interpretieren soll, dann ist dies ein Implementierungsfehler oder ein Fehler in der Bibliothek, die ich nicht kenne ...
Ein minimales Arbeitsbeispiel:
import numpy as np
import re
from keras.utils import np_utils
from keras import metrics
import keras
from keras.models import Sequential
from keras.optimizers import SGD
import scipy
from keras.layers.core import Dense, Activation, Lambda, Reshape,Flatten
from keras.layers import Conv1D,Conv2D,MaxPooling2D, MaxPooling1D, Reshape
#from keras.utils.visualize_util import plot
from keras.utils import np_utils
from keras.models import Model
from keras.layers import Input, Dense
from keras.layers import Dropout
from keras import backend as K
from keras.layers.merge import Concatenate
from keras.models import load_model
from keras.utils import plot_model
from keras.preprocessing.image import ImageDataGenerator
import math
import random
from keras.callbacks import ModelCheckpoint
import tensorflow as tf
from hyperopt import Trials, STATUS_OK, tpe
from hyperas import optim
from hyperas.distributions import uniform
def train_generator():
while True:
train_input = np.random.randint(100,size=(1,33,8,45,3))
train_input_list = np.split(train_input,33,axis=1)
for i in range(len(train_input_list)):
train_input_list[i] = train_input_list[i].reshape(1,8,45,3)
train_output = np.random.randint(100,size=(1,3,50))
yield (train_input_list, train_output)
def test_generator():
while True:
test_input = np.random.randint(100,size=(1,33,8,45,3))
test_input_list = np.split(test_input,33,axis=1)
for i in range(len(test_input_list)):
test_input_list[i] = test_input_list[i].reshape(1,8,45,3)
test_output = np.random.randint(100,size=(1,3,50))
yield (test_input_list, test_output)
def data():
X_train, Y_train = next(train_generator())
X_test, Y_test = next(test_generator())
datagen = ImageDataGenerator()
train_list = []
for input in X_train:
train_list.append(datagen.fit(input))
return datagen, train_list, Y_train, X_test, Y_test
def fws(datagen, X_train, Y_train, X_test, Y_test):
#Input shape: (batch_size,40,45,3)
#output shape: (1,15,50)
# number of unit in conv_feature_map = splitd
filter_size = 8
pooling_size = 28
stride_step = 2
pool_splits = ((splits - pooling_size)+1)/2
temp_list = []
sun_temp_list = []
conv_featur_map = []
pool_feature_map = []
print "Printing shapes"
list_of_input = [Input(shape = (8,45,3)) for i in range(33)]
#convolution
shared_conv = Conv2D(filters = 150, kernel_size = (filter_size,45), activation='relu')
for i in range(splits):
conv_featur_map.append(shared_conv(list_of_input[i]))
#Pooling
input = Concatenate()(conv_featur_map)
input = Reshape((splits,-1))(input)
pooled = MaxPooling1D(pool_size = pooling_size, strides = stride_step)(input)
#reshape = Reshape((3,-1))(pooled)
#fc
dense1 = Dense(units = 1000, activation = 'relu', name = "dense_1")(pooled)
dense2 = Dense(units = 1000, activation = 'relu', name = "dense_2")(dense1)
dense3 = Dense(units = 50 , activation = 'softmax', name = "dense_3")(dense2)
model = Model(inputs = list_of_input , outputs = dense3)
sgd = keras.optimizers.SGD(lr = {{uniform(0, 1)}}, decay = {{uniform(0, 1)}}, momentum = {{uniform(0, 1)}}, nesterov = True)
model.compile(loss="categorical_crossentropy", optimizer=sgd , metrics = [metrics.categorical_accuracy])
hist_current = model.fit_generator(datagen.flow(X_train, Y_train),
steps_per_epoch=32,
epochs = 1000,
verbose = 1,
validation_data = (X_test, Y_test),
validation_steps=32,
pickle_safe = True,
workers = 4)
score, acc = model.evaluate(X_test, Y_test, verbose=0)
return {'loss': -acc, 'status': STATUS_OK, 'model': model}
if __name__ == '__main__':
datagen, X_train, Y_train, X_test, Y_test = data()
best_run, best_model = optim.minimize(model=fws,
data=data,
algo=tpe.suggest,
max_evals=5,
trials=Trials())
print("Evalutation of best performing model:")
print(best_model.evaluate(X_test, Y_test))
Ihr minimal funktionierendes Beispiel weist mehrere Probleme auf. 'Splits' nicht definiert, viele Variablen zugewiesen, aber nie benutzt. Können Sie es einmal überprüfen? –
Die Fehlermeldung "TypeError: Sequenzelement 0: erwartete Zeichenfolge, NoneType gefunden" klingt wie das erste Element Ihrer Eingabesequenz wurde nicht richtig gelesen. Der erste Schritt könnte sein, Ihre Daten zu überprüfen (fehlender Wert?) Und zu überprüfen, wie Sie Ihre Daten eingelesen haben. – StatsSorceress