我的情况是:多类分类问题,有5个特征(我的数据中的列),15个类,单个标签。我的模型是:一个有5个神经元的输入层,只有一个带ReLU的隐藏层,一个带softmax的输出层。我有两个问题:
- 输入层有多少神经元?它确定是根据特征的数量加上偏差来设置的吗?我试着调整输入层的神经元数量,比如77个神经元,性能提高了,所以我很困惑。
- 我尝试随机搜索cv来找到隐藏层的数量,神经元的数量和学习率,我在Scikit学习中使用Randomizedsearchcv,然后best_params将显示如下:
{learning_rate: 0.0023716395806862335,"n_layer":1、"n_neurons":291}
所以,问题是,假设它显示best_params 'n_layer': 2,但'n_neurons': 291。所以它被解释为每层291个神经元,模型中有2个隐藏层?提前感谢!
第一个问题的答案:输入层的形状设置特征的基数。在你的问题中,你需要5个特征,那么输入层需要5个,在我的例子中,我有784个特征,那么输入层的形状应该是784。
是的,我们有规则来找到DNN层中的神经元数量。我强烈建议您使用Keras Tuner
。KerasTuner找到最佳超参数值贝叶斯优化,Hyperband,随机搜索算法。我用fashion_mnist
数据集和你在问题中解释的模型写了一个例子。我用epoch=2
,你可以用这个搜索更大的时代为你的问题。对于这个问题,KerasTuner
发现first layer = 416
(<-你想找到这个)和learning_rate-0.0001
.
# !pip install -q -U keras-tuner
import tensorflow as tf
import keras_tuner as kt
(img_train, label_train), (img_test, label_test) = tf.keras.datasets.fashion_mnist.load_data()
# Normalize pixel values between 0 and 1
img_train = img_train.astype('float32') / 255.0
img_train = img_train.reshape(60000, -1)
img_test = img_test.astype('float32') / 255.0
img_test = img_test.reshape(10000, -1)
label_train = tf.keras.utils.to_categorical(label_train, 10)
label_test = tf.keras.utils.to_categorical(label_test, 10)
def model_builder(hp):
model = tf.keras.Sequential()
model.add(tf.keras.layers.Input(784,))
# Tune the number of units in the first Dense layer
# Choose an optimal value between 32-512
hp_units = hp.Int('units', min_value=32, max_value=512, step=32)
model.add(tf.keras.layers.Dense(units=hp_units, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
# Tune the learning rate for the optimizer
# Choose an optimal value from 0.01, 0.001, or 0.0001
hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=hp_learning_rate),
loss = 'categorical_crossentropy', metrics = ['accuracy'])
return model
tuner = kt.Hyperband(model_builder,objective='val_accuracy',max_epochs=3,
factor=3,directory='my_dir',project_name='intro_to_kt')
stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
tuner.search(img_train, label_train, epochs=2, validation_split=0.2, callbacks=[stop_early])
# Get the optimal hyperparameters
best_hps=tuner.get_best_hyperparameters(num_trials=1)[0]
print(f"BEST num neurons for Dense Layer : {best_hps.get('units')}")
print(f"BEST learning_rate : {best_hps.get('learning_rate')}")
输出:
Trial 11 Complete [00h 00m 14s]
val_accuracy: 0.8530833125114441
Best val_accuracy So Far: 0.8823333382606506
Total elapsed time: 00h 01m 03s
INFO:tensorflow:Oracle triggered exit
BEST num neurons for Dense Layer : 416 # <- You want this
BEST learning_rate : 0.001