唉!!!这些大佬,写个LSTM每一个人的实现方法都不一样,有用Keras,TF,Pytorch等,可怜我啥时候才能看懂那篇论文的代码啊!!!!
引言
如果 用 tensorflow 来搭建神经网络,我们还需要下一些功夫,而使用keras 我们就省心了,提供高级的 API 供我们使用来搭建神经网络,keras 也走进了谷歌的大门,keras 也被整合到 tensorflow 方便我们使用。
定义模型样子
这里说一下mnist是一个用到烂的数据集
# %pip install tensorflow
import tensorflow as tf
mnist = tf.keras.datasets.mnist # 28 x 28 images of hand-written digits 0-9
#加载数据
(x_train,y_train),(x_test,y_test) = mnist.load_data()
#### 可视化数据
通过 keras.datasets 导入手写数字集,用于我们学习如何搭建神经网络来识别图中数字
import matplotlib.pyplot as plt
plt.imshow(x_train[0])
print(x_train[0])
使用 matplotlib 库可以将数据可视化,让我们更加直观地了解图片数据到底是什么。
plt.imshow(x_train[0],cmap=plt.cm.binary)
x_train = tf.keras.utils.normalize(x_train,axis = 1)
x_test = tf.keras.utils.normalize(x_test, axis = 1)
我们可以对数据通过处理将数据映射到 1 - 0 区间,这样更便于处理。开始搭建我们神经网络
model = tf.keras.models.Sequential()
这里我们使用 Sequential 创建顺序执行执行神经网络。
# add layer first layer is input layer
model.add(tf.keras.layers.Flatten())
首先将多维数据压缩为一维数据,作为输入数据。Dense 表示一个全连接的层,这也就是我们要添加一个输出 128 的全连接层。然后activation 可以指定激活函数。
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
添加两个神经层,因为每一层输入都是 128 而且激活函数使用简单的 relu,relu 相比其他激活函数计算简单。
model.add(tf.keras.layers.Dense(10,activation=tf.nn.softmax))
接下来评价我们模型,可以指定 loss 函数类型,训练模型就是找到最合适方程,可以在 optimizer 指定找到最合适函数的方式。
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(x_train,y_train,epochs=3)
开始训练,第一个参数为训练集,y_train 为期望值,x_train 是二维数组,一维是训练集样本数量,第二个维度是图片大小,28 * 28 = 784。对于 y_train 的第一个维度就是样本的数量,第二个就是 10 维,因为我们图片是分为 10 类。
其实这里还有参数batch_size 指定数量,这样 keras 是根据 batch_size 将数据进行划分,然后在 batch_size 计算出 loss 函数得到然后根据 loss 函数(损失函数)结构调整一次参数依次类推,每一个 batch 都会根据loss 函数来更新参数
解析
batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。
epochs:整数,训练终止时的epoch值,训练将在达到该epoch值时停止,当没有设置initial_epoch时,它就是训练的总轮数,否则训练的总轮数为epochs - inital_epoch
然后每完成一次所有 batch 运算就算为 epoch
输出一个 loss
(0.11153460214892402, 0.9629)
然后就可以检查一下我们训练成果了,我们可以将训练好模型保存起来,以便以后可以无需重复训练通过加载训练好的模型,来进行图形识别。
model.save('epic_num_reader.model')
new_model = tf.keras.models.load_model('epic_num_reader.model')
predictions = new_model.predict([x_test])
print(predictions)
模型保存这一步很重要
我之前一直以为在线上模型使用每次都要fit一下,显然不是的。sava model
从结果来看我们训练出的模型可以满足我们需要,模型已经成功根据图片
7
通过我们测试模型现在已经可以识别出数字 7