cnn图像二分类 python_TensorFlow2基础:CNN图像分类
1. 导包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
2. 图像分类 fashion_mnist
数据处理
# 原始数据
(X_train_all, y_train_all),(X_test, y_test) =
tf.keras.datasets.fashion_mnist.load_data()
# 训练集、验证集拆分
X_train, X_valid, y_train, y_valid = train_test_split(X_train_all,
y_train_all, test_size=0.25)
# 数据标准化,你也可以用除以255的方式实现归一化
# 注意最后reshape中的1,代表图像只有一个channel,即当前图像是灰度图
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train.reshape(-1, 28 *
28)).reshape(-1, 28, 28, 1)
X_valid_scaled = scaler.transform(X_valid.reshape(-1, 28 * 28)).reshape(-1,
28, 28, 1)
X_test_scaled = scaler.transform(X_test.reshape(-1, 28 * 28)).reshape(-1,
28, 28, 1)
构建CNN模型
model = tf.keras.models.Sequential()
# 多个卷积层
model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=[5, 5],
padding="same", activation="relu", input_shape=(28, 28, 1)))
model.add(tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2))
model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=[5, 5],
padding="same", activation="relu"))
model.add(tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2))
# 将前面卷积层得出的多维数据转为一维
# 7和前面的kernel_size、padding、MaxPool2D有关
# Conv2D: 28*28 -> 28*28 (因为padding="same")
# MaxPool2D: 28*28 -> 14*14
# Conv2D: 14*14 -> 14*14 (因为padding="same")
# MaxPool2D: 14*14 -> 7*7
model.add(tf.keras.layers.Reshape(target_shape=(7 * 7 * 64,)))
# 传入全连接层
model.add(tf.keras.layers.Dense(1024, activation="relu"))
model.add(tf.keras.layers.Dense(10, activation="softmax"))
# compile
model.compile(loss = "sparse_categorical_crossentropy",
optimizer = "sgd",
metrics = ["accuracy"])
模型训练
callbacks = [
tf.keras.callbacks.EarlyStopping(min_delta=1e-3, patience=5)
]
history = model.fit(X_train_scaled, y_train, epochs=15,
validation_data=(X_valid_scaled, y_valid),
callbacks = callbacks)
Train on 50000 samples, validate on 10000 samples
Epoch 1/15
50000/50000 [==============================] - 17s 343us/sample - loss:
0.5707 - accuracy: 0.7965 - val_loss: 0.4631 - val_accuracy: 0.8323
Epoch 2/15
50000/50000 [==============================] - 13s 259us/sample - loss:
0.3728 - accuracy: 0.8669 - val_loss: 0.3573 - val_accuracy: 0.8738
...
Epoch 13/15
50000/50000 [==============================] - 12s 244us/sample - loss:
0.1625 - accuracy: 0.9407 - val_loss: 0.2489 - val_accuracy: 0.9112
Epoch 14/15
50000/50000 [==============================] - 12s 240us/sample - loss:
0.1522 - accuracy: 0.9451 - val_loss: 0.2584 - val_accuracy: 0.9104
Epoch 15/15
50000/50000 [==============================] - 12s 237us/sample - loss:
0.1424 - accuracy: 0.9500 - val_loss: 0.2521 - val_accuracy: 0.9114
作图
def plot_learning_curves(history):
pd.DataFrame(history.history).plot(figsize=(8, 5))
plt.grid(True)
#plt.gca().set_ylim(0, 1)
plt.show()
plot_learning_curves(history)
测试集评估准确率
model.evaluate(X_test_scaled, y_test)
[0.269884311157465, 0.9071]
可以看到使用CNN后,图像分类的准确率明显提升了。之前的模型是0.8747,现在是0.9071。
3. 图像分类 Dogs vs. Cats
3.1 原始数据
原始数据下载
Kaggle: https://www.kaggle.com/c/dogs-vs-cats/
百度网盘: https://pan.baidu.com/s/13hw4LK8ihR6-6-8mpjLKDA 提取码 dmp4
读取一张图片,并展示
image_string =
tf.io.read_file("C:/Users/Skey/Downloads/datasets/cat_vs_dog/train/cat.28.jpg")
image_decoded = tf.image.decode_jpeg(image_string)
plt.imshow(image_decoded)
3.2 利用Dataset加载图片
由于原始图片过多,我们不能将所有图片一次加载入内存。Tensorflow为我们提供了便利的Dataset
API,可以从硬盘中一批一批的加载数据,以用于训练。
处理本地图片路径与标签
# 训练数据的路径
train_dir = "C:/Users/Skey/Downloads/datasets/cat_vs_dog/train/"
train_filenames = [] # 所有图片的文件名
train_labels = [] # 所有图片的标签
for filename in os.listdir(train_dir):
train_filenames.append(train_dir + filename)
if (filename.startswith("cat")):
train_labels.append(0) # 将cat标记为0
else:
train_labels.append(1) # 将dog标记为1
# 数据随机拆分
郑州人流哪家医院做的好 http://www.csyhjlyy.com/
X_train, X_valid, y_train, y_valid = train_test_split(train_filenames,
train_labels, test_size=0.2)
定义一个解码图片的方法
def _decode_and_resize(filename, label):
image_string = tf.io.read_file(filename) # 读取图片
image_decoded = tf.image.decode_jpeg(image_string) # 解码
image_resized = tf.image.resize(image_decoded, [256, 256]) / 255.0 #
重置size,并归一化
return image_resized, label
定义 Dataset,用于加载图片数据
# 训练集
train_dataset = tf.data.Dataset.from_tensor_slices((train_filenames,
train_labels))
train_dataset = train_dataset.map(
map_func=_decode_and_resize, # 调用前面定义的方法,解析filename,转为特征和标签
num_parallel_calls=tf.data.experimental.AUTOTUNE)
train_dataset = train_dataset.shuffle(buffer_size=128) # 设置缓冲区大小
train_dataset = train_dataset.batch(32) # 每批数据的量
train_dataset = train_dataset.prefetch(tf.data.experimental.AUTOTUNE) #
启动预加载图片,也就是说CPU会提前从磁盘加载数据,不用等上一次训练完后再加载
# 验证集
valid_dataset = tf.data.Dataset.from_tensor_slices((valid_filenames,
valid_labels))
valid_dataset = valid_dataset.map(
map_func=_decode_and_resize,
num_parallel_calls=tf.data.experimental.AUTOTUNE)
valid_dataset = valid_dataset.batch(32)
3.3 构建CNN模型,并训练
构建模型与编译
model = tf.keras.Sequential([
# 卷积,32个filter(卷积核),每个大小为3*3,步长为1
tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=(256, 256,
3)),
# 池化,默认大小2*2,步长为2
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(32, 5, activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(2, activation='softmax')
])
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.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_2 (Conv2D) (None, 254, 254, 32) 896
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 127, 127, 32) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 123, 123, 32) 25632
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 61, 61, 32) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 119072) 0
_________________________________________________________________
dense_2 (Dense) (None, 64) 7620672
_________________________________________________________________
dense_3 (Dense) (None, 2) 130
=================================================================
Total params: 7,647,330
Trainable params: 7,647,330
Non-trainable params: 0
开始训练
model.fit(train_dataset, epochs=10, validation_data=valid_dataset)
由于数据量大,此处训练时间较久
需要注意的是此处打印的step,每个step指的是一个batch(例如32个样本一个batch)
模型评估
test_dataset = tf.data.Dataset.from_tensor_slices((valid_filenames,
valid_labels))
test_dataset = test_dataset.map(_decode_and_resize)
test_dataset = test_dataset.batch(32)
print(model.metrics_names)
print(model.evaluate(test_dataset))
cnn图像二分类 python_TensorFlow2基础:CNN图像分类相关推荐
- cnn图像二分类 python_人工智能Keras图像分类器(CNN卷积神经网络的图片识别篇)...
上期文章我们分享了人工智能Keras图像分类器(CNN卷积神经网络的图片识别的训练模型),本期我们使用预训练模型对图片进行识别:Keras CNN卷积神经网络模型训练 导入第三方库 from kera ...
- 基于CNN的海面舰船图像二分类
基于CNN的海面舰船图像二分类 1. 模型依赖的环境和硬件配置 Python3.8 Pillow==8.2.0 torch-1.5.1(cuda9.2) torchfile==0.1.0 torchv ...
- Python图像识别实战(四):搭建卷积神经网络进行图像二分类(附源码和实现效果)
前面我介绍了可视化的一些方法以及机器学习在预测方面的应用,分为分类问题(预测值是离散型)和回归问题(预测值是连续型)(具体见之前的文章). 从本期开始,我将做一个关于图像识别的系列文章,让读者慢慢理解 ...
- 支持向量机的近邻理解:图像二分类为例(1)
前言: 机器学习在是否保留原始样本的层面划分为两类:参数学习和非参数学习.参数学习使用相对固定框架,把样本分布通过训练的方式回归到一个使用参数描述的数学模型里面,最终使用的是归纳方法:非参数模型保留了 ...
- 【图像处理】——Python实现图像特征提取BP神经网络实现图像二分类
目录 一.图像特征提取 二.BP实现图像二分类 1.输入层.隐层.输出层结点个数设置 (1)one hot码(假设是n分类问题) (2)一个输出,输出层结点为1 一.图像特征提取 图像具有灰度特征.G ...
- 基于cnn的图像二分类算法(一)
本算法是基于tensorflow,使用python语言进行的一种图像分类算法,参考于谷歌的mnist手写识别,包括以下几个模块:图像读取,图像处理,图像增强.卷积神经网络部分包括:卷积层1,汇合层1( ...
- 基于SVM的图像二分类算法
本实验是用的python代码实现图像的二分类问题,我是在eclipse中搭建python环境. 一.数据集处理 我采用的是甜椒叶数据集(我忘了下载地址在哪里,我只用了一部分数据集),其中健康叶片有37 ...
- 支持向量机的近邻理解:图像二分类为例(2)
前言: 假设空间 一个古老的哲学原理:世界并不是以小包的形式来到我们面前,除非遍历整个空间,任何训练得到的模型都是过拟合的.面对学习问题,首先面对这一个空间的认知问题,对空间结构的认识来自于接口,而全 ...
- 经典网络vgg应用于 图像二分类的训练代码
1 目的:使用VGG16网络 进行对图片二分类 (不同插值方法的图片 纹理不同) vgg16 网络结构的连接 https://blog.csdn.net/weixin_44576543/articl ...
最新文章
- 科大讯飞与优刻得、寒武纪等联合设立合肥智能语音创新发展有限公司
- zabbix—安装agent客户端(linux版)
- Windows保护模式学习笔记(三)—— 长调用/短调用/调用门
- java集合框架03
- Echart在Openlayers的应用
- Django 中间件
- Swift之深入解析Xcode13对Swift对象生命周期的优化
- 怎么理解ubuntu中的软件包管理器apt和dpkg
- Mybatis多参数封装到一个类中模糊查询
- Rust 编程语言曝高危漏洞,可导致文件和目录遭删除
- 电脑上查看端口是否被占用
- unity 录制游戏内视频(1)
- 《惢客创业日记》2019.05.07(周二)永远匿名的红颜知己(四)
- PHP工具箱配置和下载
- CDR插件开发之Addon插件004 - VS2022开发环境简介及个性化配置
- 热敏打印机的工作原理
- AI新技术:利用神经网络对图片进行超级压缩
- 非常棒的口才训练方法
- my music / NightWish / Groove Coverage / DJ
- java无法下载jnlp_java-JNLP下载期间FileNotFoundException
热门文章
- 小白的奇幻数学课堂(part2)--敌人的敌人就是朋友,这其实就是负负得正法则
- scikit_learn中fit()/transform()/fit_transform()区别和联系
- oracle视图view看不出来主键,oracle - 使用主键创建视图
- SAP BTP 应用 mta.yaml 里的 sap-btp-project1-dest-content module
- 运行 ui5 serve 命令行报错的处理方法
- 如何找到 SAP Spartacus 里某个 Component TypeScript 编译后生成的 JavaScript 位置
- 关于自定义的登录机制在SAP Spartacus服务器端渲染(SSR)实施过程中遇到的问题
- 显示SAP Spartacus每个page slot使用的Angular Component uid
- SAP Spartacus HTTP拦截器Interceptor
- SAP Fiori Launchpad get role based page usages