hyperopt使用

一、下载包

pip install hyperopt

二、贝叶斯优化使用

from hyperopt import hp,STATUS_OK,Trials,fmin,tpe

2.1 fmin

fmin是指寻找某个函数的最小值,函数的参数用lambda x进行指定,space指明寻找的参数范围,algo指明搜索算法,max_evals为最大评估次数。

2.1.1 fn

fn 指定参数以及函数方法
先看一个简单的使用例子:在(0,1)空间上寻找x的最小值,寻优结果最小值为:0.0001083848848416751趋近于0

min_best = fmin(
    fn=lambda x: x,
    space=hp.uniform('x', 0, 1),
    algo=tpe.suggest,
    max_evals=100)
print(min_best)
{'x': 0.00010838488484167519}

同样fn可以是指定函数:

min_best = fmin(
    fn=lambda x: x**2-2*x,
    space=hp.uniform('x', 0, 1),
    algo=tpe.suggest,
    max_evals=100)
print(min_best)
{'x': 0.9991971325808372}

同时fn中若要使用多元函数应该使用function形式进行定义:

def f (param):
    result=(param['x']+param['y'])**2-2*param['x']
    return result
space = {
    'x': hp.choice('x',range(1,20)),
    'y': hp.uniform('y', 1,5)}
min_best = fmin(
    fn=f,
    space=space,
    algo=tpe.suggest,
    max_evals=100)
print(min_best)
{'x': 0, 'y': 1.2524785791821587}

2.1.2 space

space可以接受字典的输入方式,通过hp包来实现范围之内的取值,例如hp.uniform指搜索(0,2)上连续的点,hp.choice指(0,2)上的整点,关于hp的选择,下图有详细解释:
在这里插入图片描述

space = {
    'x': hp.choice('x', range(1,20)),
    'y': hp.choice('y',range(1,5)),
    'criterion': hp.choice('criterion', ["gini", "entropy"]),
}

2.1.3 Trials 捕获信息

Trials帮助我们了解到hyperopt黑匣子内发生了什么
Trials对象允许我们在每个时间步存储信息。然后我们可以将它们打印出来,并在给定的时间步查看给定参数的函数评估值。

def f (param):
    result=(param['x']+param['y'])**2-2*param['x']
    return result
trials = Trials()
space = {
    'x': hp.choice('x',range(1,20)),
    'y': hp.uniform('y', 1,5)}
min_best = fmin(
    fn=f,
    space=space,
    algo=tpe.suggest,
    max_evals=100,
    trials=trials)
print(min_best)
for trial in trials.trials[:2]:
    print(trial)
100%|██████████████████████████████████████████████| 100/100 [00:00<00:00, 226.67trial/s, best loss: 2.119808416865758]
{'x': 0, 'y': 1.0297311193519594}
{'state': 2, 'tid': 0, 'spec': None, 'result': {'loss': 26.92689737519718, 'status': 'ok'}, 'misc': {'tid': 0, 'cmd': ('domain_attachment', 'FMinIter_Domain'), 'workdir': None, 'idxs': {'x': [0], 'y': [0]}, 'vals': {'x': [3], 'y': [1.9098982542170027]}}, 'exp_key': None, 'owner': None, 'version': 0, 'book_time': datetime.datetime(2022, 9, 24, 11, 23, 0, 301000), 'refresh_time': datetime.datetime(2022, 9, 24, 11, 23, 0, 301000)}
{'state': 2, 'tid': 1, 'spec': None, 'result': {'loss': 18.028522718941552, 'status': 'ok'}, 'misc': {'tid': 1, 'cmd': ('domain_attachment', 'FMinIter_Domain'), 'workdir': None, 'idxs': {'x': [1], 'y': [1]}, 'vals': {'x': [1], 'y': [2.6934553070143914]}}, 'exp_key': None, 'owner': None, 'version': 0, 'book_time': datetime.datetime(2022, 9, 24, 11, 23, 0, 304000), 'refresh_time': datetime.datetime(2022, 9, 24, 11, 23, 0, 304000)}

tid是时间 id,即时间步,其值从0到max_evals-1。它随着迭代次数递增。
'x’和‘y’是键’vals’的值,其中存储的是每次迭代参数的值。'loss’是键’result’的值,其给出了该次迭代目标函数的值

2.1.4 SVM 调参例子

from sklearn.svm import SVC
from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
y = iris.target
def hyperopt_train_test(params):
    X_ = X[:]

    clf = SVC(**params)
    return cross_val_score(clf, X_, y).mean()
