【问题标题】:How do i interpret the weights, in this branched tf model?在这个分支的 tf 模型中,我如何解释权重?
【发布时间】:2022-01-25 10:34:44
【问题描述】:

我没有找到一个合适的问题来回答这个场景,如果已经在其他地方回答了,请随时指出我的问题。

问题

我有一个 tensorflow 模型(在问题的最后,我有一个最小的可重现代码,任何人都可以对其进行测试。 ) 有这些规格

  1. 输入形状:[(None, 3, 47, 12)],在本题的范围内可以忽略输出形状..
  2. 在模型构建的某个地方,我分支了,只从轴 1 中选择一个通道,因此分支将接收 一个 通道的输入。
  3. 我不使用顺序 api。
  4. 我打印出重量和偏差形状,以供确认。

我无法理解为什么新分支中卷积层的权重矩阵仍然具有 ((3, .. .. )) 的形状。

示例:

我的模特:

# Declaring a couple of layers
Conv_1 = tf.keras.layers.Conv1D(
                                75,
                                activation='swish',
                                kernel_size=3,
                                strides=2,
                                padding='valid',
                                name='Conv_1',
                                # data_format = 'channels_first',
                                )(inputs)
Av_P_1 = tf.keras.layers.AveragePooling2D(
                                          pool_size=(1,3),
                                          strides=(1,2),
                                          padding='valid',
                                          data_format='channels_first',
                                          name='Av_P_1'
                                         )(Conv_1)
Layer_N_1 = tf.keras.layers.LayerNormalization(
                                               name='Layer_N_1'
                                              )(Av_P_1)



Dense_1 = tf.keras.layers.Dense(
                                70,
                                activation='swish',
                                name='Dense_1'
                                )(Layer_N_1)
Layer_N_2 = tf.keras.layers.LayerNormalization(
                                               name='Layer_N_2'
                                              )(Dense_1)

# Ustacking here
s,t,r = tf.unstack(
                   Layer_N_2,
                   axis=1
                   )

# Branching here
Conv_2 = tf.keras.layers.Conv1D(50,
                                activation='swish',
                                kernel_size=3,
                                strides=2,
                                padding='valid',
                                name='Conv_2',
                                )(tf.concat([s], axis = 1)) #  <-------- Branching here
Av_P_2 = tf.keras.layers.AveragePooling1D(
                                          pool_size=3,
                                          strides=1,
                                          padding='valid',
                                          name = 'Av_P_2'
                                          )(Conv_2)
Layer_N_3 = tf.keras.layers.LayerNormalization(
                                            name='Layer_N_3'
                                            )(Av_P_2)

LSTM_1 = tf.keras.layers.LSTM(35,
                              return_sequences=True,
                              name='LSTM_1'
                              )(Layer_N_3)

test_model = tf.keras.Model(inputs=inputs, outputs=[LSTM_1])
print(test_model.summary())
Model: "model_11"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
Input (InputLayer)           [(None, 3, 47, 12)]       0         
_________________________________________________________________
Conv_1 (Conv1D)              (None, 3, 23, 75)         2775      
_________________________________________________________________
Av_P_1 (AveragePooling2D)    (None, 3, 23, 37)         0         
_________________________________________________________________
Layer_N_1 (LayerNormalizatio (None, 3, 23, 37)         74        
_________________________________________________________________
Dense_1 (Dense)              (None, 3, 23, 70)         2660      
_________________________________________________________________
Layer_N_2 (LayerNormalizatio (None, 3, 23, 70)         140       
_________________________________________________________________
tf.unstack_19 (TFOpLambda)   [(None, 23, 70), (None, 2 0         
_________________________________________________________________
tf.identity_4 (TFOpLambda)   (None, 23, 70)            0         
_________________________________________________________________
Conv_2 (Conv1D)              (None, 11, 50)            10550     
_________________________________________________________________
Av_P_2 (AveragePooling1D)    (None, 9, 50)             0         
_________________________________________________________________
Layer_N_3 (LayerNormalizatio (None, 9, 50)             100       
_________________________________________________________________
LSTM_1 (LSTM)                (None, 9, 35)             12040     
=================================================================
Total params: 28,339
Trainable params: 28,339
Non-trainable params: 0
_________________________________________________________________

unstack后每个元素(s,t,r)的形状:

(TensorShape([None, 23, 70]),
 TensorShape([None, 23, 70]),
 TensorShape([None, 23, 70]))

权重和偏差的形状仅适用于 conv 层:


###### Name: ######
Layer Name: Conv_1
  Weights:
  Conv_1/kernel:0
  (3, 12, 75)

  Biases:
  Conv_1/bias:0
  (75,)

###### Name: ######
Layer Name: Conv_2
  Weights:
  Conv_2/kernel:0
  (3, 70, 50)  < ---- why does the weight matrix still have 3 channels

  Biases:
  Conv_2/bias:0
  (50,)

我的解释

  1. 没有办法像我希望的那样“断开”层输出,因为图形以某种方式断开(不知道 tf 如何评估模型连接性).. 因此权重已初始化但后续更新为 0。这可能不会之所以如此,是因为 tensorflow 将它们列为可训练变量,这意味着它们将被优化。
  2. 我做错了..我研究了 tensorflows 预处理层,使用了 lambda 函数并尝试了 unstack vs split..

请随时提出任何进一步的问题,因为我知道我可能对每个人都不够清楚。

附:我知道如何使用 channels_first 和 channels_last。

【问题讨论】:

  • 一维卷积的内核(或权重)将始终具有 3 个维度:(在 TF 的情况下为[filter_width, in_channels, out_channels],而 pytorch 使用[in_channels, out_channels, filter_width])。您可能想回到卷积的定义。
  • 是的,对事物的理解不同。时间。

标签: python tensorflow keras


【解决方案1】:

所以在这个answer之后,权重矩阵中的(3, .., ..) 并不对应于通道数,而是对应于过滤器大小。在上面的例子中,上面的 conv1D 层中使用的过滤器大小是 3,如果过滤器大小更改为 5,例如权重矩阵将如下所示..

###### Name: ######
Layer Name: Conv_1

  Weights:
  Conv_1/kernel:0
  (5, 12, 75)

  Biases:
  Conv_1/bias:0
  (75,)

###### Name: ######
Layer Name: Conv_2

  Weights:
  Conv_2/kernel:0
  (5, 70, 50)

  Biases:
  Conv_2/bias:0
  (50,)
  • 另请注意,权重矩阵与层输出不同,表示如下(Kernel_size,Features(前一层中的单元数),Conv_units(Conv 数)当前层中的单元))。
  • 然而,输出取决于输入形状。默认情况下,轴 1 上的通道保留为扩展批量维度,从 this 读取示例 2。

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2014-04-22
    • 2019-11-19
    • 2021-11-08
    • 2022-11-30
    • 2019-08-13
    相关资源
    最近更新 更多