好,所以我尝试使用scikit-learn
为Keras中的图像分类模型使用网格搜索超参数。有人告诉我这是不可能的。但是,当我运行代码时,我将向您展示它所产生的效果类似于我的期望。
因此,如果无法使用scikit-learn对图像分类模型的超参数进行网格搜索,那么为什么我没有得到相应的输出,以及如何在Keras中对图像分类模型的栅格化超参数呢? / p>
在此先感谢您的阅读和帮助。
import sys
from matplotlib import pyplot
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Dense
from keras.layers import Flatten
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator
import numpy
from sklearn.model_selection import GridSearchCV
from keras.wrappers.scikit_learn import KerasClassifier
def create_model():
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(256, 256, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(44, activation='softmax'))
# compile model
opt = SGD(lr=0.001, momentum=0.9)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
return model
seed = 7
numpy.random.seed(seed)
datagen = ImageDataGenerator(rescale=1.0/255.0)
dataset = datagen.flow_from_directory('dataset_dog_breeds/train/', class_mode='categorical')
X, Y = dataset.next()
model = KerasClassifier(build_fn=create_model, verbose=0)
batch_size = [10, 20, 40, 60, 80, 100]
epochs = [10, 50, 100]
param_grid = dict(batch_size=batch_size, epochs=epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=1, cv=3)
grid_result = grid.fit(X, Y)
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
print("%f (%f) with: %r" % (mean, stdev, param))
Best: 0.093750 using {'batch_size': 40, 'epochs': 100}
0.031250 (0.043178) with: {'batch_size': 10, 'epochs': 10}
0.000000 (0.000000) with: {'batch_size': 10, 'epochs': 50}
0.062500 (0.045383) with: {'batch_size': 10, 'epochs': 100}
0.062500 (0.045383) with: {'batch_size': 20, 'epochs': 10}
0.031250 (0.043178) with: {'batch_size': 20, 'epochs': 50}
0.062500 (0.045383) with: {'batch_size': 20, 'epochs': 100}
0.000000 (0.000000) with: {'batch_size': 40, 'epochs': 10}
0.062500 (0.042137) with: {'batch_size': 40, 'epochs': 50}
0.093750 (0.004214) with: {'batch_size': 40, 'epochs': 100}
0.062500 (0.086356) with: {'batch_size': 60, 'epochs': 10}
0.031250 (0.043178) with: {'batch_size': 60, 'epochs': 50}
0.062500 (0.092702) with: {'batch_size': 60, 'epochs': 100}
0.000000 (0.000000) with: {'batch_size': 80, 'epochs': 10}
0.000000 (0.000000) with: {'batch_size': 80, 'epochs': 50}
0.000000 (0.000000) with: {'batch_size': 80, 'epochs': 100}
0.000000 (0.000000) with: {'batch_size': 100, 'epochs': 10}
0.031250 (0.043178) with: {'batch_size': 100, 'epochs': 50}
0.000000 (0.000000) with: {'batch_size': 100, 'epochs': 100}
答案 0 :(得分:1)
当然,即使使用神经网络,使用网格搜索进行超参数优化也是可能。但是,对于复杂的问题(涉及成千上万的参数和大数据集),不可行。
当您遇到训练需要数小时至数天不等的问题时,详尽的网格搜索效率极低,您可能会自行调整更好的超参数。
总而言之,您的结果可能是完全正确的-只是与神经网络一起使用时,网格搜索无法很好地扩展。
答案 1 :(得分:0)
对于神经网络而言,网格搜索不是首选方法,因为参数往往取决于数据类型和模型。而且,它们需要大量的计算和时间。但是,只要用例很小,您仍然可以尝试。
但是理想情况下,批处理大小应取决于您拥有的GPU / CPU计算资源,并且应根据损失曲线计算历元,以避免过度拟合。网格随机搜索这两个参数既没有效率,也没有生产力。尝试其他参数。
答案 2 :(得分:0)
您可以考虑以从粗到精的方式进行网格搜索。例如,批量大小为16、32、64和128会很有意义。搜索历元的次数不是很多,因为显然,训练的越多,训练错误就可能越好(当然,除非收敛)。我建议您一开始就将其修复为您认为理想的状态。
在学习速率或学习速率衰减或其他任何因素上进行网格搜索时,首先进行粗略搜索,然后将其绘制在类似热图的图中,其中x轴表示学习速率,y轴表示衰减。热轴应该是您的验证精度。目视检查,之后,您可以对找到的值进行更精细的搜索!