我正在尝试想出一种方法来使用 Keras-Tuner 为我的 CNN 自动识别最佳参数。我正在使用Celeb_a数据集
我尝试了一个类似的项目,其中我使用了 fashion_mnist,并且效果很好,但是我对 python 的经验不足以完成我想要实现的目标。当我尝试使用 fashion_mnist 时,我设法创建了这个结果表
我的代码在这里。
我希望使用 Celeb_a 数据集生成一个类似的表。这是我为大学做的报告。在报告中,我的大学使用AWS Rekognition生成了下表。
我希望能够训练数据,以便我可以将此模型保存到 pickle 并生成类似的结果表来比较它们。
关于如何解决这个问题的任何建议?我目前的疑问是:
- 如何正确加载数据集?
- 我如何训练模型以使我在“小胡子”、“胡须”、“情感”上准确(如上面的结果表中所示)
我尝试使用以下方法加载数据:
(x_train, y_train), (x_test, y_test) = tfds.load('celeb_a')
但这给了我以下错误
AttributeError: Failed to construct dataset celeb_a: module 'tensorflow_datasets.core.utils' has no attribute 'version'
我在用:
Conda: TensorFlow (Python 3.8.5)
Windows 10 Pro
Intel(R) Core(TM) i3-4170 CPU @ 3.7GHz
64-bit
这是我用来启动的脚本,与我的 bitbucket 中的脚本相同,任何帮助将不胜感激。先感谢您。
# -*- coding: utf-8 -*-
import tensorflow_datasets as tfds
#from tensorflow.keras.datasets import fashion_mnist
#import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Activation
from kerastuner.tuners import RandomSearch
#from kerastuner.engine.hyperparameters import HyperParameter
import time
import os
LOG_DIR = f"{int(time.time())}"
(x_train, y_train), (x_test, y_test) = tfds.load('celeb_a')
x_train = x_train.reshape(-1,28,28,1)
x_test = x_test.reshape(-1,28,28,1)
def build_model(hp): #random search passes this hyperparameter() object
model = keras.models.Sequential()
#model.add(Conv2D(32, (3, 3), input_shape=x_train.shape[1:]))
model.add(Conv2D(hp.Int("input_units", min_value=32, max_value=256, step=32), (3,3), input_shape = x_train.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
for i in range(hp.Int("n_layers",min_value = 1, max_value = 4, step=1)):
#model.add(Conv2D(32, (3, 3)))
model.add(Conv2D(hp.Int(f"conv_{i}_units", min_value=32, max_value=256, step=32), (3,3)))
model.add(Activation('relu'))
#model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
return model
tuner = RandomSearch(build_model,
objective = "val_accuracy",
max_trials = 1,
executions_per_trial=1, #BEST PERFOMANCE SET TO 3+
directory= os.path.normpath('C:/'),# there is a limit of characters keep path short
overwrite=True #need this to override model when testing
)
tuner.search(x=x_train,
y=y_train,
epochs=1,
batch_size=64,
validation_data=(x_test,y_test),)