深度学习图片分类实战学习
开始记录学习深度学习的点点滴滴
深度学习图片分类实战学习
- 前言
- 一、深度学习
- 二、使用步骤
- 1. 自建网络模型
- 2. 进行深度学习的学习迁移
- 注意事项
前言
随着人工智能的不断发展,这门技术也越来越重要,很多人都开启了学习人工智能,本人开始记录学习人工智能的点点滴滴。
一、深度学习
深度学习的概念在网上已经能够搜到很多内容了,这里主要介绍和记录以下相关可以实际运行的代码,对深度学习的实际操作进行深入理解,对出现的问题记录以下。我先从图像分类开始学习深度学习。
二、使用步骤
1. 自建网络模型
这里记录了第一个深度学习示例。
图片的搜索可以从深度学习的网站下载,这里我用scrapy爬虫爬取的。图片目录按照以下方式设置:
这里我的图片包括战斗机、直升飞机和舰船,其中战斗机文件名都为Fighter_X.jpg,直升飞机的文件名标识为Helicopter_X.jpg,舰船的飞机名标识为Ship_X.jpg。
1. 读取文件的代码如下:
import cv2
import numpy as np
import pandas as pd
import matplotlib.image as npimg
import matplotlib.pyplot as pltimport os
import random
import gctrain_dir = 'input/train' # 训练集数据
val_dir = 'input/test' # 验证集数据test_imgs = ['input/test/{}'.format(i) for i in os.listdir(val_dir)]
train_imgs = ['input/train/{}'.format(i) for i in os.listdir(train_dir)]random.shuffle(train_imgs) ###图片乱序,这对学习很重要。for ima in train_imgs[0:10]:img = npimg.imread(ima)imgplot = plt.imshow(img)plt.show()nrows = 224
ncoloumns = 224
channel = 3def read_and_process_image(list_imgs):X = []y = []for image in list_imgs:X.append(cv2.resize(cv2.imread(image,cv2.IMREAD_COLOR),(nrows,ncoloumns),interpolation=cv2.INTER_CUBIC))if 'Fighter' in image:y.append(0)elif 'Helicopter' in image:y.append(1)return X,yX,y = read_and_process_image(train_imgs)plt.figure(figsize=(20,10))columns = 5for i in range(columns):plt.subplot(5/columns+1,columns,i+1)plt.imshow(X[i])```from sklearn.model_selection import train_test_splitdel train_imgs
gc.collect()X = np.array(X)
y = np.array(y)print("Shape of train set:", X.shape)
print("Shape of label set:", y.shape)X_train, X_val, y_train, y_val = train_test_split(X,y, test_size=0.2, random_state=2)print("Shape of train images is:", X_train.shape)
print("Sahpe of validation images is:", X_val.shape)
print("Shape of train label is:", y_train.shape)
print("Shape of validation label is:", y_val.shape)del X
del y
gc.collect()ntrain = len(X_train)
nval = len(X_val)
2. 构建深度学习网络的代码如下:
from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing.image import img_to_array, load_img
import tensorflow as tfbatch_size = 32model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(150,150,3)))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Conv2D(64,(3,3),activation='relu'))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Conv2D(128,(3,3),activation='relu'))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Conv2D(128,(3,3),activation='relu'))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))model.summary()model.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc']) ####构建反向梯度
3. 进行训练和模型数据保存:
train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,)val_datagen = ImageDataGenerator(rescale=1./255)#y_train = keras.utils.to_categorical(y_train,3) ####由于这里是多目标分类,因此需要进行one-hot编码。
#y_val = keras.utils.to_categorical(y_val,3)train_datagen = train_datagen.flow(X_train,y_train,batch_size=batch_size)
val_datagen = val_datagen.flow(X_val,y_val,batch_size=batch_size)history = model.fit_generator(train_datagen,steps_per_epoch=ntrain,epochs=1,validation_data=val_datagen,validation_steps=nval)#Save the modelmodel.save_weights('model_wieghts.h5')
model.save('model_keras.h5')
4. 看图验证:
from keras.models import load_modelmodelTest = load_model('model_keras.h5')
random.shuffle(test_imgs)
X_test, y_test = read_and_process_image(test_imgs[0:10])
x = np.array(X_test)
test_datagen = ImageDataGenerator(rescale=1./255)i = 0
test_label = []
plt.figure(figsize=(30,20))
for batch in test_datagen.flow(x, batch_size=1):pred = modelTest.predict(batch)if pred > 0.5:test_label.append('Fighter')else:test_label.append('Helicopter')plt.subplot(5/columns + 1, columns, i + 1)plt.title ('This is a ' + test_label[i])imgplot = plt.imshow(batch[0])i += 1if i % 10 ==0:break
plt.show()
2. 进行深度学习的学习迁移
随着学习的深入,我们也学习了学习迁移,理论知识这里不多介绍。
图片的目录设置如下图:
1. 读取文件和数据处理里的代码如下:
import matplotlib.pyplot as pltimport os
import random
import gctrain_dir = 'input/train' # 训练集数据
val_dir = 'input/test' # 验证集数据
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing.image import img_to_array, load_img
from datetime import datetime
TIMESTAMP = "{0:%Y-%m-%dT%H-%M-%S/}".format(datetime.now())
from keras.callbacks import TensorBoard, ModelCheckpoint
batch_size = 32
from keras.utils import np_utils
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing.image import img_to_array, load_img
from datetime import datetime
TIMESTAMP = "{0:%Y-%m-%dT%H-%M-%S/}".format(datetime.now())
from keras.callbacks import TensorBoard, ModelCheckpoint
batch_size = 32nrows = 224
ncoloumns = 224
channel = 3train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True)val_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory(train_dir,target_size=(224, 224),batch_size=batch_size,class_mode='categorical',shuffle=True,seed = 12)validation_generator = val_datagen.flow_from_directory(val_dir ,target_size=(224, 224),batch_size=batch_size,class_mode='categorical',shuffle=False,seed=13)
2. 构建迁移网络代码如下:
import keras
from keras import Model
from keras_squeezenet import SqueezeNet
from keras.callbacks import TensorBoard, ModelCheckpoint
from keras.layers import Flatten, Dense, Dropout, GlobalAveragePooling2D
from keras.models import load_model
from keras.preprocessing import image
from PIL import ImageFile
import numpy as np
import tensorflow as tf
from keras.optimizers import SGD
from keras import optimizers
from tensorflow.keras.applications.vgg16 import VGG16, preprocess_inputbase_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))classes = sorted([o for o in os.listdir(train_dir)]) # 根据文件名分类# x = base_model.output
x = base_model.output # 自定义网络
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
predictions = Dense(3, activation='softmax')(x)
model = Model(base_model.input, predictions) # 新网络=预训练网络+自定义网络model.summary()
model.compile(optimizer=optimizers.RMSprop(lr=0.0001),loss='categorical_crossentropy', metrics=['accuracy'])
3. 运行代码如下:
for layer in base_model.layers:layer.trainable = False
model.fit_generator(train_generator,steps_per_epoch=85,epochs=10,validation_data=validation_generator,validation_steps=10)
validation_data=(X_val, y_val))
model.save_weights('model_wieghts.h5')
model.save('model_keras.h5')
4. 查看训练结果代码如下:
img = image.load_img('./input/train/Ship_85.jpg', target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
res = model.predict(x)
plt.imshow(img)
print(np.argmax(res, axis=1)[0])
注意事项
这里对文章进行总结:
- 参与训练的数据需要打乱顺序,注意shuffle=true
- 如果是2分类,采用binary_crossentropy和 sigmoid。
- 如果是多目标分类(超过3个)则采用categorical_crossentropy和softmax。同时对标签进行one-hot 编码。例如 y_train = keras.utils.to_categorical(y_train,3)
深度学习图片分类实战学习相关推荐
- 深度学习图片分类CNN模板
构建一个字母ABC的手写识别网络, 要求给出算法误差收敛曲线,所给程序要有图片导入接口. 其中A,B,C都代表label,三个文件夹存在具体的图片.只要是这样类型的,直接套下面模板. import o ...
- 机器学习之短信、邮件、新闻分类实战学习
文章目录 1.导入数据 1.1.读取数据"SMSSpamCollection" 1.2.确定研究对象 2.统计词频 2.1.文本向量化处理 2.2.查看词频 3.建模与评估 3.1 ...
- Python数据分析实战学习
Python数据分析实战学习\displaystyle\boxed{Python数据分析实战学习}Python数据分析实战学习 AprilJulyOctober2015AprilJulyOctobe ...
- 使用卷积神经网络进行图片分类 1
卷积神经网络原理 一.实验介绍 1.1 实验内容 本课程将会先带你理解卷积神经网络的原理,了解卷积神经网络的一些特性.然后动手使用caffe深度学习框架训练一个卷积神经网络模型,并用训练好的模型进行图 ...
- 机器不学习:初识迁移学习
机器不学习 jqbxx.com-专注机器学习,深度学习,自然语言处理,大数据,个性化推荐,搜索算法,知识图谱 虽然我不是专门研究迁移学习的,但是作为一个AI研究者,就如题图吴老师所说,迁移学习极为重要 ...
- 深度学习之自编码器(2)Fashion MNIST图片重建实战
深度学习之自编码器(2)Fashion MNIST图片重建实战 1. Fashion MNIST数据集 2. 编码器 3. 解码器 4. 自编码器 5. 网络训练 6. 图片重建 完整代码 自编码器 ...
- keras提取模型中的某一层_Keras做图片分类(四):迁移学习--猫狗大战实战
本项目数据集来自kaggle竞赛,地址: https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/data 数据的训练集放在train文 ...
- 动手深度学习13——计算机视觉:数据增广、图片分类
文章目录 一.数据增广 1.1 为何进行数据增广? 1.2 常见图片增广方式 1.2.1 翻转 1.2.2 切割(裁剪) 1.2.3 改变颜色 1.2.4 综合使用 1.3 使用图像增广进行训练 1. ...
- 记录|深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天
记录|深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天 1. 彩色图片分类效果图 数据集如下: 测试图1如下 训练/验证精确图如下: 优化后:测试图--打印预测标签: 优化后:测试图- ...
最新文章
- Opencv实现透视形变
- python装饰器原理-python装饰器的原理和使用
- Python 基础教程(第2版) 中文版+英文原版下载
- MySQL关系数据库
- crossplatform---Nodejs in Visual Studio Code 01.简单介绍Nodejs
- 快速排序--Python实现
- python 访问需要HTTP Basic Authentication认证的资源
- larvel php restful_Laravel教你简单写出专业的RestfulAPI
- 时间和空间复杂度概述【Java _demo版】
- mysql 实体类_Mysql生成实体类
- react本地储存_如何使用React和本地存储构建freeCodeCamp的配方框
- web前端开发面试题(答案)
- 斗地主AI算法——第一章の业务逻辑
- 200 行代码实现一个滑动验证码
- 电话机器人源码部署原理及技术难点
- 异数OS 开放式闭源继承人协议
- win8 查看和更换密钥方法
- 学习jQuery的感受
- 2015美国大学计算机科学专业排名,美国大学研究生计算机科学专业排名|2015年计算机科学专业排行榜(1/2)- 各国学校排名网...
- 通过three.js实现3d模型展示