CNN做图片分类——李宏毅CNN作业记录2.0

0.前言

写给自己当作记录,是对1.0版本的代码换一种形式。

1.0版本中的代码的模型构建、训练、评估都是手打的,效果肯定没有tf2.0自带的工具好。

在参考tf2.0的官方文档后,把代码换成更简洁有效的方式。实际操作时不管是编程体验还是最后输出效果都比自己手打好太多了(虽然最后的准确率并没有上升)。要提升准确率应该得优化模型,而我的模型还没有变,所以准确率和原来差不多。

本文主要记录下用官方自带的方法去做CNN图片分类的步骤,以后再用时作为快速复习使用。

1.CODE

1.1 先引入需要的第三方库

#import 需要的第三方库
import numpy as np
import os
import cv2
import tensorflow as tf

1.2 如何将图片数据处理成能够输入CNN的数据

def readfile(path, label):
    #label是bool,表示是否返回y
    image_dir = os.listdir(path) #image_dir是个list
    # x是个4维的numpy数组[图片个数,图片长,图片宽,色彩通道],例如,training里有9866张彩色图片,假设分辨率为64*64,x的维度为[9866, 64, 64, 3]
    # y是个向量,长度为图片个数,表示图片类别标签,从0-10共有11个类别
    # 注意x、y的数据类型
    x = np.zeros((len(image_dir), 64, 64, 3), dtype=np.float32)
    y = np.zeros((len(image_dir)), dtype=np.int32)
    for i, file in enumerate(image_dir):
        img = cv2.imread(path+"\\"+file)  #得到图片的地址信息
        x[i] = cv2.resize(img,(64, 64))  #把第i张图片大小统一为64*64
        if label:
            y[i] = int(file.split("_")[0])
    #training要x和y,testing只要x
    if label:
        return x, y
    else:
        return x

1.3 读取数据

#得到training、validation、testing数据
CNN_path = "E:\\Machine Learning\\data\\data1\\hw3\\food-11"
print(10*"="+"Reading Data"+10*"=")
train_x, train_y = readfile(CNN_path+"\\training", True)
train_x = train_x.astype(np.float32)/255.0
print("Size of training data = {}".format(len(train_x)))
val_x, val_y = readfile(CNN_path+"\\validation", True)
val_x = val_x.astype(np.float32)/255.0
print("Size of validation data = {}".format(len(val_x)))
print("train_x shape:{}".format(train_x.shape))
print("train_y shape:{}".format(train_y.shape))

1.4 搭建CNN模型

#定义CNN Model
inputs = tf.keras.Input(shape=(64, 64, 3))
x = tf.keras.layers.Conv2D(
    filters=64,
    kernel_size = [3, 3],
    padding = 'same',
    activation = tf.nn.relu
)(inputs)
x = tf.keras.layers.MaxPool2D(pool_size=[2,2], strides=2)(x)

x = x = tf.keras.layers.Conv2D(
    filters=128,
    kernel_size = [3, 3],
    padding = 'same',
    activation = tf.nn.relu
)(x)
x = tf.keras.layers.MaxPool2D(pool_size=[2,2], strides=2)(x)

x = x = tf.keras.layers.Conv2D(
    filters=256,
    kernel_size = [3, 3],
    padding = 'same',
    activation = tf.nn.relu
)(x)
x = tf.keras.layers.MaxPool2D(pool_size=[2,2], strides=2)(x)

x = x = tf.keras.layers.Conv2D(
    filters=512,
    kernel_size = [3, 3],
    padding = 'same',
    activation = tf.nn.relu
)(x)
x = tf.keras.layers.MaxPool2D(pool_size=[2,2], strides=2)(x)

x = x = tf.keras.layers.Conv2D(
    filters=512,
    kernel_size = [3, 3],
    padding = 'same',
    activation = tf.nn.relu
)(x)
x = tf.keras.layers.MaxPool2D(pool_size=[2,2], strides=2)(x)

x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dropout(0.5)(x)
x = tf.keras.layers.Dense(units=1024, activation=tf.nn.relu)(x)
x = tf.keras.layers.Dropout(0.5)(x)
x = tf.keras.layers.Dense(units=512, activation=tf.nn.relu)(x)
x = tf.keras.layers.Dense(units=11)(x)
outputs = tf.keras.layers.Softmax()(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)

1.5 模型的训练、评估

#配置训练过程
model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
    loss=tf.keras.losses.sparse_categorical_crossentropy,
    metrics=[tf.keras.metrics.sparse_categorical_accuracy]
)

#训练模型
model.fit(train_x, train_y, epochs=40, batch_size=165)

#评估模型
print(model.evaluate(val_x, val_y))

END

以上有任何疑问,参考tf2.0官方文档
tf2.0 官方文档

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SinHao22

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值