dnn学习记录(5)——keras实战

一、简介与安装

1、keras介绍

        Keras是一个用于构建和训练深度学习模型的开源神经网络库。它是基于Python编写的,可以运行在多种深度学习框架上,如TensorFlow、Theano和CNTK。     

        keras和tensorflow的区别:Keras是一个高级API,提供了简洁易用的接口来构建神经网络模型。它的设计目标是使模型的构建和训练变得简单快捷。TensorFlow则提供了更底层的API,可以更精细地控制模型的构建和训练过程。TensorFlow提供了更大的灵活性,可以进行更多的底层操作和自定义。它适用于需要更多控制权和灵活性的任务。而Keras则更适用于快速原型设计和简单的模型构建。TensorFlow是一个非常受欢迎的深度学习框架,拥有庞大的社区支持和生态系统。它有大量的文档、教程和示例代码可供参考。Keras作为TensorFlow的一个高级API,也受到了广泛的支持,但相对于TensorFlow来说,社区规模较小。Keras可以在多个深度学习框架上运行,包括TensorFlow、Theano和CNTK。但从TensorFlow 2.0版本开始,Keras已经成为TensorFlow的官方高级API,并且与TensorFlow更加紧密地集成在一起。

   2、深度学习框架

        深度学习框架是用于构建和训练深度神经网络的软件工具。它们提供了一系列的函数和工具,用于定义、优化和执行神经网络模型。以下是一些常见的深度学习框架:

  1. TensorFlow:由Google开发的开源深度学习框架。它具有高度的灵活性和可扩展性,并支持在多个平台上进行部署。

  2. PyTorch:由Facebook开发的开源深度学习框架。它具有动态计算图的特性,使得模型的定义和调试更加灵活和直观。

  3. Keras:一个高级深度学习框架,可以运行在TensorFlow、Theano和CNTK等后端上。它提供了简单易用的API,使得构建和训练深度神经网络变得更加容易。

  4. Caffe:一个由伯克利视觉与学习中心开发的深度学习框架。它主要用于计算机视觉任务,并具有高效的前向计算速度。

  5. MXNet:一个由亚马逊开发的开源深度学习框架。它支持多种编程语言和多种硬件平台,并具有高效的分布式计算能力。

这些框架各有特点,选择合适的框架取决于具体的应用需求、开发经验和硬件平台等因素。

3、安装流程

        Keras和TensorFlow都可以通过pip安装。以下是安装步骤:

        安装TensorFlow:

pip install tensorflow

        安装Keras:

pip install keras

        如果您希望使用GPU进行训练,还需要安装GPU版本的TensorFlow和相应的CUDA和cuDNN库。

        要用到科学上网,安装keras要。

        然后我出现了下面这个问题。

        这个问题似乎是因为你的系统不支持Windows长路径,导致安装Python包时出现错误。Windows长路径支持是Windows 10的一项新特性,它允许文件路径的最大长度增加到32767个字符。你正在尝试安装的包(看起来是TensorFlow)需要访问一个位于长路径中的文件,如果你的系统没有启用长路径支持,就会出现这种错误。以下是解决这个问题的方法:

  1. 打开“运行”窗口(按Win键+R键),然后输入gpedit.msc并按Enter键打开“本地组策略编辑器”。
  2. 在左侧窗格中,展开“计算机配置”然后点击“Windows设置”。
  3. 在右侧窗格中,点击“安全设置”,然后点击“本地策略”。
  4. 在下一个窗格中,点击“安全选项”。
  5. 在右侧窗格中,找到“用户账户:使用空密码的本地账户只允许进行控制台登录”策略,然后点击它,再选择“已禁用”。
  6. 重启你的计算机。

        试了之后发现解决不了,根据网上信息可能需要手动创建缺失的文件或者重新安装Python和TensorFlow。

        根据tensorflow中文网,tensorflow和python版本之间要对应,我的python是3.10版本,所以决定重新安装。在 Windows 环境中从源代码构建  |  TensorFlow (google.cn)

系统要求

  • Python 3.6–3.9
    • 若要支持 Python 3.9,需要使用 TensorFlow 2.5 或更高版本。
    • 若要支持 Python 3.8,需要使用 TensorFlow 2.2 或更高版本。
  • pip 19.0 或更高版本(需要 manylinux2010 支持)
  • Ubuntu 16.04 或更高版本(64 位)
  • macOS 10.12.6 (Sierra) 或更高版本(64 位)(不支持 GPU)
    • macOS 要求使用 pip 20.3 或更高版本
  • Windows 7 或更高版本(64 位)
  • GPU 支持需要使用支持 CUDA® 的卡(适用于 Ubuntu 和 Windows)

        所以根据要求我安装了python3.8

