首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在tensorflow中嵌入层的输出是什么,GlobalAveragePooling1D是做什么的?

在tensorflow中嵌入层的输出是什么,GlobalAveragePooling1D是做什么的?
EN

Stack Overflow用户
提问于 2022-01-03 03:18:44
回答 2查看 1K关注 0票数 2

我很难理解一维全局平均池对嵌入层的作用。我知道嵌入层就像查找表。如果我有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的三维张量?

如果是10 rows x 7 columns,它是否取每一行的平均值并输出形状10 row x 1 columns的单个向量?

如果是1 row x 7 columns x 10 length,它是否取每个向量的平均值并输出一个同样形状为10 row x 1 columns的向量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-03 11:55:38

对您的第一个问题:在tensorflow中嵌入层的输出是什么?

Embedding层将表示词汇表中唯一单词的序列中的每个整数值映射到一个7维向量。在下面的示例中,您有两个序列,每个序列有10个整数值。这些整数值可以从0到29不等,其中30是词汇表的大小。每个序列的每个整数值映射到一个7维向量,得到输出形状(2, 10, 7),其中2是样本数,10是序列长度,7是每个整数值的维数:

代码语言:javascript
运行
复制
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))
代码语言:javascript
运行
复制
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层的输出将是两个句子,每个句子由10个单词组成,每个单词被映射到一个7维向量。

如果您想知道每个序列中每个整数的这些随机数来自何处,默认情况下,Embedding层使用统一的分布来生成这些值。

对您的第二个问题:一维全局平均池对嵌入层做了什么?

GlobalAveragePooling1D所做的仅仅是在张量中计算给定维数上的平均值。下面的示例计算代表每个序列中的一个单词的7个数字的平均值,并为每个单词返回一个标量,从而得到输出形状(2, 10),其中2是样本(句子)的数目,10表示每个单词的平均值。这相当于简单地执行tf.reduce_mean(embedding_layer(texts), axis=-1)

代码语言:javascript
运行
复制
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)))
票数 3
EN

Stack Overflow用户

发布于 2022-01-03 08:25:57

GlobalAveragePooling1D通过取某个维数的平均值来降低矩阵的维数。

keras文件中,该层有一个data_format参数。默认情况下,它是"channels_last",这意味着它将保留最后一个通道,并取另一个通道的平均值。

下面是一个示例模型:

代码语言:javascript
运行
复制
model = Sequential([
    Input((10)),
    Embedding(30, 7, input_length=10),
    GlobalAveragePooling1D()
])

model.summary()

产出:

代码语言:javascript
运行
复制
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),这意味着返回给定的嵌入的平均值。

如果你设置了data_format = "channels_first",就像这里

代码语言:javascript
运行
复制
model = Sequential([
    Input((10)),
    Embedding(30, 7, input_length=10),
    GlobalAveragePooling1D(data_format = "channels_first")
])

model.summary()

产出:

代码语言:javascript
运行
复制
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),这意味着返回给定的每个嵌入中的平均值。什么类型没有意义,因为您可以将embedding_dim设置为1并得到相同的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70561374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档