python - 使用 Keras 和 Hyperas 进行参数调整

标签 python machine-learning keras neural-network deep-learning

我一直在使用一个名为 Hyperas 的 Python 库,它是一个 hyperopt/keras 包装器,用于调整 Keras 模型中的参数。我的问题是关于 Hyperas 的输出。

我已阅读文档和源代码,但似乎无法弄清楚输出的含义或如何解释。完成优化后,它会打印以下行:

{'batch_size': 3, 'optimizer': 1, 'l2': 0.7446290506725413, 'output_dim': 3, 'output_dim_1': 0, 'l2_1': 0.12090219120950985}

尽管我的代码中只有一个 output_dim 参数,为什么 output_dim 有两个字典值?我如何解释其他一切?

def model(X_train, X_test, y_train, y_test, max_features, maxlen, class_weight_dict):
        model = Sequential()
        model.add(Embedding(max_features, output_dim = {{choice([32,64,128,256,512])}}, input_length=maxlen))
        model.add(LSTM({{choice([32,64,128,256,512])}},W_regularizer=l2({{uniform(0, 1)}})))
        model.add(Dropout({{uniform(0, 1)}}))
        model.add(Dense(138))
        model.add(Activation('softmax'))

        model.compile(loss='categorical_crossentropy',
                      optimizer={{choice(['rmsprop', 'adam', 'sgd'])}},
                      metrics=['accuracy'])

        early_stopping = EarlyStopping(monitor='val_loss', patience=4)
        checkpointer = ModelCheckpoint(filepath='keras_weights.hdf5',
                                       verbose=1,
                                       save_best_only=True)

        model.fit(X_train, y_train,
                  batch_size={{choice([32,16,64,128,256,512])}},
                  validation_data=(X_test, y_test),
                  nb_epoch=100,
                  class_weight=class_weight_dict,
                  callbacks=[early_stopping, checkpointer])

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

    if __name__ == '__main__':
        best_run, best_model = optim.minimize(model=model,
                                              data=data,
                                              algo=tpe.suggest,
                                              max_evals=10,
                                              trials=Trials())
        print(best_run)
        print(best_model)

最佳答案

所以这是因为你的参数没有命名,让我们看看这一行:

 model.add(LSTM({{choice([32,64,128,256,512])}},W_regularizer=l2({{uniform(0, 1)}})))

因为此选择未命名 - hyperas 正在扫描函数定义并查找参数名称。由于它没有命名 - 它分配先前命名的参数的值,即 output_1。为了跳过该尝试:

model.add(LSTM(units={{choice([32,64,128,256,512])}},...)

并对辍学率做类似的事情:

model.add(Dropout(rate=..))

关于python - 使用 Keras 和 Hyperas 进行参数调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48628041/

相关文章:

r - 如何在循环中训练多个模型

machine-learning - 计算混合特征分类的向量距离

python - 如何用keras制作3D滤镜

python - 是否有一个简单的单行代码来访问 Python 中嵌套字典的每个元素?

python - Anaconda:UnicodeDecodeError: 'utf8'编解码器无法解码位置1412中的字节0x92:无效的起始字节

python - 如何使用python从unicode转换

python-3.x - ImportError:没有名为 'keras.layers.merge' 的模块

python - 如何将滑动窗口的 3d 数组展平为 2d 数组?

numpy - 怎么理解这个: `db = np.sum(dscores, axis=0, keepdims=True)`

python - Keras IMDB 数据集数据是如何预处理的?