图像表示
这个是一个手写数字识别的问题。左边是一个图像,右边是一个二维矩阵(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。
# 输入数据,二维图片
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 = tf.placeholder(tf.float32, # 数据类型
[None, 14, 14] # 输入维度
name=‘input’)
y_ = tf.placeholder(tf.float32, # 数据类型
[None, 10], # 输出维度
name=‘output’)
刚刚数字识别的图片怎么表示呢?
将大小为14*14的灰度图分成10类
文字怎么表示呢?
文本表示
TF is best
文本符号 -> 数值向量
# 输入数据,文本序列
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,输入到模型里边。
# 输入数据,文本序列
# 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表。
# 输入数据,文本序列
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表进行相乘,得到的结果就是模型要做的输入。
小结