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

理解每层的Keras权重矩阵

洪飞驰
2023-03-14

我正在尝试使用Keras中的全连接层架构进行二分类,在Keras中称为密集类。

这是我创建的神经网络架构的设计

 from keras.models import Sequential
        from keras.layers import Dense, Dropout, Activation
        from keras.optimizers import SGD

        self.model = Sequential()
        # Dense(64) is a fully-connected layer with 64 hidden units.
        # in the first layer, you must specify the expected input data shape:
        # here, 20-dimensional vectors.
        self.model.add(Dense(32, activation='relu', input_dim=self.x_train_std.shape[1]))
        #self.model.add(Dropout(0.5))
        #self.model.add(Dense(64, activation='relu'))
        #self.model.add(Dropout(0.5))
        self.model.add(Dense(1, activation='sigmoid'))

因此,我有一个170002000的输入矩阵,其中17K个样本具有2k个特征。

我只保留了一个包含32个单位或神经元的隐藏层。

我的输出层是一个带有乙状结肠激活函数的单神经元。

现在,当我尝试检查第一个隐藏层的权重时,我希望它的大小是(2000,32),其中每行代表每个输入,每列代表该层中的每个单元。

这是Keras设置的架构配置

dl_1.model.get_config()
Out[70]:
[{'class_name': 'Dense',
  'config': {'activation': 'relu',
   'activity_regularizer': None,
   'batch_input_shape': (None, 2000),
   'bias_constraint': None,
   'bias_initializer': {'class_name': 'Zeros', 'config': {}},
   'bias_regularizer': None,
   'dtype': 'float32',
   'kernel_constraint': None,
   'kernel_initializer': {'class_name': 'VarianceScaling',
    'config': {'distribution': 'uniform',
     'mode': 'fan_avg',
     'scale': 1.0,
     'seed': None}},
   'kernel_regularizer': None,
   'name': 'dense_1',
   'trainable': True,
   'units': 32,
   'use_bias': True}},
 {'class_name': 'Dense',
  'config': {'activation': 'sigmoid',
   'activity_regularizer': None,
   'bias_constraint': None,
   'bias_initializer': {'class_name': 'Zeros', 'config': {}},
   'bias_regularizer': None,
   'kernel_constraint': None,
   'kernel_initializer': {'class_name': 'VarianceScaling',
    'config': {'distribution': 'uniform',
     'mode': 'fan_avg',
     'scale': 1.0,
     'seed': None}},
   'kernel_regularizer': None,
   'name': 'dense_2',
   'trainable': True,
   'units': 1,
   'use_bias': True}}]

要查看第一个隐藏层的尺寸,请执行以下操作:

dl_1.model.get_layer(name="dense_1").input_shape

(None, 2000)

输出大小:

    dl_1.model.get_layer(name="dense_1").output_shape
Out[99]:
(None, 32)

所以它似乎给出了(2000,32),这与预期相符。

但是,当我尝试检查该层的权重矩阵时

dl_1.model.get_layer(name="dense_1").get_weights()[0]

它为我提供了一个numpy数组列表,列表长度为2000,数组长度为32,如下所示:

