机器学习/深度学习——图像分类(卷积神经网络)

AlexNet网络介绍:

AlexNet网络的特点:

  1. 8层变换,有5层卷积和2层全连接隐藏层,以及1个全连接输出层
  2. 卷积核:11*11  5*5  3*3
  3. 池化: 3*3 stride 2
  4. 激活函数使用RELU
  5. dropOut作正则化
  6. 图像增强方法,提高数据量 

池化层(降低维度):

  1. 最大池化:取窗口内的最大值作为输出
  2. 平均池化:窗口内的所有值的均值作为输出

全连接层(输出结果):

一般在CNN网络的末端

作用:将特征图reshape成一维向量,再送入至连接层中进行分类或回归

案例:

from tensorflow.keras.datasets import cifar10
(train_images,train_labels),(test_images,test_labels) = cifar10.load_data()
test_images.shape
train_images.shape
import matplotlib.pyplot as plt
plt.figure(figsize=(1,1))
plt.imshow(train_images[4])

AlexNet网络代码:

import tensorflow as tf

# 模型构建
net = tf.keras.models.Sequential([
    # 卷积层:96 11*11 4 relu
    tf.keras.layers.Conv2D(filters=96,kernel_size=11,strides=4,activation="relu"),
    # 池化: 3*3 2
    tf.keras.layers.MaxPool2D(pool_size=3,strides=2),
    # 卷积:256 5*5 1 relu same
    tf.keras.layers.Conv2D(filters=256,kernel_size=5,padding="same",activation="relu"),
    # 池化: 3*3 2 
    tf.keras.layers.MaxPool2D(pool_size=3,strides=2),
    # 卷积:384 3*3 1 relu same
    tf.keras.layers.Conv2D(filters=384,kernel_size=3,padding="same",activation="relu"),
    # 卷积:384 3*3 1 relu same
    tf.keras.layers.Conv2D(filters=384,kernel_size=3,padding="same",activation="relu"),
    # 卷积:384 3*3 1 relu same
    tf.keras.layers.Conv2D(filters=256,kernel_size=3,padding="same",activation="relu"),
    # 池化:3*3 2
    tf.keras.layers.MaxPool2D(pool_size=3,strides=2),
    # 展开
    tf.keras.layers.Flatten(),
    # 全连接层:4096 relu 
    tf.keras.layers.Dense(4096,activation="relu"),
    # 随机失活
    tf.keras.layers.Dropout(0.5),
    # 输出层
    tf.keras.layers.Dense(10,activation="softmax")
])

# 输出网络
X=tf.random.uniform((1,227,227,1))
y=net(X)
net.summary()

Lenet-5网络:

网络构成 :

1.conv +pooling ...+FC

2. 数据的维度【B,H,W,C】

数据获取处理:

1.加载mnist

2.维度调整:添加一个通道维

3.模型构建:2个卷积+池化,flatten+FC

4.模型编译: Loss,opt,metric

5.模型训练:model.fit(data,epochs,batch_size...)

6.模型评估:net.evalute()

开源数据集:{mnist、Cifar10/cifar100、ImageNet(数据量大、作为网络的预训练数据集、Alexnet、VGG、GooLenet、Resnet)}

import tensorflow as tf
net = tf.keras.models.Sequential([
    # 卷积层:96 11*11 4 relu 个数 大小 步幅 激活函数
    tf.keras.layers.Conv2D(filters=96,kernel_size=11,strides=4,activation="relu"),
    # 池化:3*3 2
    tf.keras.layers.MaxPool2D(pool_size=3,strides=2),
    # 卷积:256 5*5 1 relu same
    tf.keras.layers.Conv2D(filters=256,kernel_size=5,padding="same",activation="relu"),
    # 池化: 3*3 2
    tf.keras.layers.MaxPool2D(pool_size=3,strides=2),
    # 卷积:384 3*3 1 relu same
    tf.keras.layers.Conv2D(filters=384,kernel_size=3,padding="same",activation="rele"),
    # 卷积:384 3*3 1 relu same
    tf.keras.layers.Conv2D(filters=384, kernel_size=3, padding="same", activation="rele"),
    # 卷积:256 3*3 1 relu same
    tf.keras.layers.Conv2D(filters=256,kernel_size=3,padding="same",activation="rele"),
    # 池化:3*3 2
    tf.keras.layers.MaxPool2D(pool_size=3,strides=2),
    # 展开
    tf.keras.layers.Flatten(),
    # 全连接层
    tf.keras.layers.Dense(4096,activation="relu"),
    # 随机失活
    tf.keras.layers.Dropout(0.5),
    # 全连接层
    tf.keras.layers.Dense(4096, activation="relu"),
    # 随机失活
    tf.keras.layers.Dropout(0.5),
    # 输出层:
    tf.keras.layers.Dense(10,activation="softmax")
])

X = tf.random.uniform((1,227,227,1))
y = net(X)
net.summary()

P7 导入其思维导图

手写数字识别:

  1. 数据加载和处理 — 维度调整:N、H、W、C   尺寸调整: resize
  2.  模型训练  编译,compile    fit()
  3. 模型评估: evalute

VGGNet网络:

VGG-16和VGG-19 表示网络中卷积层和全连接层的个数

VGG网络代码:

# 1 VGG网络构建
import tensorflow as tf