4、虚拟环境

        这里是后面加上的,发现不同python对应不同tensorflow,然后主环境只能配置一套环境,但是我们有时又需要其它版本的代码,这个时候就需要用到虚拟环境。

        虚拟环境方面,Python的两种主流工具是pipenv和conda

        Pipenv是Python的官方推荐包管理器pip的包装,它提供了一种更方便的方式来管理项目的依赖性,并且它具有更好的可配置性和可操作性。使用pipenv,你可以更轻松地在项目之间切换,并确保项目的依赖关系得到满足。

        然而,如果你需要创建和管理多个Python环境,并且每个环境都有不同的依赖关系,那么conda可能更适合你。Conda可以轻松地创建和管理多个Python环境,并且它具有一个强大的包管理系统,可以让你轻松地安装、更新和卸载Python包。

        因此,如果你只需要一个Python环境,并且希望用pip管理依赖,那么pipenv就足够了。如果你需要更多的Python环境,或者你需要更灵活的环境管理功能,那么conda可能更适合你。

1)conda

        conda是一个配置隔离python环境的工具

        因为有些时候我们需要不同版本的python或不同版本的pip模块(比如你需要跑两个从github上下下来的代码,他们的tensorflow版本一个要求1.0一个要求2.0)

        conda既可以实现pip模块不同版本共存,也可以实现python不同版本共存

        conda只是一个工具,它有两种发行版,分别是Anaconda和Miniconda

                anaconda是一个大而全的工具集合,包括了非常多常用的pip模块(如numpy、pandas、scipy、matplotlib等),它还有图形化的管理工具等

                miniconda是一个单纯的conda工具,仅自带极少的python必要的包,干净纯粹,可以按照自己的需求构建任意环境

        miniconda比anaconda小非常多,可以实现全部日常需求,只不过需要自己动手

        出处:作者:济北周南 https://www.bilibili.com/read/cv8956636/ 出处:bilibili

2)安装anaconda

关于conda环境的配置,看这一篇就够了 - 哔哩哔哩 (bilibili.com)可以根据这篇文章来安装。

3)conda简单操作

        然后就是正常的使用,默认conda会是base环境,你当然可以在这里装任何你需要的包,如果你想要创建多个隔离的虚拟环境,你还需要掌握conda环境的创建和切换

创建环境

        一般我们都是用名字进行创建,执行 conda create -n 你想要的名字 python 即可创建

        conda的命令都以conda开头,然后create表示创建环境,然后 -n 表示要给环境取个名字,后边空格一下跟上名字就好了,然后红色部分的python是要安装的模块的名字,这里只装了一个python,还可以指定版本,比如python=3.8,如果还想装别的,可以继续往后跟

        示例:conda create -n tf python=3.8 tensorflow=2.2

        这样,你就得到了一个名叫tf包含python和tensorflow两个包的conda环境

查看环境

        你可以执行 conda info -e 来查看所有环境,比如我的是这样的:

        base里的那个*表示的是当前环境是它

激活(切换)环境

        创建好了之后,我们就可以执行命令通过名字来激活指定的环境,比如我可以执行:

        conda activate BTSer 来切换到我这个环境

        如果你刚才跟着做了,你可以通过 conda activate tf 来切换到你的tensorflow环境在环境中安装模块

        安装前要确认一下,当前是否在你想要的环境中,如果没有先切换一下,省得安装到错误的环境中去了。确认无误后,执行 conda install 模块名 即可安装(比如 conda install scipy)

删除环境

如果你不想要某个环境了,可以通过 conda remove -n 环境名 --all 来删除这个环境

退出环境

conda deactivate

4)创建自己的虚拟环境

conda info -e

先查看虚拟环境

再创建python=3.8 的虚拟环境

这里因为开了梯子,以为下载都需要梯子,关了就没事了,因为没有按照那篇文章找镜像。

再激活

再安装tensorflow=2.3(2.2报错没有找到),cudatollkit=10.1 cudnn

5、开发环境

        在开发环境上我选择用pycharm,PyCharm是一款由JetBrains开发的Python集成开发环境(IDE),它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和测试Python代码。

        至于VScode和Pycharm有什么区别和哪个好的问题,暂时没感觉出来。

        下面是网上说的区别:

  1. PyCharm是一款专门针对Python开发的IDE,而VS Code是一款通用的代码编辑器,支持多种编程语言。

  2. PyCharm具有更强大的Python代码分析和调试功能,可以更好地支持Python开发工作。VS Code则更注重轻量级的代码编辑和快速开发。

  3. PyCharm需要占用更多的系统资源,而VS Code则更轻量级,可以在资源受限的环境下运行。

  4. PyCharm是商业软件,需要购买许可证才能使用全部功能,而VS Code是免费的开源软件。

  5. PyCharm提供了更多的集成开发环境功能,例如版本控制、数据库管理等,而VS Code则更注重扩展性,可以通过插件实现各种功能扩展。

  6. PyCharm的界面更为复杂,需要一定时间的学习和适应,而VS Code则更为简洁易用。