space4svm = {
    'C': hp.uniform('C', 0, 20),
    'kernel': hp.choice('kernel', ['linear', 'sigmoid', 'poly', 'rbf']),
    'gamma': hp.uniform('gamma', 0, 20),
}
def f(params):
    acc = hyperopt_train_test(params)
    return {'loss': -acc, 'status': STATUS_OK}
trials = Trials()
best = fmin(f, space4svm, algo=tpe.suggest, max_evals=100, trials=trials)
print('best:')
print(best)
100%|█████████████████████████████████████████████| 100/100 [00:08<00:00, 11.35trial/s, best loss: -0.9866666666666667]
best:
{'C': 1.6130746771125175, 'gamma': 18.56247523455796, 'kernel': 0}

值得注意的是对于hp.choice来说’kernel’: 0代表的是第0个位置上的取值

2.1.5 画图可视化

plt.scatter(x,y,c=y,cmap=plt.cm.gist_rainbow,s=20)#cm即colormap,c=y表示颜色随y变化
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np 
 
# 定义画图参数
parameters = ['C', 'kernel', 'gamma']
cols = len(parameters)
#定义画布
f, axes = plt.subplots(nrows=1, ncols=cols, figsize=(20, 5))

#定义画布颜色:网址如下
#https://www.baidu.com/s?wd=colormap%20python%E6%98%AF%E4%BB%80%E4%B9%88&rsv_spt=1&rsv_iqid=0x96a9df67001103cb&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&rsv_dl=tb&oq=colormap&rsv_btype=t&rsv_t=1842hZgKyjwYUgbmm13Gh4ejKM7vUSdb47VnotpN01ifGSLnaueUknyNmzoBA9LHmWIQ&rsv_pq=9f6a494800014b9e&inputT=3252&rsv_sug3=41&rsv_sug1=15&rsv_sug7=100&rsv_sug2=0&rsv_sug4=3727
cmap = plt.cm.jet

for i, val in enumerate(parameters):
    xs = np.array([t['misc']['vals'][val] for t in trials.trials]).ravel()
    ys = [-t['result']['loss'] for t in trials.trials]
    axes[i].scatter(
        xs,
        ys,
        s=20,
        linewidth=0.02,
        alpha=0.25,
        c=cmap(float(i) / len(parameters)))
    axes[i].set_title(val)
    axes[i].set_ylim([0.9, 1.0])#根据loss值来的:-0.9866666666666667
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Hyperopt是一种基于贝叶斯优化的超参数优化工具,可以用于优化PyTorch神经网络模型的超参数。下面是一个简单的示例: 首先,安装必要的库: ``` pip install hyperopt pip install torch ``` 然后,定义一个目标函数,该函数接受超参数并返回模型的性能指标。在这个例子中,我们将使用CIFAR-10数据集,使用交叉熵损失函数和Adam优化器。 ```python import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from hyperopt import fmin, tpe, hp, STATUS_OK def train_model(params): # 定义超参数 lr = params['lr'] dropout_prob = params['dropout_prob'] hidden_size = params['hidden_size'] batch_size = params['batch_size'] epochs = params['epochs'] # 加载CIFAR-10数据集 transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) train_set = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) test_set = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) train_loader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True) test_loader = torch.utils.data.DataLoader(test_set, batch_size=batch_size, shuffle=False) # 定义模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, hidden_size) self.fc2 = nn.Linear(hidden_size, 10) self.dropout = nn.Dropout(p=dropout_prob) def forward(self, x): x = self.pool(torch.relu(self.conv1(x))) x = self.pool(torch.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = self.dropout(torch.relu(self.fc1(x))) x = self.fc2(x) return x net = Net() # 训练模型 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(net.parameters(), lr=lr) for epoch in range(epochs): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print('Epoch %d loss: %.3f' % (epoch + 1, running_loss / len(train_loader))) # 测试模型 correct = 0 total = 0 with torch.no_grad(): for data in test_loader: images, labels = data outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() accuracy = 100 * correct / total print('Accuracy: %.2f%%' % accuracy) return {'loss': -accuracy, 'status': STATUS_OK} ``` 接下来,定义超参数的搜索空间: ```python space = { 'lr': hp.choice('lr', [0.001, 0.01, 0.1]), 'dropout_prob': hp.uniform('dropout_prob', 0.0, 0.5), 'hidden_size': hp.choice('hidden_size', [64, 128, 256]), 'batch_size': hp.choice('batch_size', [32, 64, 128]), 'epochs': hp.choice('epochs', [10, 20, 30]) } ``` 最后,使用Hyperopt运行优化: ```python best = fmin(train_model, space, algo=tpe.suggest, max_evals=100) print(best) ``` 这将运行100个模型训练,使用TPE算法搜索最佳超参数组合,并返回最佳超参数组合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值