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

Keras:批量归一化(轴=1)的秩为0

公良渝
2023-03-14

我试图在Keras中创建一个带有输入(批次、通道(3)、64、32)的神经网络,但我使用批次标准化时出现了错误(因为错误从提到的层开始,我选择隔离导致错误的部分)。模型开始如下:

input_imgC = Input(shape=(X.shape[1], X.shape[2], X.shape[3]))
x = Conv2D(32, (5, 5), activation='relu', padding='same', data_format="channels_first")(input_imgC) 
out = BatchNormalization(axis=1)(x)

我收到以下异常

对于输入形状为[1,32,1,1],“batch\u normalization\u 1/cond/Reformate\u 4”(操作:“Reformate”)的形状必须为秩1,但为秩0。

我认为数据从卷积层转换得很糟糕,这就是为什么我尝试了没有批量归一化的模型。模型:

input_imgC = Input(shape=(X.shape[1], X.shape[2], X.shape[3]))
out = Conv2D(32, (5, 5), activation='relu', padding='same', data_format="channels_first")(input_imgC) 

正确制作了以下摘要:

图层(类型)输出形状参数#
=================================================================

conv2d_1(Conv2D)(无,32, 64, 32) 2432
================================================================= 总计参数:2,432个可训练参数:2,432个不可训练参数:0

我知道我可以用

out=批次标准化(轴=-1)(x)

将模型输入为(批处理,64,32,通道(3)),它将工作(我已经尝试过了),但我需要在开始时配置通道,以便使用显示对象显著性的包测试模型。

有人知道在这里该做什么吗?

共有1个答案

金成济
2023-03-14

我不知道问题是什么,这似乎是一个Keras bug(更新版本或在GitHub上搜索问题可能会显示出这方面的提示)。

我的建议是,像往常一样,在开始时排列维度,并在最后使用所有内容作为通道。

最后,如果输出是图像,请将尺寸恢复到所需的顺序。

input_imgC = Input(shape=(X.shape[1], X.shape[2], X.shape[3]))
x = Lambda(lambda inputs: K.permute_dimensions(inputs,(0,2,3,1)))(input_imgC)

x = Conv2D(32, (5, 5), activation='relu', padding='same')(x) 
x = BatchNormalization()(x)

out = .......
out = Lambda(lambda inputs: K.permute_dimensions(inputs,(0,3,1,2)))(out)

提示:

理想情况下,我会在relu之前使用批处理规范化。这将relu变成一种安全的激活,很少被冻结,如果不小心使用,这是不正确的。

x = Conv2D(..., activation='linear')(x) #or no activation
x = BatchNormalization()(x)
x = Activation('relu')(x)

使用其他激活(如sigmoid和tanh)进行此操作有一些好处,因为批处理规范化可能有助于逃离饱和区域。

 类似资料:
  • keras批次标准化(BatchNormalization)层使用轴=-1作为默认值,并说明特征轴通常是标准化的。为什么会这样? 我想这是令人惊讶的,因为我更熟悉使用标准缩放器之类的东西,这相当于使用轴=0。这将分别规范化特征。 在KERA中,相对于特征,样本在默认情况下被单独归一化(即轴=-1)有什么原因吗? 编辑:混凝土示例 转换数据以使每个特征具有零均值和单位方差是很常见的。让我们考虑一下这

  • 本节我们介绍批量归一化(batch normalization)层,它能让较深的神经网络的训练变得更加容易 [1]。在 “实战Kaggle比赛:预测房价” 一节里,我们对输入数据做了标准化处理:处理后的任意一个特征在数据集中所有样本上的均值为0、标准差为1。标准化处理输入数据使各个特征的分布相近:这往往更容易训练出有效的模型。 通常来说,数据标准化预处理对于浅层模型就足够有效了。随着模型训练的进行

  • 我正在尝试实现批处理规范化(http://arxiv.org/pdf/1502.03167.pdf)在我的卷积神经网络中,我真的很困惑,我应该围绕什么轴来计算均值和方差。 如果conv层的输入为3*224*224*32的形状,其中: 3-输入通道 224*224-单通道形状 32-小批量大小 以下公式中的轴应该是多少?平均值=numpy。平均值(输入层,轴=?) 并且,如果完全连接层的输入为100

  • 我很难理解Tensorflow中批量规范化的实现。为了举例说明,我创建了一个简单的网络,其中包含一个输入节点、一个隐藏节点和一个输出节点,并使用1个批运行,批大小为2。我的输入x由一个标量组成,该标量有2个值(即批大小为2),一个值设置为0,另一个值设置为1。 我运行一个纪元,并写出隐藏层的输出(批处理规范化之前和之后)以及批处理范数移动均值、方差、γ和beta。 这是我的代码: 以下是我运行代码

  • 作为生成输出阵列模型/re_lu_1/Relu的Conv运算符的输入的层(...)缺乏量化所必需的最小/最大数据。如果准确性很重要,可以选择非量化输出格式,或者从浮点检查点使用模型运行量化训练,将输入图更改为包含最小/最大信息。如果您不关心准确性,您可以通过-default_ranges_min=和-default_ranges_max=进行简单的实验。