TypeError:无法腌制_thread.RLock对象-尝试保存使用keras完成的实验时

时间:2020-07-25 06:03:57

标签: python-3.x pickle tensorflow2.0 keras-2

我进行了一些实验,将每个实验的结果保存在词典中,然后将各个词典存储在另一本词典中。但是我无法保存这本词典。这是我的代码:

def f_compile_fit_evaluate_model1(filters1, kernel_size1, filters2 , kernel_size2, epochs):
    
    '''
    This function takes parameters and fits a model, evaluates it on the dev set and stores key objects --a) the model itself, b) the history of the training and c) the results of the
    evaluation, into a dictionary which it returns.
    
    INPUTS:
    
        - filters1 : Number of filters (channels) that are used to transform the inputs through Conv1D layers (all inputs are processed with Conv1D layers with the same number of
                     of filters/channels)
        - kernel_size1 : The kernel size of the Conv1D layers that process and transform the Inputs
        - filters2 : Number of filters of the Conv1D later that is used to transform the concatenated outputs of the first block of Conv1D layers (which processed the raw inputs individually.)
        - kernel_size2 : The kernel size of the Conv1D layer described above
        
        In addition inputs of this function are the data which are passed it through the global environment and not explicitly through the function call.
        E.g., setting1_train_, setting2_train_ etc.
        
    OUTPUTS:
    
        Experiment_results :A dictionary containing three keys: a) model, b) history and c) evaluation
        
        
    '''

    setting1 = Input(shape = (10,8), name = 'setting1')
    setting2 = Input(shape = (10,8), name = 'setting2')
    s2 = Input(shape = (10,8), name = 's2')
    s3 = Input(shape = (10,8), name = 's3')
    s6 = Input(shape = (10,8), name = 's6')
    s7 = Input(shape = (10,8), name = 's7')
    s8 = Input(shape = (10,8), name = 's8')
    s9 = Input(shape = (10,8), name = 's9')
    s11 = Input(shape = (10,8), name = 's11')
    s12 = Input(shape = (10,8), name = 's12')
    s13 = Input(shape = (10,8), name = 's13')
    s14 = Input(shape = (10,8), name = 's14')
    s15 = Input(shape = (10,8), name = 's15')
    s17 = Input(shape = (10,8), name = 's17')
    s20 = Input(shape = (10,8), name = 's20')
    s21 = Input(shape = (10,8), name = 's21')

    setting1_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(setting1)
    setting2_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(setting2)
    s2_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s2)
    s3_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s3)
    s6_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s6)
    s7_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s7)
    s8_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s8)
    s9_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s9)
    s11_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s11)
    s12_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s12)
    s13_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s13)
    s14_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s14)
    s15_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s15)
    s17_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s17)
    s20_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s20)
    s21_ = Conv1D(filters = filters1, kernel_size = kernel_size1, activation = 'relu')(s21)

    x = Concatenate()([setting1_, setting2_, s2_, s3_, s6_, s7_, s8_, s9_, s11_, s12_, s13_, s14_, s15_, s17_, s20_, s21_])

    x = Conv1D(filters =filters2, kernel_size = kernel_size2, activation = 'relu')(x)

    x = GlobalMaxPooling1D()(x)

    preds = Dense(1, activation = 'relu')(x)

    model = Model(inputs = [setting1, setting2, s2, s3, s6, s7, s8, s9, s11, s12, s13, s14, s15, s17, s20, s21], outputs = preds)

    model.compile(loss = 'mean_squared_error',  optimizer = 'Adam', metrics = ['MAPE'])

    history = model.fit(x = [setting1_train_, setting2_train_, s2_train_, s3_train_, s6_train_, s7_train_, s8_train_, s9_train_, s11_train_, s12_train_, s13_train_, s14_train_, s15_train_,
                  s17_train_, s20_train_, s21_train_], y = target_train_, validation_data = ([setting1_dev_, setting2_dev_, s2_dev_, s3_dev_, s6_dev_, s7_dev_, s8_dev_, s9_dev_,
                    s11_dev_, s12_dev_, s13_dev_, s14_dev_, s15_dev_,s17_dev_, s20_dev_, s21_dev_], target_dev_), epochs = epochs)
    
    evaluation = model.evaluate(x = [setting1_dev_, setting2_dev_, s2_dev_, s3_dev_, s6_dev_, s7_dev_, s8_dev_, s9_dev_, s11_dev_, s12_dev_, s13_dev_, s14_dev_, s15_dev_,
              s17_dev_, s20_dev_, s21_dev_], y = target_dev_)
    
    #preds = model.predict(x = [setting1_dev_, setting2_dev_, s2_dev_, s3_dev_, s6_dev_, s7_dev_, s8_dev_, s9_dev_, s11_dev_, s12_dev_, s13_dev_, s14_dev_, s15_dev_,
    #          s17_dev_, s20_dev_, s21_dev_])
    
    #pd.Series(target_dev_).plot()
    #pd.Series(preds1.ravel()).plot(color= 'red')
    
    Experiment_results = {}
    
    Experiment_results['model'] = model
    Experiment_results['history'] = history
    Experiment_results['evaluation'] = evaluation
    
    return(Experiment_results)

def pickle_save(my_object, name, path = ''):
    
    import pickle
    import os
    
    if path == '':
        path = os.getcwd()
    
    filename = path + '\\' + name + '.pkl'
    
    with open(filename, 'wb') as f:
        
        pickle.dump(my_object, f, pickle.HIGHEST_PROTOCOL)
    
epochs = 2 # Here I set the number of epochs

#This code runs experiments with random values of parameters and stores them in a dictionary named Experiments

%%time
for i in tqdm(range(10, 159)):
    
    filters1 = np.random.choice([2**4, 2**5, 2**6, 2**7, 2**8, 2**9])

    filters2 = np.random.choice([2**4, 2**5, 2**6, 2**7, 2**8, 2**9])

    kernel_size1 = (np.random.choice([2,3, 4, 5]),)

    kernel_size2 = (np.random.choice([2,3, 4, 5]),)

    Experiment_results = f_compile_fit_evaluate_model1(filters1, kernel_size1 ,filters2, kernel_size2, epochs )
    Experiments[i] = {'filters1' : filters1, 'kernel_size1' : kernel_size1, 'filters2' : filters2, 'kernel_size2' : kernel_size2, 'epochs' : epochs, 
                      'MAPE' : Experiment_results['evaluation'][1], 'Experiment_results' : Experiment_results}

pickle_save(Experiments, 'Experiments1')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-85-b583b263ca6d> in <module>
----> 1 pickle_save(Experiments, 'Experiments1')

<ipython-input-7-d949b816cd60> in pickle_save(my_object, name, path)
     90     with open(filename, 'wb') as f:
     91 
---> 92         pickle.dump(my_object, f, pickle.HIGHEST_PROTOCOL)
     93 
     94 

TypeError: can't pickle _thread.RLock objects

是什么原因引起的问题?我该如何解决?

0 个答案:

没有答案