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

在Keras中,我在哪里调用BatchNormalization函数?

邹弘
2023-03-14

如果我想在Keras中使用BatchNormize函数,那么我需要在开始时只调用一次吗?

我阅读了以下文档:http://keras.io/layers/normalization/

我不知道应该在哪里调用它。下面是我试图使用它的代码:

model = Sequential()
keras.layers.normalization.BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None)
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(2, init='uniform'))
model.add(Activation('softmax'))

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)

我这样问是因为如果我用第二行运行代码,包括批处理规范化,如果我不使用第二行运行代码,我会得到类似的输出。因此,要么我没有在正确的位置调用函数,要么我想这没有多大区别。

共有3个答案

赖运珧
2023-03-14

关于BN是应该在当前层的非线性之前应用,还是应该在前一层的激活之前应用,该线程有一些相当大的争议。

虽然没有正确的答案,但批量标准化的作者表示,它应该在当前层非线性之前立即应用。原因(引自原文)-

“我们在非线性之前添加BN变换,通过归一化x=Wu b。我们还可以归一化层输入u,但由于u可能是另一个非线性的输出,其分布的形状可能会在训练期间发生变化,限制其第一和第二阶矩不会消除协变量偏移。相反,Wu b更可能具有对称性tric,非稀疏分布,即“更高斯”(Hyv¨arinen

贺浩漫
2023-03-14

这条线索有误导性。我试着对卢卡斯·拉马丹的回答发表评论,但我还没有合适的特权,所以我就把这个放在这里。

批次标准化在激活函数之后效果最好,原因如下:它是为了防止内部协变量转移而开发的。当一层的激活分布在整个训练过程中发生显著变化时,就会发生内部协变量变化。使用批次标准化,以便输入(这些输入实际上是激活函数的结果)到特定层的分布不会因每个批次的参数更新而随时间变化(或至少允许以有利的方式变化)。它使用批次统计信息进行规格化,然后使用批次规格化参数(原稿中的gamma和beta)“确保插入网络的转换可以表示身份转换”(引用原稿)。但关键是,我们正在尝试将输入规范化到一个层,因此它应该始终位于网络中的下一层之前。这是否在激活功能之后取决于所讨论的体系结构。

焦宏硕
2023-03-14

只是为了更详细地回答这个问题,正如Pavel所说,批量规范化只是另一层,因此您可以使用它来创建所需的网络架构。

一般用例是在网络中的线性和非线性层之间使用BN,因为它标准化了激活函数的输入,因此您位于激活函数的线性部分(例如Sigmoid)的中心。这里有一个小讨论

在上述情况下,这可能如下所示:

# import BatchNormalization
from keras.layers.normalization import BatchNormalization

# instantiate model
model = Sequential()

# we can think of this chunk as the input layer
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.5))

# we can think of this chunk as the hidden layer    
model.add(Dense(64, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.5))

# we can think of this chunk as the output layer
model.add(Dense(2, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('softmax'))

# setting up the optimization of our weights 
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)

# running the fitting
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)

希望这能进一步澄清问题。

 类似资料:
  • 问题内容: 如果要在Keras中使用BatchNormalization函数,是否仅需要在开始时调用一次? 我为此阅读了此文档:http : //keras.io/layers/normalization/ 我看不到该怎么称呼它。下面是我尝试使用它的代码: 我问是因为如果我用第二行(包括批处理规范化)运行代码,而如果我不使用第二行运行代码,则会得到类似的输出。因此,要么我没有在正确的地方调用该函数

  • 问题内容: 我正在尝试使用Express和ejs渲染模板的模板。至于节点应用程序的标准结构,我有一个app.js文件,其中包含如下功能: 我有some_template.ejs文件,该文件如下所示调用此函数: 而且效果很好。但是,我大约有15-20个这样的函数,并且我不想在app.js中定义所有这些函数。还有其他地方可以定义这些函数并以与我现在相同的方式在模板中调用它们吗?如果是,那么定义它们的方

  • 问题内容: 是将数字转换为字符串的便捷工具。Linux似乎没有,是否有等效的功能或者我必须使用? 问题答案: 编辑:对不起,我应该记得这台机器绝对是非标准的,出于学术目的已插入了各种非标准的实现;-) 由于确实不规范,如一些有用的评论者提到的,最好使用或(更好的,因为它是从安全缓冲区溢出)。我知道它不像它那么简洁或酷,但是至少您可以编写一次,到处运行(tm);-) 这是旧的(编辑过的)答案 您正确

  • 我试图掌握神经网络的基础知识,并努力理解keras层。 从tensorflow的教程中获取以下代码: 所以这个网络有3层?第一个只是代表像素值的28*28个节点。第二个是隐藏层,它从第一个节点中获取加权和,应用relu,然后将这些发送到10个输出层,这些输出层被软最大化? 但该模型似乎需要不同的层输入: 为什么输入层现在既有一个input\u形状,又有一个值64?我了解到第一个参数指定了第二层中的

  • 问题内容: 我正在开发jsf应用程序,并使用hibernate模式作为后端。我想创建会话工厂,并在整个应用程序中关闭它。我正在使用util类创建Session工厂。 在我的DAO类的每种方法中,我都会打开会话工厂并关闭它。因此,在我只能打开/关闭会话工厂一次的应用程序中。提前致谢。 问题答案: 在我的应用程序中在哪里打开和在哪里关闭SessionFactory 您正在使用单例会话工厂对象。因此,您

  • 问题内容: IOS编程的新手,只是想知道在哪里放置可以在我的代码中使用的函数的最佳位置。例如,我想编写一些函数来执行对Web服务的POST请求并返回字典。也许是另一个函数来做一些计算。最好创建另一个.swift文件并将所有功能放在那里。如果可以的话,给该文件一个好名字是什么? 问题答案: 最好的方法是使用静态函数创建一个帮助器类,如下所示: 现在,每次需要使用时,您都可以像这样使用: 希望对您有所