层权重在 keras 中不匹配

数据挖掘 喀拉斯 张量流
2022-03-10 08:53:45

本题使用以下代码:

Xtrain = np.random.rand(400,1)
ytrain = f(Xtrain)
Xval = np.random.rand(200,1)
yval = f(Xval)

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(10, activation='relu'),
    #tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(1, activation='relu')
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.MeanSquaredError()
             )

model.fit(Xtrain, ytrain, epochs=500, verbose=0)

使用命令model.layers[0].get_weights()我得到以下输出:

[array([[-0.43412966, -0.51346564, -0.14263666,  0.8693182 , -0.4930619 ,
          1.249465  , -0.3924656 , -0.48984256, -0.55827504,  0.11134321]],
       dtype=float32),
 array([ 0.        ,  0.        ,  0.        ,  0.34663308,  0.        ,
         0.36201355,  0.        ,  0.        ,  0.        , -0.11139664],
       dtype=float32)]

并使用model.layers[1].get_weights()我得到这个:

[array([[-0.04339373],
        [ 0.19533908],
        [-0.2295354 ],
        [ 0.903574  ],
        [-0.17581558],
        [ 0.7272965 ],
        [-0.69347996],
        [ 0.02008992],
        [-0.30351916],
        [-0.29846227]], dtype=float32),
 array([0.29466572], dtype=float32)]

我不明白为什么第 0 层(列表中的第二个数组)的传出权重与第model.layers[0].get_weights()1 层(列表中的第一个数组)的传入权重不匹配model.layers[1].get_weights()为什么第 1 层有一个传出权重?这不应该是最后一层吗?

1个回答

参数数组的预期形状

每层有两个数组:

  • 一个用于权重,其形状为(num_inputs, num_outpus)
  • 一个用于偏置,其形状为(num_outputs)

这里是该num_inputs的输入特征的数量,是该输出数量(这是您在实例化层时选择的)。num_outputs

的输出.get_weights()

另一个需要注意的重要事项是.get_weights(). 实际上有多种使用方法:

  • 模型中,即model.get_weights():这将返回一个扁平列表,其中包含按顺序排列的所有参数数组。例如,它可能看起来像这样:[layer1_weights, layer1_biases, layer2_weights, layer2_biases, ...]

  • 一个层,即layer.get_weights():这是你使用的。在这里它将返回给定层的参数数组。例如model.layers[1].get_weights()将返回参数数组layer1如果layer1有偏差,那么这将返回两个数组,一个用于权重,一个用于偏差。


我冒昧地更改了您的代码以使其更加清晰。

import numpy as np
import tensorflow as tf

f = lambda x: 2*x

Xtrain = np.random.rand(400, 5)  # 5 input features
ytrain = f(Xtrain)
Xval = np.random.rand(200, 5)  # 5 input features
yval = f(Xval)

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(10, activation='relu'),  # this layer has 5 inputs and 10 outputs
    tf.keras.layers.Dense(1, activation='relu')  # this layer has 10 inputs and 1 output
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.MeanSquaredError()
             )

model.fit(Xtrain, ytrain, epochs=1, verbose=0)

# I will be calling .get_weights() directly from the model,
# so we expect 4 arrays: 2 for each layer.
 
print('First layer weights:', model.get_weights()[0].shape)
print('First layer biases:', model.get_weights()[1].shape)
print('Second layer weights:', model.get_weights()[2].shape)
print('Second layer biases:', model.get_weights()[3].shape)

输出:

First layer weights: (5, 10)  
First layer biases: (10,)  
Second layer weights: (10, 1)  
Second layer biases: (1,)