首先,选用一个较为简单的手写数字图像集作为本次演示的数据集。利用普通神经网络实现
- 过程简介
在TensorFlow的图像识别任务中:
- 第一步是读取图像,在TensorFlow中手写数字数据集MNIST可以在其dataset中直接获取,当你已经下载过了,可以直接使用,获取MNIST如下代码所示
# 在该数据集中已经划分了训练集与验证集,并且图像与其标签也已经切分 (x, y), (x_val, y_val) = datasets.mnist.load_data()
- 第二步是把图像转化为TensorFlow使用的tensor,并归一化,当然了,归一化有助于函数更好的收敛,具体如下所示:
x = tf.convert_to_tensor(x, dtype=tf.float32)/255
- 第三步是把标签y转化为tensor,然后使用热编码,热编码可以这么理解,有多少个分类就相当于有多少个数组,而对应的分类为1,其他则全为0,。
y = tf.convert_to_tensor(y, dtype=tf.int32) # 热编码 y = tf.one_hot(y, depth=10)
- 第四步是搭建神经网络模型,由于使用普通的神经网络,其节点间都是全连接的,而在TensorFlow的全连接层可由下实现,代码中使用了三个隐含层,全使用relu激活函数,最后为输出层,神经元个数为分类数。
model = keras.Sequential([ layers.Dense(512, activation='relu'), layers.Dense(256, activation='relu'), layers.Dense(128, activation='relu'), layers.Dense(10)])
- 第五步是使用优化函数对神经网络进行优化,在TensorFlow中提供了多个优化函数,本次使用了SGD优化函数,并设置学习率为0.001
optimizer = optimizers.SGD(learning_rate=0.001)
-
编写训练函数,初始化一些参数
def train_epoch(epoch): # 设置批次处理量 for step, (x, y) in enumerate(train_dataset): with tf.GradientTape() as tape: x = tf.reshape(x, (-1, 28*28)) out = model(x) # 计算损失值loss loss = tf.reduce_sum(tf.square(out - y)) / x.shape[0] # 优化与更新网络内部参数 grads = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables)) if step % 100 == 0: print(epoch, step, 'loss:', loss.numpy())