前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图像 | 文本怎么输入到模型 ?

图像 | 文本怎么输入到模型 ?

作者头像
木野归郎
发布2020-10-30 14:45:22
1.3K0
发布2020-10-30 14:45:22
举报
文章被收录于专栏:share ai happinessshare ai happiness

图像表示

这个是一个手写数字识别的问题。左边是一个图像,右边是一个二维矩阵(14*14),每一个矩阵对应的位置是一个像素值,在这里白色代表。那左边那个Y={0 1 0 0 0 0 0 0 0 0}表示一个向量,相当于一个答案,输入一个x对应一个标签Y,这个Y一般是一维数组,具体得看是几分类问题,就是几位数组,看属于哪个类别,属于哪个类别哪个类别等于1,其他的等于0。

手写数组是一个十分类问题,把每张图片分成0、1....十个里边一个,所以为10维向量,Y={0 1 0 0 0 0 0 0 0 0}代表1这个类别是第二个维度,就是说输入值x是14*14矩阵,对应标签是1类别,1类别代表1的是第二个维度,剩下的都是0。

代码语言:javascript
复制
# 输入数据,二维图片
x = tf.placeholder(tf.float32,  # 数据类型      
          [batch_size,   # 批大小       
          img_width, # 图片宽度       
          img_height, # 图片长度       
          img_channels], # 图片深度,RGB为3,灰度图为0      
          name=‘input’)
y_ = tf.placeholder(tf.float32,   # 数据类型      
          [batch_size,    # 批大小       
          class_size], # 目标类别数目       
          name=‘output’)

TensorFlow这个图片是怎么表示的。往下看,都是用placeholder来初始化参数,看具体参数值:

  • x的表示:数据类型、批大小、图像宽度和高度,图片深度(灰度图是没有通道,只有两个为宽和高,彩色为RGB,为3个通道,变成了三维数组)。
  • y的表示:这里说一下和x不一样的地方,class_size类别数目,分成几个类别。
  • 定义一个名称:input和output。
代码语言:javascript
复制
# 输入数据,二维图片
x = tf.placeholder(tf.float32,  # 数据类型      
          [None,  14, 14]  # 输入维度       
          name=‘input’)
y_ = tf.placeholder(tf.float32,   # 数据类型      
          [None, 10], # 输出维度       
          name=‘output’)

刚刚数字识别的图片怎么表示呢?

  • x表示:None代表的是批,宽和高都是14,因为是灰度图,只有一个channel,可以不写。
  • y表示:分成10类,class_size就给10。

将大小为14*14的灰度图分成10类

文字怎么表示呢?

文本表示

TF is best

文本符号 -> 数值向量

代码语言:javascript
复制
# 输入数据,文本序列
x = tf.placeholder(tf.int32,  # 数据类型
      [batch_size,   # 批大小
       seq_len], # 词序列长度
       name=‘input’)
y_ = tf.placeholder(tf.float32,   # 数据类型
      [batch_size,    # 批大小
       class_size], # 目标类别数目
       name=‘output’)
emb = tf.get_variable(“emb”,
        [vocab_size, # 词汇表大小
        emb_size]) # 词向量维度
Inputs = tf.nn.embedding_lookup(emb, x) # 向量映射

这是文本的表示方式,x和y就不解释了,emb表示:vocab_size有几行就有几个词汇,emb_size每个词表示多长的维度,emb可以看成一行一行向量,每一行向量代表的是一个词对应的向量表示。

embedding_lookup(emb,x),x前面说了是整数的向量,整数的长度是seq序列的长度或者句子长度,序列的长度是由好多整数组成,整数代表原来这个词,这个词表示在emb这个矩阵里边,这个词对应的是哪一行,emb是一行行向量,每个词就是对应的向量表示,x里边整数表示,所有整数代表不同的词对应emb表里边的索引。

所以说文本输入是这样:首先把每个句子或词转换成词在emb表里边的索引值,然后再把这个索引值通过emb表映射成对应的向量值,生成这个input,输入到模型里边。

代码语言:javascript
复制
# 输入数据,文本序列

# get_variable
# 根据变量名称直接获取,如果不存在就创建一个新的
emb = tf.get_variable(name=“emb”,
        [ vocab_size, //词汇表大小
          emb_size ], //词向量维度
        initializer) //词向量矩阵,训练好的
# Variable
# 创建一个新的变量,用具体的值初始化,变量名称可选
emb = tf.Variable(initializer, //词向量矩阵,训练好的
         name=“emb” //变量名称(可选)

get_variable是可以共享变量的,通过共享名称name,首先会在变量空间里边找有没有这个名称是emb的,如果有会直接用,如果没有才会去创建emb表。

代码语言:javascript
复制
# 输入数据,文本序列
x = tf.placeholder(tf.int32,  # 数据类型
      [None,  30], # 输入维度
      name=‘input’)
y_ = tf.placeholder(tf.float32,   # 数据类型
      [None, 2], # 输出维度
       name=‘output’)

emb = tf.get_variable(“emb”, [8, 6]) # 词向量维度

input = tf.nn.embedding_lookup(emb, x) # 向量映射

批是None,30:句子一般是由30个词组成。Y:要进行2分类。使用get_variable()创建词向量,维度是8*6,词汇表有8个,每个词汇表要表示6维向量。用embedding_lookup进行映射,把每个整数映射成向量,进行input表,就是把原来(None批*30)变成现在(None批*30*6维向量)。

文本输入表示

embedding matrix 每一行代表一个词对应的向量

假设已经有训练好的embedding matrix,现在输入词,TF is best三个词,首先先映射成[2,5,7],代表词在向量表中的索引,可以用onehot进行表示,向量的长度相当于词汇表长度、矩阵的行数,向量直接和embedding表进行相乘,得到的结果就是模型要做的输入。

小结

  • 图片的输入表示
  • 文本的输入表示
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OnlyCoding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档