在Keras中使用Hyperas导致无效的agrument错误

时间:2018-08-16 05:52:29

标签: python keras

我一直在尝试使用hyperas包装器来搜索最佳超参数。现在,我将使它首先工作保持相对基础。不幸的是,我收到“无效参数”错误。我正在使用Jupyter笔记本电脑。

我已阅读到我可能不必使用jupyter笔记本,但如果可能的话,我想继续使用它。

import keras

# prevents memory allocation errors when using GPU
from keras import backend as K
cfg = K.tf.ConfigProto()
cfg.gpu_options.allow_growth = True
K.set_session(K.tf.Session(config=cfg))

from keras.models import Sequential
from keras.layers import Dropout, Dense, Activation
from keras.regularizers import l2
from keras.layers.normalization import BatchNormalization

from keras.optimizers import Adam, sgd
from keras.activations import relu
from keras.losses import categorical_crossentropy
from keras import metrics

import pandas as pd
import numpy as np

# load data
x_main = pd.read_csv("glioma DB X.csv")

y_main = pd.read_csv("glioma DB Y.csv")

# fill with median (will have to improve later, not done yet)
fill_median =['Surgery_SBRT','df','Dose','Ki67','KPS','BMI','tumor_size']

x_main[fill_median] = x_main[fill_median].fillna(x_main[fill_median].median())

x_main['Neurofc'] = x_main['Neurofc'].fillna(2)

x_main['comorbid'] = x_main['comorbid'].fillna(int(x_main['comorbid'].median()))

# drop surgery
x_main = x_main.drop(['Surgery'], axis=1)

# normalize all x

x_main_normalized = x_main.apply(lambda x: (x-np.mean(x))/(np.std(x)+1e-10))

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_main, y_main, test_size=0.3)
x_test, x_val, y_test, y_val = train_test_split(x_test, y_test, test_size=0.5)

params = {'lr': 0.0001,
     'batch_size': 30,
     'epochs': 100,
     'dropout': 0.2,
     'weight_regulizer':['l2'],
     'optimizer': 'sgd',
     'losses': 'categorical_crossentropy',
     'activation':'relu',
     'last_activation': 'softmax'}

from keras.utils.np_utils import to_categorical

#categorical_labels = to_categorical(int_labels, num_classes=None)

last_layer = 1

if params['losses']=='categorical_crossentropy':
    y_train = to_categorical(y_train,num_classes=4)
    y_val = to_categorical(y_val,num_classes=4)
    y_test = to_categorical(y_test,num_classes=4)
    last_layer=4

from hyperopt import Trials, STATUS_OK, tpe

from keras.utils import np_utils

from hyperas import optim
from keras.models import model_from_json

from hyperas.distributions import choice, uniform, conditional

# Data()

def data():
    x_train = x_train
    x_val = x_val
    y_train = y_train
    y_val = y_val
    return x_train, y_train, x_val, y_val

def model(x_train, y_train, x_val, y_val, layers=[20, 20, 4], 
                 kernel_init ='he_uniform', bias_init ='he_uniform',
                 batch_norm=True, dropout=True):

    model = Sequential()

    # layer 1
    model.add(Dense({{choice([10, 20, 30, 50])}},
                    input_dim=x_train.shape[1],
                    W_regularizer=l2(l2_reg),
                    kernel_initializer=kernel_init,
                    bias_initializer=bias_init))

    if batch_norm == True:
        model.add(BatchNormalization(axis=-1, momentum=momentum, center=True))

    model.add(Activation(params['activation']))

    if dropout == True:
        model.add(Dropout({{uniform(0, 0.5)}}))

    # layer 2+    
    for layer in range(0, len(layers)-1):

        model.add(Dense({{choice([10, 20, 30, 50])}}, 
                        W_regularizer=l2(l2_reg),
                        kernel_initializer=kernel_init,
                        bias_initializer=bias_init))

        if batch_norm == True:
            model.add(BatchNormalization(axis=-1, momentum=momentum, center=True))

        model.add(Activation(params['activation']))

        if dropout == True:
            model.add(Dropout(params['dropout']))

    # Last layer
    model.add(Dense(layers[-1], activation=params['last_activation'],
                    kernel_initializer=kernel_init,
                    bias_initializer=bias_init))

    model.compile(loss=params['losses'],
                  optimizer=keras.optimizers.adam(lr=params['lr']),
                  metrics=['accuracy'])

    history = model.fit(x_train, y_train, 
                        validation_data=[x_val, y_val],
                        batch_size={{choice([5, 10, 30, 60])}},
                        epochs=params['epochs'],
                        verbose=1)

    score, acc = model.evaluate(x_test, y_test, verbose=0)
    print('Test accuracy:', acc)
    return {'loss': -acc, 'status': STATUS_OK, 'model': model}

    history_dict = history.history

    return {'model':model, 'status': STATUS_OK, 'history_dict':history_dict, 'loss':-acc}


