使用TensorFlow实现一个简单图像识别的全过程介绍

仲孙翔飞
2023-12-01

首先,选用一个较为简单的手写数字图像集作为本次演示的数据集。利用普通神经网络实现

  • 过程简介

在TensorFlow的图像识别任务中:

  1. 第一步是读取图像,在TensorFlow中手写数字数据集MNIST可以在其dataset中直接获取,当你已经下载过了,可以直接使用,获取MNIST如下代码所示
    # 在该数据集中已经划分了训练集与验证集,并且图像与其标签也已经切分
    (x, y), (x_val, y_val) = datasets.mnist.load_data() 

     

  2. 第二步是把图像转化为TensorFlow使用的tensor,并归一化,当然了,归一化有助于函数更好的收敛,具体如下所示:
    x = tf.convert_to_tensor(x, dtype=tf.float32)/255

     

  3. 第三步是把标签y转化为tensor,然后使用热编码,热编码可以这么理解,有多少个分类就相当于有多少个数组,而对应的分类为1,其他则全为0,。
    y = tf.convert_to_tensor(y, dtype=tf.int32)
    # 热编码
    y = tf.one_hot(y, depth=10)

     

  4. 第四步是搭建神经网络模型,由于使用普通的神经网络,其节点间都是全连接的,而在TensorFlow的全连接层可由下实现,代码中使用了三个隐含层,全使用relu激活函数,最后为输出层,神经元个数为分类数。
    model = keras.Sequential([ 
        layers.Dense(512, activation='relu'),
        layers.Dense(256, activation='relu'),
        layers.Dense(128, activation='relu'),
        layers.Dense(10)])

     

  5. 第五步是使用优化函数对神经网络进行优化,在TensorFlow中提供了多个优化函数,本次使用了SGD优化函数,并设置学习率为0.001
    optimizer = optimizers.SGD(learning_rate=0.001)
    
  6. 编写训练函数,初始化一些参数

    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())

     

 类似资料: