开始记录学习深度学习的点点滴滴

深度学习图片分类实战学习

  • 前言
  • 一、深度学习
  • 二、使用步骤
    • 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])

注意事项

这里对文章进行总结:

  1. 参与训练的数据需要打乱顺序,注意shuffle=true
  2. 如果是2分类,采用binary_crossentropy和 sigmoid。
  3. 如果是多目标分类(超过3个)则采用categorical_crossentropy和softmax。同时对标签进行one-hot 编码。例如 y_train = keras.utils.to_categorical(y_train,3)

深度学习图片分类实战学习相关推荐

  1. 深度学习图片分类CNN模板

    构建一个字母ABC的手写识别网络, 要求给出算法误差收敛曲线,所给程序要有图片导入接口. 其中A,B,C都代表label,三个文件夹存在具体的图片.只要是这样类型的,直接套下面模板. import o ...

  2. 机器学习之短信、邮件、新闻分类实战学习

    文章目录 1.导入数据 1.1.读取数据"SMSSpamCollection" 1.2.确定研究对象 2.统计词频 2.1.文本向量化处理 2.2.查看词频 3.建模与评估 3.1 ...

  3. Python数据分析实战学习

    Python数据分析实战学习\displaystyle\boxed{Python数据分析实战学习}Python数据分析实战学习​ AprilJulyOctober2015AprilJulyOctobe ...

  4. 使用卷积神经网络进行图片分类 1

    卷积神经网络原理 一.实验介绍 1.1 实验内容 本课程将会先带你理解卷积神经网络的原理,了解卷积神经网络的一些特性.然后动手使用caffe深度学习框架训练一个卷积神经网络模型,并用训练好的模型进行图 ...

  5. 机器不学习:初识迁移学习

    机器不学习 jqbxx.com-专注机器学习,深度学习,自然语言处理,大数据,个性化推荐,搜索算法,知识图谱 虽然我不是专门研究迁移学习的,但是作为一个AI研究者,就如题图吴老师所说,迁移学习极为重要 ...

  6. 深度学习之自编码器(2)Fashion MNIST图片重建实战

    深度学习之自编码器(2)Fashion MNIST图片重建实战 1. Fashion MNIST数据集 2. 编码器 3. 解码器 4. 自编码器 5. 网络训练 6. 图片重建 完整代码  自编码器 ...

  7. keras提取模型中的某一层_Keras做图片分类(四):迁移学习--猫狗大战实战

    本项目数据集来自kaggle竞赛,地址: https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/data 数据的训练集放在train文 ...

  8. 动手深度学习13——计算机视觉:数据增广、图片分类

    文章目录 一.数据增广 1.1 为何进行数据增广? 1.2 常见图片增广方式 1.2.1 翻转 1.2.2 切割(裁剪) 1.2.3 改变颜色 1.2.4 综合使用 1.3 使用图像增广进行训练 1. ...

  9. 记录|深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天

    记录|深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天 1. 彩色图片分类效果图 数据集如下: 测试图1如下 训练/验证精确图如下: 优化后:测试图--打印预测标签: 优化后:测试图- ...

最新文章

  1. Opencv实现透视形变
  2. python装饰器原理-python装饰器的原理和使用
  3. Python 基础教程(第2版) 中文版+英文原版下载
  4. MySQL关系数据库
  5. crossplatform---Nodejs in Visual Studio Code 01.简单介绍Nodejs
  6. 快速排序--Python实现
  7. python 访问需要HTTP Basic Authentication认证的资源
  8. larvel php restful_Laravel教你简单写出专业的RestfulAPI
  9. 时间和空间复杂度概述【Java _demo版】
  10. mysql 实体类_Mysql生成实体类
  11. react本地储存_如何使用React和本地存储构建freeCodeCamp的配方框
  12. web前端开发面试题(答案)
  13. 斗地主AI算法——第一章の业务逻辑
  14. 200 行代码实现一个滑动验证码
  15. 电话机器人源码部署原理及技术难点
  16. 异数OS 开放式闭源继承人协议
  17. win8 查看和更换密钥方法
  18. 学习jQuery的感受
  19. 2015美国大学计算机科学专业排名,美国大学研究生计算机科学专业排名|2015年计算机科学专业排行榜(1/2)- 各国学校排名网...
  20. 通过three.js实现3d模型展示

热门文章

  1. 官方活动|最高可免费领60天会员时长
  2. JQuery学习04篇(层次选择器)
  3. 字符串的练习 统计字符串中大写,小写,数字的个数 29
  4. Android开机自动循环播放视频
  5. Android知识架构 · Java的编程思想
  6. 目标跟踪:Deepsort--卡尔曼滤波、匈牙利匹配、马氏距离、欧氏距离、级联匹配、reid
  7. 还在用手机搜题?懒人必备网页搜题插件来了
  8. 呼叫中心客服人员的秘密生活:同理心永远不会让你遭殃
  9. 武学大陆-为啥要学IT绝世武功
  10. python咋念_python怎么念