【发布时间】:2022-01-25 10:34:44
【问题描述】:
我没有找到一个合适的问题来回答这个场景,如果已经在其他地方回答了,请随时指出我的问题。
问题
我有一个 tensorflow 模型(在问题的最后,我有一个最小的可重现代码,任何人都可以对其进行测试。 ) 有这些规格
- 输入形状:[(None, 3, 47, 12)],在本题的范围内可以忽略输出形状..
- 在模型构建的某个地方,我分支了,只从轴 1 中选择一个通道,因此分支将接收 一个 通道的输入。
- 我不使用顺序 api。
- 我打印出重量和偏差形状,以供确认。
我无法理解为什么新分支中卷积层的权重矩阵仍然具有 ((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,)
我的解释
- 没有办法像我希望的那样“断开”层输出,因为图形以某种方式断开(不知道 tf 如何评估模型连接性).. 因此权重已初始化但后续更新为 0。这可能不会之所以如此,是因为 tensorflow 将它们列为可训练变量,这意味着它们将被优化。
- 我做错了..我研究了 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