二、训练自己的数据集整体流程

1、准备好数据集

        在同一目录下建立一个单独的文件夹,将自己的数据集存放好

2、数据加载和预处理

1)导入工具包

import matplotlib
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from keras.models import Sequential
from keras.layers import Dropout
from keras.layers.core import Dense
from keras.optimizers import SGD
from keras import initializers
from keras import regularizers
from myutils import utils_paths
import matplotlib.pyplot as plt
import numpy as np
import argparse    #argparse是一个python模块,用途是:命令行选项、参数和子命令的解释
import random
import pickle
import cv2
import os

2)输入参数 

ap = argparse.ArgumentParser()    #将ArgumentParser 对象实例化为 ap
ap.add_argument("-d","--dataset",required=True,
                help="path to input dataset of images")    #帮助字符串将在终端中提供附加信息
ap.add_argument("-m","--model",required=True,
                help="path to output trained model")
ap.add_argument("-l","--label-bin", required=True,
                help="path to output label binarizer")
ap.add_argument("-p","--plot", required=True,
                help="path to output accuracy/loss plot")
args = vars(ap.parse_args())

print("[INFO] 开始读取数据")
data = []
labels = []

3)拿到图像路径

imagePaths = sorted(list(utils_paths.list_images(args["dataset"])))    #获取图片路径
random.seed(42)    #随机种子
random.shuffle(imagePaths)    #打乱顺序

4)遍历读取数据

#遍历读取数据
for imagePath in imagePaths:

    #读取图像数据,由于使用神经网络,需要给定为一维
    image = cv2.imread(imagePath)
    image = cv2.resize(image,(32,32)).flatten() #flatten是拉长操作,变成一维
    data.append(image)  #数据传入data
    
    #读取标签
    label = imagePath.split(os.path.sep)[-2]
    labels.append(label)

# scale图像数据
data = np.array(data, dtype="float") / 255.0    #归一化
labels = np.array(labels)

3、搭建网络模型

1)数据集切分

(trainX, testX, trainY, testY) = train_test_split(data,
                                                  labels, test_size=0.25, random_state=42)

2)标签转换

#转换标签,one-hot格式
lb = LabelBinarizer()   #
trainY = lb.fit_transform(trainY)
testY = Ib.transform(testY)

3)网络模型

https://keras.io/

#网络模型结构:3072-512-256-3
model = Sequential()
# kernel regularizer=regularizers.12(0.01)
# keras.initializers.TruncatedNormal(mean=0.0,stddev-0.05,seed=None)
# initializers.random normal
# model.add(Dropout(0.8)
model.add(Dense(512,input_shape=(3072,),activation="relu"))
model.add(Dense(256,activation="relu",))
model.add(Dense(len(lb.classes_),activation="softmax",))

#初始化参数
INIT_LR = 0.01
EPOCHS = 200
#给定损失函数和评估方法print(”[INFO] 准备训练网络...")opt = SGD(Ir=INIT LR)

4)给定损失函数和评估方法

#给定损失函数和评估方注
print("[INFO] 准备训练网络...")
opt = SGD(lr=INIT_LR)
model.compile(loss="categorical crossentropy", optimizer=opt,
              metrics=["accuracy"])

4、训练模型

#训练网络模型
H = model.fit(trainX,trainY, validation_data=(testX, testY),
              epochs=EPOCHS,batch_size=32)
#测试网络模型
print("[INFO] 正在评估模型")
predictions = model.predict(testX,batch_size=32)
print(classification_report(testY.argmax(axis=1),predictions.argmax(axis=1),target_names=lb.classes_))
#当训练完成时,绘制结果曲线
N = np.arange(0,EPOCHS)
plt.style.use("qqplot")
plt.figure()
plt.plot(N,H.history["loss"], label="train loss")
plt.plot(N,H.history["val loss"], label="val loss")
plt.plot(N,H.history["acc"], label="train acc")
plt.plot(N,H.history["val acc"],label="val acc")
plt.title("Training Loss and Accuracy (Simple NN)")
plt.xlabel("Epoch #")
plt.ylabel("Loss/Accuracy")
plt.legend()
plt.savefig(args["plot"])

#保存模型到本地
print("[INFO] 正在保存模型")
model.save(args["model"])
f = open(args["label bin"],"wb")
f.write(pickle.dumps(lb))
f.close()

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值