array([[ 0.0484077 , -0.02401097, -0.03099879, -0.02864455, -0.01511723,
         0.01386002,  0.01127522,  0.00844895, -0.02420873,  0.04466306,
         0.02965425,  0.0410631 ,  0.02397312,  0.0038885 ,  0.04846045,
         0.00653989, -0.05288456, -0.00325713,  0.0445733 ,  0.04594839,
         0.02839083,  0.0445912 , -0.0140048 , -0.01198476,  0.05259909,
        -0.03752745, -0.01337494, -0.02162734, -0.01522341,  0.01208428,
         0.01122886,  0.01496441],
       [ 0.05225918,  0.04231448,  0.01388102, -0.03310467, -0.05293509,
         0.01130457,  0.03127011, -0.04250741, -0.04212657, -0.01595866,
        -0.002456  ,  0.01112743,  0.0150629 ,  0.03072598, -0.04061607,
        -0.01131565, -0.02259113,  0.00907649, -0.04728404, -0.00909081,
         0.03182121, -0.04608218, -0.04411709, -0.03561752,  0.04686243,
        -0.04555761,  0.04087613,  0.04380137,  0.02079088, -0.02390963,
        -0.0164928 , -0.01228274],

我不确定我是否理解这一点。它应该是32 X2000,而不是2000 X 32。所以我希望,因为我有32个单元,每个单元有2000个权重,所以列表将有32个元素长,每个元素应该是2000维numpy数组。但事实恰恰相反。我不知道这是为什么?

权重与隐藏层相关,而与输入层无关,所以如果我认为它们为输入层显示了权重,那就没有意义了。

知道这是怎么回事吗?

共有1个答案

宰父疏珂
2023-03-14

您正在创建一个包含32个单元的Dense()层。Dense层是(正如您在代码中的注释所指出的)“全连接层”,这意味着数据中的每个特征都连接到每个层。您的数据元素中还有2000个特征。

因此,您得到的阵列有2000个元素,每个元素对应一个特征,每个元素有32个权重,每个隐藏层对应一个元素,因此得到的形状。

从keras文档中我们可以看到示例:

model = Sequential()
model.add(Dense(32, input_shape=(16,)))
# now the model will take as input arrays of shape (*, 16)
# and output arrays of shape (*, 32)

# after the first layer, you don't need to specify
# the size of the input anymore:
model.add(Dense(32))

在您的情况下,*是2000,因此您的输出权重应该是您得到的形状。这似乎是Keras用于其输出的惯例。无论哪种方式,您都可以将数据转换为其他形状,因为数组的元素数与数组的元素数相同。

 类似资料:
  • 问题内容: 我想重置(随机化)我的Keras(深度学习)模型中所有层的权重。原因是我希望能够使用不同的数据拆分多次训练模型,而不必每次都进行(缓慢的)模型重新编译。 受此讨论的启发,我正在尝试以下代码: 但是,它仅部分起作用。 部分是因为我检查了一些layer.get_weights()值,但它们似乎有所变化。但是,当我重新开始训练时,成本值比第一次运行时的初始成本值低得多。几乎就像我已经成功重置

  • 我正在使用MNIST数据集,我正在使用keras来训练卷积神经网络。关于权重矩阵,有些东西我不明白。 输入层有28x28=784个神经元。然后我使用: 在我训练模型后,把W=模型。get\u weights(),I打印W[I]。每个i的形状并获得: 据我所知,这意味着对于第一个隐藏层有32个8x8=64的图像(因为(28-7)/3 1=8)因此第一个隐藏层中有64x32=2048个神经元。 下一部

  • 问题内容: 我正在使用Windows 10,Python 3.5和tensorflow 1.1.0。我有以下脚本: 我得到错误: 问题答案: 如果您写: 然后不是图层,而是图层的输出。该层是 所以看来您的意思是: 这是完整的代码段:

  • 我不明白为什么通道维度不包含在Keras中con2D层的输出维度中。 我有以下型号 我的问题末尾给出了模型摘要。输入层获取宽度为128、高度为128的RGB图像。第一个conv2D层告诉我输出维度是(None、61、61、24)。我使用的内核大小是(8,8),跨步是(2,2),没有填充。值61=下限((128-8 2 x 0)/2 1)和24(内核/过滤器的数量)是有意义的。但为什么维度中不包括不

  • 我有一个简单的顺序神经网络,我想用它来训练分类器。它由一个输入层、三个隐藏层和一个输出层组成,如下所示: 如何提取与每个隐藏层关联的权重。最终目标是使用激活函数计算每个标签成为正确标签的概率。 希望你能理解。感谢您的任何帮助。

  • 本文向大家介绍keras 权重保存和权重载入方式,包括了keras 权重保存和权重载入方式的使用技巧和注意事项,需要的朋友参考一下 如果需要全部权重载入,直接使用权重载入方式 model.save_weights('./weigths.h5') model2.load_weights('./weigths.h5') 但是有时候你只需要载入部分权重 所以你可以这样操作 首先,为所有层命名,在层中直接