人工智能实践——利用Keras进行字符串识别

利用keras进行字符串识别

Embedding Layers

为什么要用Embedding layers?
通常情况下,我们使用的是one-hot编码,但是one-hot是将其转为0-1,如果有1000个不同的数值,那么就会转为1000*1000的矩阵,存储消耗过大。

所以采取 Embedding Layers
举个例子:
对于一句话"deep learning is very deep”
第一步:我们将其分配索引 就好像1 2 3 4 1这样
第二步:决定为下标分配多少,根据潜在因素(latent factors)如果我们分配6个潜在因素,则
人工智能实践——利用Keras进行字符串识别_第1张图片
因此,我们可以使用embedding矩阵来保持每个向量的大小更小,而不是以巨大的one-hot编码向量。 简而言之,发生的事情就是“deep”这个词由向量 [.32, .02, .48, .21, .56, .15]表示

引用:https://blog.csdn.net/qq_35799003/article/details/84668863

所以来看看具体如何使用:
对于文本
docs = [‘Well done!’,
‘weak work’,
‘Great effort’,
‘nice work’,
‘Excellent!’,
‘Weak’,
‘Poor effort!’,
‘not good’,
‘poor work’,
‘Could have done better’]

one_hot

注意keras的one_hot是区别于tf.onehot的
将字符串数组text转化为0-n的数字【数组中每一个单元根据split又划分为单词,对应不同的数字】
keras.preprocessing.text.one_hot(text, n, filters=’!"#KaTeX parse error: Expected 'EOF', got '#' at position 119: …连接),如标点符号。默认:!"#̲%&()*+,-./:;<=>?@[]^_{|}~,包含基本标点符号,制表符和换行符。
lower: 布尔值。是否将文本转换为小写。 默认True
split: 字符串。按该字符串切割文本。默认为空格

例子:
from tensorflow.keras.preprocessing.text import one_hot
encoded_docs = [one_hot(d, 50) for d in docs]
输出:
[[24, 11], [8, 19], [31, 31], [41, 19], [39], [8], [2, 31], [9, 11], [2, 19], [15, 42, 11, 32]]

pad_sequences

keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype=‘int32’, padding=‘pre’, truncating=‘pre’, value=0.0)

sequences: 列表的列表,每一个元素是一个序列。
maxlen: 整数,所有序列的最大长度。
dtype: 输出序列的类型。 要使用可变长度字符串填充序列,可以使用 object。
padding: 字符串,‘pre’ 或 ‘post’ ,在序列的前端补齐还是在后端补齐。
truncating: 字符串,‘pre’ 或 ‘post’ ,移除长度大于 maxlen 的序列的值,要么在序列前端截断,要么在后端。
value: 浮点数,表示用来补齐的值。

例子:
from tensorflow.keras.preprocessing.sequence import pad_sequences
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding=‘post’)
输出:
[[24 11 0 0]
[ 8 19 0 0]
[31 31 0 0]
[41 19 0 0]
[39 0 0 0]
[ 8 0 0 0]
[ 2 31 0 0]
[ 9 11 0 0]
[ 2 19 0 0]
[15 42 11 32]]

Embedding

keras.layers.Embedding(input_dim, output_dim,input_length=None)

将正整数(索引值)转换为固定尺寸的稠密向量。 例如: [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]
还有一些参数感觉一时半用不上,省略了,可以参见官方文档
input_dim: int > 0。词汇表大小, 即,最大整数 index + 1。
output_dim: int >= 0。词向量的维度。
input_length: 输入序列的长度,当它是固定的时。 如果你需要连接 Flatten 和 Dense 层,则这个参数是必须的 (没有它,dense 层的输出尺寸就无法计算)。

例子:对于上面得到的padded_docs【### pad_sequences中】,对其调用
x=Embedding(50, 8, input_length=max_length)(padded_docs)
print(x.shape)
输出:
(10,4,8)
截取一个片段:
此处是把padded_docs 的24转换为了下图的8个数字
[-0.03115562 -0.03910154 0.01211138 -0.01483564 -0.02483144
0.04661348 0.01549006 -0.03504736]

Flatten

重新调整为 1D 的张量。官方文档上这样写的,但是效果实际上是调整为2D张量
flatten_x = Flatten()(x)
(10,32)

Dense

keras.layers.Dense(units, activation=None,input_shape=)
units: 正整数,输出空间维度。
activation: 激活函数 (详见 activations)。 若不指定,则不使用激活函数 (即,「线性」激活: a(x) = x)。
input_shape:输入数组的尺寸
可以理解为units表示此层有多少神经元数量,input_shape为输入层的神经元数量
并且在第一层指定input_shape后,后面的Dense就无需再指定input_shape

例子:上述的flatten_x 经处理
x = Dense(2, activation=‘sigmoid’,input_shape=(32,))(flatten_x)
输出:
tf.Tensor(
[[0.485569 0.49387765]
[0.48939705 0.48432356]
[0.49119213 0.48829877]
[0.49291977 0.4871982 ]
[0.5010188 0.4814079 ]
[0.4892107 0.48993066]
[0.4905094 0.49578127]
[0.5022545 0.47634888]
[0.49624747 0.48641354]
[0.50609255 0.4945672 ]], shape=(10, 2), dtype=float32)

model结构

可以理解为一个搭建神经网络的搭建方式相当于现在有3种方式搭建了,一种是class,一种是model =tf.keras.models.Sequential。这是第三种model搭建,说实话感觉这一种是最好的

from keras.models import Model
from keras.layers import Input, Dense

a=Input(shape=(32,))#
b=Dense(32)(a)
model = Model(inputs=a, outputs=b)

model.compile
model.fit
model.summary

可以看到,同样的六步法中有五步是一样的,区别就在于神经网络的搭建

evaluate

evaluate(x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None)
x:为输入数据
y:为输出数据
batch_size:每次评估的样本数

返回值是 loss, accuracy

predict

predict(x, batch_size=None, verbose=0, steps=None)
x: 输入数据,Numpy 数组 (或者 Numpy 数组的列表,如果模型有多个输出)。
batch_size: 整数。如未指定,默认为 32。
verbose: 日志显示模式,0 或 1。
返回的是预测的 Numpy 数组【即根据输入进行判断得到的输出】

源码:

import tensorflow as tf
import os
from tensorflow import keras
import numpy as np

from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.preprocessing.text import one_hot
from tensorflow.keras.layers import Input, Embedding, LSTM, Dense,Flatten
from tensorflow.keras.models import Model


docs = ['Well done!',
        'weak work',
        'Great effort',
        'nice work',
        'Excellent!',
        'Weak',
        'Poor effort!',
        'not good',
        'poor work',
        'Could have done better']
labels = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
labels=np.array(labels)

vocab_size = 50
encoded_docs = [one_hot(d, vocab_size) for d in docs]

max_length = 4
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post')

input = Input(shape=(max_length,))
x = Embedding(vocab_size, 8, input_length=max_length)(input)
flatten_x  = Flatten()(x)
x = Dense(1, activation='sigmoid',input_shape=(32,))(flatten_x)
model = Model(inputs=input, outputs=x)

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
model.fit(padded_docs, labels, epochs=50, verbose=1)
model.summary()
loss, accuracy = model.evaluate(padded_docs, labels, verbose=1)
print('Accuracy: %f' % (accuracy * 100))

你可能感兴趣的:(人工智能实践)