best_run, best_model = optim.minimize(model=model,
                                      data=data,
                                      algo=tpe.suggest,
                                      max_evals=2,
                                      trials=Trials())

x_train, y_train, x_val, y_val = data()
print("Evalutation of best performing model:")
print(best_model.evaluate(x_val, y_val))
print("Best performing model chosen hyper-parameters:")
print(best_run)

错误:

OSError                                   Traceback (most recent call last)
<ipython-input-7-7cf7a7c755ab> in <module>()
     64                                       algo=tpe.suggest,
     65                                       max_evals=2,
---> 66                                       trials=Trials())
     67 
     68 x_train, y_train, x_val, y_val = data()

~\Anaconda3\lib\site-packages\hyperas\optim.py in minimize(model, data, algo, max_evals, trials, functions, rseed, notebook_name, verbose, eval_space, return_space)
     65                                      full_model_string=None,
     66                                      notebook_name=notebook_name,
---> 67                                      verbose=verbose)
     68 
     69     best_model = None

~\Anaconda3\lib\site-packages\hyperas\optim.py in base_minimizer(model, data, functions, algo, max_evals, trials, rseed, full_model_string, notebook_name, verbose, stack)
     94         model_str = full_model_string
     95     else:
---> 96         model_str = get_hyperopt_model_string(model, data, functions, notebook_name, verbose, stack)
     97     temp_file = './temp_model.py'
     98     write_temp_files(model_str, temp_file)

~\Anaconda3\lib\site-packages\hyperas\optim.py in get_hyperopt_model_string(model, data, functions, notebook_name, verbose, stack)
    176     else:
    177         calling_script_file = os.path.abspath(inspect.stack()[stack][1])
--> 178         with open(calling_script_file, 'r') as f:
    179             source = f.read()
    180 

OSError: [Errno 22] Invalid argument: 'C:\\Users\\Michael\\Desktop\\CSV data-20180807T164633Z-001\\CSV data\\<ipython-input-7-7cf7a7c755ab>'

1 个答案:

答案 0 :(得分:0)

Jeeez,我需要阅读更多内容。我想我的问题在github网站上得到了回答

notebook adjustment
If you find error like "No such file or directory" or OSError, Err22, you may need add notebook_name='simple_notebook'(assume your current notebook name is simple_notebook) in optim.minimize function like this:

best_run, best_model = optim.minimize(model=model,
                                      data=data,
                                      algo=tpe.suggest,
                                      max_evals=5,
                                      trials=Trials(),
                                      notebook_name='simple_notebook')

除了我需要放

notebook='keras_glioma_hyperopt') 

我的笔记本的名字是keras_glioma_hyperopt

仍然遇到错误,但是可能在我的代码设置中。我将不断更新,但以上代码帮助我取得了进步。

编辑

最终使它运行。

我遇到的问题:

  1. 您确实需要将所有数据加载到data()中: 我将我的名字更改为

    def data():

    # load data
    x_main = pd.read_csv("glioma DB X.csv")
    
    y_main = pd.read_csv("glioma DB Y.csv")
    
    # fill with median (will have to improve later, not done yet)
    fill_median =['Surgery_SBRT','df','Dose','Ki67','KPS','BMI','tumor_size']
    
    x_main[fill_median] = x_main[fill_median].fillna(x_main[fill_median].median())
    
    x_main['Neurofc'] = x_main['Neurofc'].fillna(2)
    
    x_main['comorbid'] = x_main['comorbid'].fillna(int(x_main['comorbid'].median()))
    
    # drop surgery
    x_main = x_main.drop(['Surgery'], axis=1)
    
    # normalize all x
    
    x_main_normalized = x_main.apply(lambda x: (x-np.mean(x))/(np.std(x)+1e-10))
    
    from sklearn.model_selection import train_test_split
    
    x_train, x_test, y_train, y_test = train_test_split(x_main, y_main, test_size=0.3)
    x_test, x_val, y_test, y_val = train_test_split(x_test, y_test, test_size=0.5)
    
    last_layer = 1
    
    params = {'lr': 0.0001,
     'batch_size': 30,
     'epochs': 100,
     'dropout': 0.2,
     'weight_regulizer':['l2'],
     'optimizer': 'sgd',
     'losses': 'categorical_crossentropy',
     'activation':'relu',
     'last_activation': 'softmax'}
    
    from keras.utils.np_utils import to_categorical
    
    if params['losses']=='categorical_crossentropy':
        y_train = to_categorical(y_train,num_classes=4)
        y_val = to_categorical(y_val,num_classes=4)
        y_test = to_categorical(y_test,num_classes=4)
        last_layer=4
    
    x_train = x_train
    x_val = x_val
    y_train = y_train
    y_val = y_val
    
    
    
    return x_train, y_train, x_val, y_val
    
  2. 我也遇到了错误

    TypeError:“生成器”对象不可下标

如果您遵循hyperas github,则解决方法是

pip install networkx==1.11