tensorflow 中嵌入层的输出是什么,GlobalAveragePooling1D 做了什么?
What's the output of an Embedding layer in tensorflow and what does GlobalAveragePooling1D do it?
我无法理解一维全局平均池对嵌入层的作用。我知道嵌入层就像查找表。如果我有tf.keras.layers.Embedding(vocab_size=30, embedding_dim=7, input_length=10)
,前馈后的输出是10 rows x 7 columns
的矩阵还是1 row x 7 columns x 10 length
的3D张量?
如果是10 rows x 7 columns
,它是否取每一行的平均值并输出形状为10 row x 1 columns
的单个向量?
如果是1 row x 7 columns x 10 length
,它是否取每个向量的平均值并输出一个形状也是10 row x 1 columns
的向量?
GlobalAveragePooling1D
通过对某些维度的值取平均值来减少矩阵的维度。
来自 keras documentation 这一层有一个 data_format
参数。默认情况下它是 "channels_last"
意味着它将保留最后一个通道,并取另一个通道的平均值。
这是一个示例模型:
model = Sequential([
Input((10)),
Embedding(30, 7, input_length=10),
GlobalAveragePooling1D()
])
model.summary()
输出:
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 10, 7) 210
global_average_pooling1d (G (None, 7) 0
lobalAveragePooling1D)
=================================================================
Total params: 210
Trainable params: 210
Non-trainable params: 0
_________________________________________________________________
如您所见,样本的维数从 (10, 7) 减少到 (7),这意味着 它 returns 给定嵌入的平均值 .
如果你设置data_format = "channels_first"
,像这里
model = Sequential([
Input((10)),
Embedding(30, 7, input_length=10),
GlobalAveragePooling1D(data_format = "channels_first")
])
model.summary()
输出:
Model: "sequential_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 10, 7) 210
global_average_pooling1d (G (None, 10) 0
lobalAveragePooling1D)
=================================================================
Total params: 210
Trainable params: 210
Non-trainable params: 0
_________________________________________________________________
这里样本的维数从 (10, 7) 减少到 (10),这意味着 它 returns 每个给定嵌入的平均值 。什么样的没有意义,因为您可以将 embedding_dim
设置为 1 并获得相同的结果。
第一个问题:
tensorflow 中嵌入层的输出是什么?
Embedding
层将表示词汇表中唯一单词的序列中的每个整数值映射到 7 维向量。在以下示例中,您有两个序列,每个序列具有 10 个整数值。这些整数值的范围可以从 0 到 29,其中 30 是词汇表的大小。每个序列的每个整数值都映射到一个 7 维向量,得到输出形状 (2, 10, 7)
,其中 2 是样本数,10 是序列长度,7 是每个整数值的维度:
import tensorflow as tf
samples = 2
texts = tf.random.uniform((samples, 10), maxval=30, dtype=tf.int32)
embedding_layer = tf.keras.layers.Embedding(30, 7, input_length=10)
print(embedding_layer(texts))
tf.Tensor(
[[[ 0.0225671 0.02347589 0.00979777 0.00041901 -0.00628462
0.02810872 -0.00962182]
[-0.00848696 -0.04342243 -0.02836052 -0.00517335 -0.0061365
-0.03012114 0.01677728]
[ 0.03311044 0.00556745 -0.00702027 0.03381392 -0.04623893
0.04987461 -0.04816799]
[-0.03521906 0.0379228 0.03005264 -0.0020758 -0.0384485
0.04822161 -0.02092661]
[-0.03521906 0.0379228 0.03005264 -0.0020758 -0.0384485
0.04822161 -0.02092661]
[-0.01790254 -0.0175228 -0.01194855 -0.02171307 -0.0059397
0.02812174 0.01709754]
[ 0.03117083 0.03501941 0.01058724 0.0452967 -0.03717183
-0.04691924 0.04459465]
[-0.0225444 0.01631368 -0.04825303 0.02976335 0.03874404
0.01886607 -0.04535152]
[-0.01405543 -0.01035894 -0.01828993 0.01214089 -0.0163126
0.00249451 -0.03320551]
[-0.00536104 0.04976835 0.03676006 -0.04985759 -0.04882429
0.04079831 -0.04694915]]
[[ 0.02474061 0.04651412 0.01263839 0.02834389 0.01770737
0.027616 0.0391163 ]
[-0.00848696 -0.04342243 -0.02836052 -0.00517335 -0.0061365
-0.03012114 0.01677728]
[-0.02423838 0.00046005 0.01264722 -0.00118362 -0.04956226
-0.00222496 0.00678415]
[ 0.02132202 0.02490019 0.015528 0.01769954 0.03830704
-0.03469712 -0.00817447]
[-0.03713315 -0.01064591 0.0106518 -0.00899752 -0.04772154
0.03767705 -0.02580358]
[ 0.02132202 0.02490019 0.015528 0.01769954 0.03830704
-0.03469712 -0.00817447]
[ 0.00416059 -0.03158562 0.00862025 -0.03387908 0.02394537
-0.00088609 0.01963869]
[-0.0454465 0.03087567 -0.01201812 -0.02580545 0.02585572
-0.00974055 -0.02253721]
[-0.00438716 0.03688161 0.04575384 -0.01561296 -0.0137012
-0.00927494 -0.02183568]
[ 0.0225671 0.02347589 0.00979777 0.00041901 -0.00628462
0.02810872 -0.00962182]]], shape=(2, 10, 7), dtype=float32)
处理文本数据时,Embedding
层的输出将是 2 个句子,每个句子包含 10 个单词,其中每个单词都映射到一个 7 维向量。
如果您想知道每个序列中每个整数的这些随机数来自何处,默认情况下 Embedding
层使用均匀分布来生成这些值。
第二个问题:
一维全局平均池对嵌入层有什么作用?
层 GlobalAveragePooling1D
只是简单地计算张量中给定维度的平均值。下面的示例计算代表每个序列中一个单词的 7 个数字的平均值和每个单词的标量 returns,得到输出形状 (2, 10)
,其中 2 是样本(句子)的数量, 10代表每个词的平均值。这相当于简单地做 tf.reduce_mean(embedding_layer(texts), axis=-1)
.
import tensorflow as tf
samples = 2
texts = tf.random.uniform((samples, 10), maxval=30, dtype=tf.int32)
embedding_layer = tf.keras.layers.Embedding(30, 7, input_length=10)
average_layer = tf.keras.layers.GlobalAveragePooling1D(data_format = "channels_first")
print(average_layer(embedding_layer(texts)))
我无法理解一维全局平均池对嵌入层的作用。我知道嵌入层就像查找表。如果我有tf.keras.layers.Embedding(vocab_size=30, embedding_dim=7, input_length=10)
,前馈后的输出是10 rows x 7 columns
的矩阵还是1 row x 7 columns x 10 length
的3D张量?
如果是10 rows x 7 columns
,它是否取每一行的平均值并输出形状为10 row x 1 columns
的单个向量?
如果是1 row x 7 columns x 10 length
,它是否取每个向量的平均值并输出一个形状也是10 row x 1 columns
的向量?
GlobalAveragePooling1D
通过对某些维度的值取平均值来减少矩阵的维度。
来自 keras documentation 这一层有一个 data_format
参数。默认情况下它是 "channels_last"
意味着它将保留最后一个通道,并取另一个通道的平均值。
这是一个示例模型:
model = Sequential([
Input((10)),
Embedding(30, 7, input_length=10),
GlobalAveragePooling1D()
])
model.summary()
输出:
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 10, 7) 210
global_average_pooling1d (G (None, 7) 0
lobalAveragePooling1D)
=================================================================
Total params: 210
Trainable params: 210
Non-trainable params: 0
_________________________________________________________________
如您所见,样本的维数从 (10, 7) 减少到 (7),这意味着 它 returns 给定嵌入的平均值 .
如果你设置data_format = "channels_first"
,像这里
model = Sequential([
Input((10)),
Embedding(30, 7, input_length=10),
GlobalAveragePooling1D(data_format = "channels_first")
])
model.summary()
输出:
Model: "sequential_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 10, 7) 210
global_average_pooling1d (G (None, 10) 0
lobalAveragePooling1D)
=================================================================
Total params: 210
Trainable params: 210
Non-trainable params: 0
_________________________________________________________________
这里样本的维数从 (10, 7) 减少到 (10),这意味着 它 returns 每个给定嵌入的平均值 。什么样的没有意义,因为您可以将 embedding_dim
设置为 1 并获得相同的结果。
第一个问题: tensorflow 中嵌入层的输出是什么?
Embedding
层将表示词汇表中唯一单词的序列中的每个整数值映射到 7 维向量。在以下示例中,您有两个序列,每个序列具有 10 个整数值。这些整数值的范围可以从 0 到 29,其中 30 是词汇表的大小。每个序列的每个整数值都映射到一个 7 维向量,得到输出形状 (2, 10, 7)
,其中 2 是样本数,10 是序列长度,7 是每个整数值的维度:
import tensorflow as tf
samples = 2
texts = tf.random.uniform((samples, 10), maxval=30, dtype=tf.int32)
embedding_layer = tf.keras.layers.Embedding(30, 7, input_length=10)
print(embedding_layer(texts))
tf.Tensor(
[[[ 0.0225671 0.02347589 0.00979777 0.00041901 -0.00628462
0.02810872 -0.00962182]
[-0.00848696 -0.04342243 -0.02836052 -0.00517335 -0.0061365
-0.03012114 0.01677728]
[ 0.03311044 0.00556745 -0.00702027 0.03381392 -0.04623893
0.04987461 -0.04816799]
[-0.03521906 0.0379228 0.03005264 -0.0020758 -0.0384485
0.04822161 -0.02092661]
[-0.03521906 0.0379228 0.03005264 -0.0020758 -0.0384485
0.04822161 -0.02092661]
[-0.01790254 -0.0175228 -0.01194855 -0.02171307 -0.0059397
0.02812174 0.01709754]
[ 0.03117083 0.03501941 0.01058724 0.0452967 -0.03717183
-0.04691924 0.04459465]
[-0.0225444 0.01631368 -0.04825303 0.02976335 0.03874404
0.01886607 -0.04535152]
[-0.01405543 -0.01035894 -0.01828993 0.01214089 -0.0163126
0.00249451 -0.03320551]
[-0.00536104 0.04976835 0.03676006 -0.04985759 -0.04882429
0.04079831 -0.04694915]]
[[ 0.02474061 0.04651412 0.01263839 0.02834389 0.01770737
0.027616 0.0391163 ]
[-0.00848696 -0.04342243 -0.02836052 -0.00517335 -0.0061365
-0.03012114 0.01677728]
[-0.02423838 0.00046005 0.01264722 -0.00118362 -0.04956226
-0.00222496 0.00678415]
[ 0.02132202 0.02490019 0.015528 0.01769954 0.03830704
-0.03469712 -0.00817447]
[-0.03713315 -0.01064591 0.0106518 -0.00899752 -0.04772154
0.03767705 -0.02580358]
[ 0.02132202 0.02490019 0.015528 0.01769954 0.03830704
-0.03469712 -0.00817447]
[ 0.00416059 -0.03158562 0.00862025 -0.03387908 0.02394537
-0.00088609 0.01963869]
[-0.0454465 0.03087567 -0.01201812 -0.02580545 0.02585572
-0.00974055 -0.02253721]
[-0.00438716 0.03688161 0.04575384 -0.01561296 -0.0137012
-0.00927494 -0.02183568]
[ 0.0225671 0.02347589 0.00979777 0.00041901 -0.00628462
0.02810872 -0.00962182]]], shape=(2, 10, 7), dtype=float32)
处理文本数据时,Embedding
层的输出将是 2 个句子,每个句子包含 10 个单词,其中每个单词都映射到一个 7 维向量。
如果您想知道每个序列中每个整数的这些随机数来自何处,默认情况下 Embedding
层使用均匀分布来生成这些值。
第二个问题: 一维全局平均池对嵌入层有什么作用?
层 GlobalAveragePooling1D
只是简单地计算张量中给定维度的平均值。下面的示例计算代表每个序列中一个单词的 7 个数字的平均值和每个单词的标量 returns,得到输出形状 (2, 10)
,其中 2 是样本(句子)的数量, 10代表每个词的平均值。这相当于简单地做 tf.reduce_mean(embedding_layer(texts), axis=-1)
.
import tensorflow as tf
samples = 2
texts = tf.random.uniform((samples, 10), maxval=30, dtype=tf.int32)
embedding_layer = tf.keras.layers.Embedding(30, 7, input_length=10)
average_layer = tf.keras.layers.GlobalAveragePooling1D(data_format = "channels_first")
print(average_layer(embedding_layer(texts)))