Предложенное ниже носит характер рекомендаций, которые можно попробовать для конкретнных NN. Здесь нет однозначного решения. Keras Tuner часто дает информацию для принятия стартовых решений по гиперпараметрам.
1) Один из методов,состоит в том, чтобы добавлять слои до тех пор, пока вы не начнете переобучать свой тренировочный набор. Затем вы добавляете отсев или другой метод регуляризации.Идея состоит в том, что, как только ваша сеть перенастроится, вы будете уверены, что она достаточно мощна для вашей задачи. Исключение помогает предотвратить совместную адаптацию функций и, следовательно, избежать переобучения.У вас есть мощная модель, которая вынуждена разумно использовать свою мощь.Количество нейронов в каждом слое не имеет большого значения. Обычно вы помещаете на первый слой немного больше или столько же нейронов, чем входных, и постепенно уменьшаете до последнего слоя.
============================================
2) KerasTuner выводит журналы на экран, включая значения гиперпараметров в каждом испытании, чтобы пользователь мог отслеживать ход выполнения. Однако чтение журналов недостаточно интуитивно понятно, чтобы ощутить влияние гиперпараметров на результаты.
(.env) boris@boris-All-Series:~/FOREL/KERASTUNER$ cat kerasTuner.py
import numpy as np
import keras_tuner
from tensorflow import keras
from tensorflow.keras import layers
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# Normalize the pixel values to the range of [0, 1].
x_train = x_train.astype("float32") / 255
x_test = x_test.astype("float32") / 255
# Add the channel dimension to the images.
x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)
# Print the shapes of the data.
print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)
def build_model(hp):
inputs = keras.Input(shape=(28, 28, 1))
# Model type can be MLP or CNN.
model_type = hp.Choice("model_type", ["mlp", "cnn"])
x = inputs
if model_type == "mlp":
x = layers.Flatten()(x)
# Number of layers of the MLP is a hyperparameter.
for i in range(hp.Int("mlp_layers", 1, 3)):
# Number of units of each layer are
# different hyperparameters with different names.
output_node = layers.Dense(
units=hp.Int(f"units_{i}", 32, 128, step=32), activation="relu",
)(x)
else:
# Number of layers of the CNN is also a hyperparameter.
for i in range(hp.Int("cnn_layers", 1, 3)):
x = layers.Conv2D(
hp.Int(f"filters_{i}", 32, 128, step=32),
kernel_size=(3, 3),
activation="relu",
)(x)
x = layers.MaxPooling2D(pool_size=(2, 2))(x)
x = layers.Flatten()(x)
# A hyperparamter for whether to use dropout layer.
if hp.Boolean("dropout"):
x = layers.Dropout(0.5)(x)
# The last layer contains 10 units,
# which is the same as the number of classes.
outputs = layers.Dense(units=10, activation="softmax")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
# Compile the model.
model.compile(
loss="sparse_categorical_crossentropy", metrics=["accuracy"], optimizer="adam",)
return model
# Initialize the `HyperParameters` and set the values.
hp = keras_tuner.HyperParameters()
hp.values["model_type"] = "cnn"
# Build the model using the `HyperParameters`.
model = build_model(hp)
# Test if the model runs with our data.
model(x_train[:100])
# Print a summary of the model.
model.summary()
# Do the same for MLP model.
hp.values["model_type"] = "mlp"
model = build_model(hp)
model(x_train[:100])
model.summary()
No comments:
Post a Comment