Keras:内置多层快捷方式

数据挖掘 机器学习 Python 喀拉斯
2022-02-25 12:13:51

问题

在 Keras for Python 中,我必须为简单的 XOR 神经网络使用多行代码:

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
import numpy as np 

X = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([[0],[1],[1],[0]])

model = Sequential()
model.add(Dense(8, input_dim=2))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('sigmoid'))

sgd = SGD(lr=0.1); model.compile(loss='binary_crossentropy', optimizer=sgd)

model.fit(X, y, show_accuracy=True, batch_size=1, nb_epoch=1000)
print(model.predict_proba(X))

尽管上面的网络很小,但当前的实现可能会因更深的网络而变得令人沮丧。

问题

Keras 中是否有内置快捷方式可以快速添加多个图层?例如:
[2,3,4,5]将是一个具有 2 个输入神经元、第一个隐藏层中的 3 个神经元、第二个隐藏层中的 4 个神经元和 5 个输出神经元的网络。我使用术语built-in因为否则我可以遍历示例数组,并为每个元素添加一个层。

1个回答

没有快捷语法可以接受[2,3,4,5]参数并创建模型。但是,您自己创建它作为 Python 函数将非常简单,前提是您已经做出了关于激活函数、层类型等的决定。需要做出这些决定并在Keras API 意味着 Keras 本身不提供如此简短的构建功能。

您可以通过在实例化模型时使用层列表来使模型构建稍微不那么冗长,而不是事后添加它们:

model = Sequential([
  Dense(8, input_dim=2),
  Activation('tanh'),
  Dense(1),
  Activation('sigmoid')
])

但是,如果您想尝试模型的变体,您唯一需要更改的是隐藏层的数量和大小,那么您可以编写一个简短的 Python 函数来封装该要求。这是一个示例(我相信您已经知道如何执行此操作,只是为了完整性而包含在内):

def build_model(hidden_layer_sizes):
  model = Sequential()

  model.add(Dense(hidden_layer_sizes[0], input_dim=2))
  model.add(Activation('tanh'))

  for layer_size in hidden_layer_sizes[1:]:
    model.add(Dense(layer_size))
    model.add(Activation('tanh'))

  model.add(Dense(1))
  model.add(Activation('sigmoid'))

  return model

如果您采用这种方法,您可能会发现您最终会参数化其他选择,例如输入大小(当您尝试一些特征工程时)、隐藏层激活函数、是否使用 Dropout 层等。同样,这需要定义所有导致 Keras 设计的典型网络中的其他选择。您可以做的最好的事情是使用自定义功能压缩您的案例的选择。

我想在你的问题中解决这个评论:

尽管上面的网络很小,但当前的实现可能会因更深的网络而变得令人沮丧。

在实践中,我没有发现 Keras 的设计难以用于深度网络。我通常编写一个单独的构建函数,并参数化一些东西,例如输入尺寸。但是,我通常不会将不同层大小的列表作为构建函数的主要参数进行循环。相反,我发现更详细的方法很好,即使在尝试网络大小/形状的变化时(我想如果我想网格搜索包括层大小,这可能会改变)。我认为这是因为我发现函数名称非常容易阅读 - 即使屏幕上充满了.add()函数,我也可以很快看到 NN 结构是什么。