引言
学了半天的卷积神经网络,总结来说,最关键的点还是算法的设计和参数的训练
调参工程师
正常我们是不知道该使用多少的超参数的,这是一个黑盒的运行方式,
注解: 参考
超参数:训练过程的参数,理解为与模型参数无关,但影响训练效果,如学习率, 隐藏层数,神经元个数
模型超参数: 隐藏层数, 神经元数, 算法超参数:学习率,k邻参数
参数: 就是函数的参数, w, b 等都是参数
下面介绍如何通过tensorflow 的 tuners获取超参数
安装
pip install -q -U keras-tuner # -q 日志等级 -u升级pip
pip 命令参考
引入需要的包
import tensorflow.keras as keras
import keras.datasets.mnist as datasets
import kerastuners as tk
from kerastuners.engine.hyperparameters import HyperParameters
- 加载数据
(train_data, train_label), (test_data, test_label) = datasets.load_data()
# 处理数据 归一化
train_data, test_data = train_data/255.0, test_data/255
- 定义tunner
hp = HyperParameters()
def build_model(hp):
#定义模型
model = keras.Squential([
keras.layers.Flatten(input_shape = (28, 28),
keras.layers.Dense(hp.Int("layer1", min_value = 32, max_value = 512, step = 21), activation = 'relu'),
keras.layers.Dense(10, activation = 'softmax')
])
model.compile(train_data, test_data,
optimizer = keras.optimizers.Adam(hp.Choice(leran', values=[1e-2, 1e-3, 1e-3]), loss=keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics = ['acc'])
- 搜索参数
tuner = tk.Hyperband(build_model,
objective = 'val_acc',
max_epochs = 30,
factor = 3,
directory = 'my',
hyperparameters = hp,
project_name = 'project')
tuner.search(trian_data, train_label, epochs = 50)
- 查看参数
best_hp = tuner.get_best_hyperparameters()[0]
best_hp.values
- 构建模型
best_hps=tuner.get_best_hyperparameters(num_trials=1)[0]
model = tuner.hypermodel.build(best_hps)
- 查看参数
model.summary()
- 训练模型
model.fit(train_data, train_label, epochs= 10)
完整代码 Jupyter-lab
# %%
import tensorflow.keras as keras
(train_data, train_label), (test_data, test_label) = keras.datasets.mnist.load_data()
# %%
train_data, test_data = train_data/255.0, test_data/255.0
# %%
# %%
# %%
import matplotlib.pyplot as plt
from kerastuner.tuners import Hyperband
from kerastuner.engine.hyperparameters import HyperParameters
hp = HyperParameters()
hp_units = hp.Int("first", min_value=32, max_value = 512, step = 32)
hp_rate = hp.Choice('leran', values=[1e-2, 1e-3, 1e-3])
def build_model(hp):
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(hp_units, activation = 'relu'),
keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer=keras.optimizers.Adam(learning_rate = hp_rate), loss= keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['accuracy'])
return model
tuner = Hyperband(build_model,
objective='val_accuracy',
max_epochs=10,
factor=3,
directory = 'my_dir',
hyperparameters=hp,
project_name = 'intro_to_tk'
)
stop_early = keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
tuner.search(train_data, train_label, epochs=50, validation_split=0.2, callbacks=[stop_early])
# Get the optimal hyperparameters
#
# %%
best_hp = tuner.get_best_hyperparameters()[0]
best_hp.values
# %%
best_hps=tuner.get_best_hyperparameters(num_trials=1)[0]
model = tuner.hypermodel.build(best_hps)
# %%
model.summary()
# %%
model.fit(train_data, train_label, epochs= 10)
# %%
model.evaluate(test_data, test_label)
# %%
test_label[0]
# %%
import os
img = plt.imread('./shoes.png')
plt.imshow(img[:,:, 1], cmap=plt.cm.binary)
# %%
img.shape
# %%
train_data[0].shape
# %%
img.reshape(28, 28, -1)
# %%
img.shape
# %%