我的模型-
# define encodervisible = Input(shape=(n_inputs,))# encoder level 1e = Dense(400)(visible)e = Dropout(0.05)(e)e = ReLU()(e)# encoder level 2e = Dense(300)(visible)e = Dropout(0.05)(e)e = ReLU()(e)# encoder level 3e = Dense(200)(visible)e = Dropout(0.05)(e)e = ReLU()(e)# encoder level 4e = Dense(100)(visible)e = Dropout(0.05)(e)e = ReLU()(e)# encoder level 4e = Dense(50)(visible)e = Dropout(0.05)(e)e = ReLU()(e)# bottleneckn_bottleneck = n_inputsbottleneck = Dense(n_bottleneck)(e)# define decoder, level 1d = Dense(50)(bottleneck)d = Dropout(0.05)(d)d = ReLU()(d)# define decoder, level 2d = Dense(100)(bottleneck)d = Dropout(0.05)(d)d = ReLU()(d)# define decoder, level 3d = Dense(200)(bottleneck)d = Dropout(0.05)(d)d = ReLU()(d)# define decoder, level 4d = Dense(300)(bottleneck)d = Dropout(0.05)(d)d = ReLU()(d)# define decoder, level 4d = Dense(400)(bottleneck)d = Dropout(0.05)(d)d = ReLU()(d)# output layeroutput = Dense(n_inputs, activation='sigmoid')(d)# define autoencoder modelmodel = Model(inputs=visible, outputs=output)# compile autoencoder modelopt = keras.optimizers.Adam(lr=0.00001)model.compile(optimizer=opt, loss='binary_crossentropy')# plot the autoencoderplot_model(model, 'drive/MyDrive/autoencoder_no_compress.png', show_shapes=True)# fit the autoencoder model to reconstruct inputhistory = model.fit(X_train_norm, X_train_norm, epochs=500, batch_size=64, verbose=2, validation_split=0.1)
如何使用网格搜索来调整我的模型?
基本的网格搜索看起来像这样-
from keras.wrappers.scikit_learn import KerasClassifierfrom sklearn.model_selection import GridSearchCVdef create_model(): <return a compiled but untrained keras model>model = KerasClassifier(build_fn = create_model, batch_size=1000, epochs=10)#now write out all the parameters you want to try out for the grid searchactivation = ['relu', 'tanh', 'sigmoid'...]learn_rate = [0.1, 0.2, ...]init = ['unform', 'normal', 'zero', ...]optimizer = ['SGD', 'Adam' ...]param_grid = dict(activation=activation, learn_rate=learn_rate, init=init, optimizer=optimizer)grid = GridSearchCV(estimator=model, param_grid=param_grid)result = grid.fit(X, y)
如何调整这个方法以适应我的模型用例?
回答:
这是一个调整自编码器的神经元和dropout的示例
定义模型结构:
def create_model(neurons, n_bottleneck, drop_rate): def create_blok(x, units, drop_rate=0.05): x = Dense(units)(x) x = Dropout(drop_rate)(x) x = Activation("relu")(x) return x visible = Input(shape=(n_inputs,)) e = create_blok(visible, int(neurons), drop_rate) e = create_blok(e, int(neurons*3/4), drop_rate) e = create_blok(e, int(neurons*2/4), drop_rate) e = create_blok(e, int(neurons*1/4), drop_rate) e = create_blok(e, int(neurons*1/(4*2)), drop_rate) bottleneck = Dense(n_bottleneck)(e) d = create_blok(bottleneck, int(neurons*1/(4*2)), drop_rate) d = create_blok(d, int(neurons*1/4), drop_rate) d = create_blok(d, int(neurons*2/4), drop_rate) d = create_blok(d, int(neurons*3/4), drop_rate) d = create_blok(d, int(neurons), drop_rate) output = Dense(n_inputs, activation='sigmoid')(d) model = Model(inputs=visible, outputs=output) model.compile(optimizer='Adam', loss='binary_crossentropy') return model
定义参数:
n_bottleneck = [32, 64, 128]neurons = [400, 600]drop_rate = [0.05, 0.2]param_grid = dict(neurons=neurons, n_bottleneck=n_bottleneck, drop_rate=drop_rate)param_grid
调整参数:
model = KerasRegressor(build_fn = create_model, batch_size=128, epochs=10, verbose=0)grid = GridSearchCV(estimator=model, param_grid=param_grid)result = grid.fit(X, X)
这里是正在运行的笔记本