#1.1 VGG块的构建
def vgg_block(num_conv,num_filters):
  # 序列模型
  blk = tf.keras.models.Sequential()
  # 遍历卷积层
  for _ in range(num_conv):
    # 设置卷积层
    blk.add(tf.keras.layers.Conv2D(num_filters,kernel_size=3,padding='same',activation="relu"))
  # 池化层
  blk.add(tf.keras.layers.MaxPooling2D(pool_size=2, strides=2))
  return blk

# 2 模型构建
def vgg(conv_arch):
  # 序列模型
  net = tf.keras.models.Sequential()
  # 生成卷积部分
  for (num_conv,num_filters) in conv_arch:
    net.add(vgg_block(num_conv,num_filters))
  # 全连接层
  net.add(tf.keras.models.Sequential([
      # 展评
      tf.keras.layers.Flatten(),
      # 全连接层
      tf.keras.layers.Dense(4096,activation="relu"),
      # 随机失活
      tf.keras.layers.Dropout(0.5),
      # 全连接层
      tf.keras.layers.Dense(4096,activation="relu"),
      # 随机失活
      tf.keras.layers.Dropout(0.5),
      # 输出层
      tf.keras.layers.Dense(10,activation="softmax")
  ]))
  return net

# 卷积块参数
conv_arch = ((2,64),(2,128),(3,256),(3,512),(3,512))

net = vgg(conv_arch)

X=tf.random.uniform((1,224,224,1))
y=net(X)
net.summary()

模型:

# 2、数据获取
import numpy as np
from tensorflow.keras.datasets import mnist
# 获取手写数字数据集
(train_images,train_labels),(test_images,test_labels) = mnist.load_data()
# 训练集数据维度的调整:N H W C
train_images = np.reshape(train_images,(train_images.shape[0],train_images.shape[1],train_images.shape[2],1))
# 测试集数据维度的调整:N H W C 
test_images = np.reshape(test_images,(test_images.shape[0],test_images.shape[1],test_images.shape[2],1))

# 定义两个方法随机抽取部分样本演示
# 获取训练数据
def get_train(size):
  # 随机生成要抽样的样本索引
  index = np.random.randint(0,np.shape(train_images)[0],size)
  # 将这些数据resize成22*227大小
  resized_images = tf.image.resize_with_pad(train_images[index],224,224)
  # 返回抽取的
  return resized_images.numpy(),train_labels[index]
# 获取测试集数据
def get_test(size):
  # 随机生成要抽样的样本的索引
  index = np.random.randint(0, np.shape(test_images)[0], size)  # 修正此处的拼写错误
  # 将这些数据resize成224*224大小
  resized_images = tf.image.resize_with_pad(test_images[index], 224, 224)  # 修正此处的变量名错误
  # 返回抽样的测试样本
  return resized_images.numpy(), test_labels[index]  # 修正此处的变量名错误

# 获取训练样本和测试样本
train_images,train_labels = get_train(256)
test_images,test_labels = get_test(128)

# 3 模型编译
# 指定优化器,损失函数和评价指标
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01,momentum=0.0)
net.compile(optimizer=optimizer,
            loss='sparse_categorical_crossentropy',
            metrics=['accuracy'])

# 4 模型训练:指定训练数据,batchsize,epoch,验证集
net.fit(train_images,train_labels,batch_size=128,epochs=3,verbose=1,validation_split=0.1)

# 5 模型评估
# 指定测试数据
net.evaluate(test_images,test_labels,verbose=1)

模型训练:

模型评估:

VGG: 证明使用小的卷积核:3*3也可以获得很好的精度

特点:

  • 使用的都是小尺寸的卷积核(3*3,padding=same,relu),相对于alexnet层数更多
  • 多个VGG块由卷积+Pooling完成

实现:

  • 构建VGG块
  • 将VGG块串联在一起,并加上全连接层来构建整个网络

GoogLeNet网络:

加深度的同时做了结构上,增加了网络的宽度

Inception

  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python机器学习图像分类是利用Python编程语言所提供的机器学习技术和图像处理算法来对图像进行分类的过程。 首先,我们需要准备一个图像分类的数据集。这个数据集可以包含许多不同类别的图像,如猫、狗、车等。每个图像都应该有一个标签,用于指示图像所属的类别。 然后,我们可以利用Python中的机器学习库,如scikit-learn或TensorFlow,来构建一个图像分类模型。这个模型可以是传统的机器学习模型,如支持向量机(SVM)或随机森林。也可以是深度学习模型,如卷积神经网络(CNN)。 接下来,我们需要将图像数据进行预处理,以便它可以被模型所接受。预处理步骤可以包括图像的大小调整、灰度处理、特征提取等。这些步骤旨在最大程度地提取图像中的有用信息,并减少无效的噪声。 然后,我们可以将预处理后的图像数据分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。 在训练过程中,模型将学习如何对不同类别的图像进行分类。学习过程的目标是最小化模型的损失函数,使其能够准确地预测图像的类别。 最后,我们可以使用测试集来评估模型的准确性和性能。通过比较模型预测的结果与真实标签,可以计算出模型的精确度、召回率等评估指标。 总而言之,Python机器学习图像分类是利用Python编程语言、机器学习技术和图像处理算法来构建一个能够准确分类图像的模型。它可以在许多领域中得到广泛应用,如人脸识别、物体检测等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Stuomasi_xiaoxin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值