当前位置: 首页 > 知识库问答 >
问题:

使用Keras函数API调整神经网络超参数

陆洛城
2023-03-14

我有一个包含两个分支的神经网络。一个分支接受卷积神经网络的输入。另一个分支是一个完全连接的层。我合并这两个分支,然后使用softmax获得输出。我不能使用顺序模型,因为它已被弃用,因此必须使用函数式API。我想调整卷积神经网络分支的超参数。例如,我想弄清楚我应该使用多少卷积层。如果是顺序模型,我会使用for循环,但由于我使用的是函数式API,我真的不能这样做。我已经附加了我的代码。有人能告诉我如何以智能的方式优化我的神经网络的卷积数,而不是使用不同数量的卷积层制作许多不同的脚本。

如有建议,将不胜感激。


i1 = Input(shape=(xtest.shape[1], xtest.shape[2]))

###Convolution branch
c1 = Conv1D(128*2, kernel_size=ksize,activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(i1)
c1 = Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(c1)
c1 = AveragePooling1D(pool_size=ksize)(c1)
c1 = Dropout(0.2)(c1)

c1 = Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(c1)
c1 = AveragePooling1D(pool_size=ksize)(c1)
c1 = Dropout(0.2)(c1)

c1 = Flatten()(c1)

###fully connected branch
i2 = Input(shape=(5000, ))
c2 = Dense(64,  activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda))(i2)
c2 = Dropout(0.1)(c2)


###concatenating the two branches
c = concatenate([c1, c2])

x = Dense(256, activation='relu', kernel_initializer='normal',kernel_regularizer=keras.regularizers.l2(l2_lambda))(c)
x = Dropout(0.25)(x)

###Output branch 
output = Dense(num_classes, activation='softmax')(x)

model = Model([i1, i2], [output])

model.summary()

对于顺序模型,我可以使用for循环,例如:


layers = [1,2,3,4,5]

b1 = Sequential()
b1.add(Conv1D(128*2, kernel_size=ksize,
                 activation='relu',
                 input_shape=( xtest.shape[1], xtest.shape[2]),
                 kernel_regularizer=keras.regularizers.l2(l2_lambda)))

for layer in layers:
    count = layer
    while count > 0:
        b1.add(Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda)))
        count -= 1

b1.add(MaxPooling1D(pool_size=ksize))
b1.add(Dropout(0.2))

b1.add(Flatten())
b2 = Sequential()

b2.add(Dense(64, input_shape = (5000,), activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda)))

for layer in layers:
    count = layer
    while count > 0:
    b2.add(Dense(64,, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda)))


model = Sequential()
model.add(Merge([b1, b2], mode = 'concat'))
model.add(Dense(256, activation='relu', kernel_initializer='normal',kernel_regularizer=keras.regularizers.l2(l2_lambda)))
model.add(Dropout(0.25))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
                  optimizer=keras.optimizers.Adam(),
                  metrics=['accuracy'])


共有2个答案

丁俊智
2023-03-14

您也可以使用函数式API动态设置模型结构。对于卷积分支,您可以使用以下内容:

layer_shapes = (64, 64, 32)

for _ in layers:
    b1 = Conv1D(128*2, kernel_size=ksize, activation='relu', kernel_regularizer=keras.regularizers.l2(l2_lambda))(b1)

您只需替换顺序。通过相应的变量赋值添加。

戴博
2023-03-14

这是使用Keras FunctionalAPI的具有可变层数的模型的最小示例:

from keras.layers import Input, Conv2D, Dense, Dropout, Flatten, MaxPool2D
from keras.models import Model

def build_model(num_layers, input_shape, num_classes): 
  input = Input(shape=input_shape)
  x = Conv2D(32, (3, 3), activation='relu')(input)

  # Suppose you want to find out how many additional convolutional 
  # layers to add here.
  for _ in num_layers:
    x = Conv2D(32, (3, 3), activation='relu')(x)

  x = MaxPool2D((2, 2))(x)
  x = Flatten()(x)
  x = Dense(64, activation='relu')(x)
  x = Dropout(0.5)(x)
  x = Dense(num_classes, activation='softmax')(x)

  return Model(inputs=input, outputs=x)

model = build_model(num_layers=2, input_shape=(128, 128), num_classes=3)

以下是我将遵循的步骤,以找出要使用多少“中间”卷积层:

  1. 训练多个模型,并将参数设置为各种值。构建所有这些模型的代码完全相同,只有num\u layers的值在不同的训练运行中发生变化
  2. 选择一个具有您所关心的最佳度量值的度量

那就是了!

旁注:据我所知,Keras Sequential模型并没有遭到反对。

 类似资料:
  • 而且,它会在我的本地驱动器上加载一个10GB大小的文件。也就是说,它不仅保存了试验对象,而且保存了整个模型。您能否帮助我保存较小大小的试验对象(例如,XGBoost试验文件的大小为1MB),并避免错误。 谢谢你。

  • 我正在玩Keras代码。当我这样写代码时, 它工作起来没有任何问题。但如果通过将前一层作为参数传递给下一层来实现这一点,那么我就会得到错误。 下面是错误 我怎样才能解决这个问题?

  • 鸟类启发人类飞翔,东洋参启发了魔术贴的发明,大自然启发人类实现了无数发明创造。通过研究大脑来制造智能机器,也符合这个逻辑。人工神经网络(ANN)就是沿着这条逻辑诞生的:人工神经网络是受大脑中的生物神经元启发而来的机器学习模型。但是,虽然飞机是受鸟儿启发而来的,飞机却不用挥动翅膀。相似的,人工神经网络和生物神经元网络也是具有不同点的。一些研究者甚至认为,应该彻底摒弃这种生物学类比:例如,用“单元”取

  • 本文向大家介绍问题:神经网络激活函数?相关面试题,主要包含被问及问题:神经网络激活函数?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: sigmod、tanh、relu 解析:需要掌握函数图像,特点,互相比较,优缺点以及改进方法

  • 我正在学习神经网络,并在python中实现它。我首先定义了一个 softmax 函数,我遵循这个问题给出的解决方案 Softmax 函数 - python。以下是我的代码: 我得到了一个测试代码,看看函数是否正确。是测试数据,

  • 神经网络 (Neural Network) 是机器学习的一个分支,全称人工神经网络(Artificial Neural Network,缩写 ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。 Perceptron (感知器) 一个典型的神经网络由输入层、一个或多个隐藏层以及输出层组成,其中箭头代表着数据流动的方向,而圆圈代表激活函数(最常用的激活函数为