趋动云模型--猫狗识别

写在前面:感谢Datawhale各位大大和各位群友的答疑解惑!

目录

代码注释

函数详解


代码注释

###导入模块  ###
#argparse是一个Python模块:命令行选项、参数和子命令解析器。
#os模块提供的就是各种 Python 程序与操作系统进行交互的接口
import argparse
import tensorflow as tf   #导入tensorflow 重命名为tf
import os

#line now+1 创建解析器,line now+2-line now+7 添加参数,line now+8解析参数。详见argparse模块官方文档
parser = argparse.ArgumentParser(description='Process some integers')
parser.add_argument('--mode', default='train', help='train or test')
parser.add_argument("--num_epochs", default=5, type=int)
parser.add_argument("--batch_size", default=32, type=int)
parser.add_argument("--learning_rate", default=0.001)
parser.add_argument("--data_dir", default="/gemini/data-1")
parser.add_argument("--train_dir", default="/gemini/output")
args = parser.parse_args()

###定义一个decode_and_resize函数,函数的输入参数为filename和label,即文件名和标签
def _decode_and_resize(filename, label):
    image_string = tf.io.read_file(filename)#读取图像
    image_decoded = tf.image.decode_jpeg(image_string, channels=3)#对图像进行解码,RGB图像是三通道
    image_resized = tf.image.resize(image_decoded, [150, 150]) / 255.0 #resize图像大小,除255猜测是进行了归一化,后续看是否可以论证
    return image_resized, label #函数返回值 resize图像和label


if __name__ == "__main__":
    ###设置数据集###
    train_dir = args.data_dir + "/train"   #训练数据集路径
    cats = []
    dogs = []
    for file in os.listdir(train_dir):   #添加训练图像路径
        if file.startswith("dog"):
            dogs.append(train_dir + "/" + file)
        else:
            cats.append(train_dir + "/" + file)
    print("dogSize:%d catSize:%d" % (len(cats), len(dogs)))  #分别输出dog和cat两类训练数据大小,这里应该是% (len(dogs), len(cats)),但该数据集dogs数量=cats数量,问题不大。
    train_cat_filenames = tf.constant(cats[:10000])
    train_dog_filenames = tf.constant(dogs[:10000])
    train_filenames = tf.concat([train_cat_filenames, train_dog_filenames], axis=-1)
    train_labels = tf.concat([
        tf.zeros(train_cat_filenames.shape, dtype=tf.int32),
        tf.ones(train_dog_filenames.shape, dtype=tf.int32)
    ], axis=-1)

    train_dataset = tf.data.Dataset.from_tensor_slices((train_filenames, train_labels))#假设我们现在有两组数据,分别是特征和标签,为了简化说明问题,我们假设每两个特征对应一个标签。之后把特征和标签组合成一个tuple
    
    train_dataset = train_dataset.map(map_func=_decode_and_resize,
                                      num_parallel_calls=tf.data.experimental.AUTOTUNE)
    #map接收一个函数,Dataset中的每个元素都会被当作这个函数的输入,并将函数返回值作为新的Dataset
    train_dataset = train_dataset.shuffle(buffer_size=20000)#shuffle的功能为打乱dataset中的元素
    train_dataset = train_dataset.batch(args.batch_size)
    train_dataset = train_dataset.prefetch(tf.data.experimental.AUTOTUNE)#数据预读取,提高IO性能
    ###搭建模型###
    model = tf.keras.Sequential([
        tf.keras.layers.Conv2D(32, 3, activation="relu", input_shape=(150, 150, 3)),#卷积层
        tf.keras.layers.MaxPool2D(),      #最大池化
        tf.keras.layers.Conv2D(64, 3, activation="relu"),
        tf.keras.layers.MaxPool2D(),
        tf.keras.layers.Conv2D(128, 3, activation="relu"),
        tf.keras.layers.MaxPool2D(),
        tf.keras.layers.Conv2D(128, 3, activation="relu"),
        tf.keras.layers.MaxPool2D(),
        tf.keras.layers.Flatten(),   #将输入层的数据压成一维的数据,一般用再卷积层和全连接层之间
        tf.keras.layers.Dropout(0.5),  #dropout层
        tf.keras.layers.Dense(512, activation="relu"),#全连接层
        tf.keras.layers.Dense(2, activation="softmax")
    ])
    model.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=args.learning_rate),
        loss=tf.keras.losses.sparse_categorical_crossentropy,
        metrics=[tf.keras.metrics.sparse_categorical_accuracy]
    )#在配置训练方法时,告知训练时用的优化器、损失函数和准确率评测标准
    model.fit(train_dataset, epochs=args.num_epochs)#将训练数据在模型中训练一定次数,返回loss和测量指标
    model.save(args.train_dir)#保存模型

    ### 构建测试数据集
    test_cat_filenames = tf.constant(cats[10000:])
    test_dog_filenames = tf.constant(dogs[10000:])
    test_filenames = tf.concat([test_cat_filenames, test_dog_filenames], axis=-1)
    test_labels = tf.concat([
        tf.zeros(test_cat_filenames.shape, dtype=tf.int32),
        tf.ones(test_dog_filenames.shape, dtype=tf.int32)
    ], axis=-1)
    test_dataset = tf.data.Dataset.from_tensor_slices((test_filenames, test_labels))
    test_dataset = test_dataset.map(_decode_and_resize)
    test_dataset = test_dataset.batch(args.batch_size)
    sparse_categorical_accuracy = tf.keras.metrics.SparseCategoricalAccuracy()
    for images, label in test_dataset:
        y_pred = model.predict(images)
        sparse_categorical_accuracy.update_state(y_true=label, y_pred=y_pred)
    print("test accuracy:%f" % sparse_categorical_accuracy.result())

函数详解

  • Python argparse模块详解:argparse是一个Python模块:命令行选项、参数和子命令解析器。

    argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。

    argparse.ArgumentParser()用法解析_PerpetualLearner的博客-CSDN博客

  • tensorflow :一种深度学习框架

    人工智能框架—Tensorflow简介 - 知乎 (zhihu.com)

  • Python os 模块详解:os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os模块,一方面可以方便地与操作系统进行交互,另一方面页可以极大增强代码的可移植性。

    Python os 模块详解 - 知乎 (zhihu.com)

  • tf.image.resize:调整图像大小

    使用tf.image.resize() 和tf.image.resize_with_pad()调整图像大小_Erosion_ww的博客-CSDN博客

  • tf.constant:

    TensorFlow创建常量(tf.constant)详解_csdn_jiayu的博客-CSDN博客

    tensorflow2.x——tf.constant()函数介绍和示例_一只工程狮的博客-CSDN博客

  • tf.data.Dataset.from_tensor_slices:把给定的元组、列表和张量等数据进行特征切片。切片的范围是从最外层维度开始的。如果有多个特征进行组合,那么一次切片是把每个组合的最外维度的数据切开,分成一组一组的。

    例如:假设我们现在有两组数据,分别是特征和标签,为了简化说明问题,我们假设每两个特征对应一个标签。之后把特征和标签组合成一个tuple

    tf.data.Dataset.from_tensor_slices的用法_VolCui的博客-CSDN博客

  • Tensorflow.Dataset中map,shuffle,repeat,batch的总结:

    注意:shuffle的顺序很重要,应该先shuffle再batch,如果先batch后shuffle的话,那么此时就只是对batch进行shuffle,而batch里面的数据顺序依旧是有序的,那么随机程度会减弱。

    Tensorflow.Dataset中map,shuffle,repeat,batch的总结_shuffledataset_anshuai_aw1的博客-CSDN博客

  • train_dataset.prefetch:数据预读取,提高IO性能

    tensorflow中prefetch最合适的用法_tensorflow prefetch-CSDN博客

  • tf.keras.Sequential:

    Sequential 顺序模型指引 - Keras 中文文档

  • tf.keras.layers.Flatten:将输入层的数据压成一维的数据,一般用再卷积层和全连接层之间

    keras.layers.Flatten讲解_踩坑专业户的博客-CSDN博客

  • tf.keras.layers.Dropout:Dropout正则化是最简单的神经网络正则化方法。其原理非常简单粗暴:任意丢弃神经网络层中的输入,该层可以是数据样本中的输入变量或来自先前层的激活。它能够模拟具有大量不同网络结构的神经网络,并且反过来使网络中的节点更具有鲁棒性。

    Keras中Dropout的用法详解_keras dropout_日拱一两卒的博客-CSDN博客

  • tf.keras.layers.Dense:全连接层在整个网络卷积神经网络中起到“特征提取器”的作用。如果说卷积层、池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样本的标记空间的作用。

    全连接层tf.keras.layers.Dense()介绍_K同学啊的博客-CSDN博客

  • model.compile():

    model.compile()方法用于在配置训练方法时,告知训练时用的优化器、损失函数和准确率评测标准

    tensorflow中model.compile()用法_yunfeather的博客-CSDN博客

  • model.fit( ) :

    将训练数据在模型中训练一定次数,返回loss和测量指标

    model.fit( )函数:训练模型_方如一的博客-CSDN博客

  • model.save:保存模型

    保存和加载 Keras 模型  |  TensorFlow Core (google.cn)

你可能感兴趣的:(深度学习,python)