一、简介与安装
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、深度学习框架
深度学习框架是用于构建和训练深度神经网络的软件工具。它们提供了一系列的函数和工具,用于定义、优化和执行神经网络模型。以下是一些常见的深度学习框架:
-
TensorFlow:由Google开发的开源深度学习框架。它具有高度的灵活性和可扩展性,并支持在多个平台上进行部署。
-
PyTorch:由Facebook开发的开源深度学习框架。它具有动态计算图的特性,使得模型的定义和调试更加灵活和直观。
-
Keras:一个高级深度学习框架,可以运行在TensorFlow、Theano和CNTK等后端上。它提供了简单易用的API,使得构建和训练深度神经网络变得更加容易。
-
Caffe:一个由伯克利视觉与学习中心开发的深度学习框架。它主要用于计算机视觉任务,并具有高效的前向计算速度。
-
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)需要访问一个位于长路径中的文件,如果你的系统没有启用长路径支持,就会出现这种错误。以下是解决这个问题的方法:
- 打开“运行”窗口(按Win键+R键),然后输入
gpedit.msc
并按Enter键打开“本地组策略编辑器”。 - 在左侧窗格中,展开“计算机配置”然后点击“Windows设置”。
- 在右侧窗格中,点击“安全设置”,然后点击“本地策略”。
- 在下一个窗格中,点击“安全选项”。
- 在右侧窗格中,找到“用户账户:使用空密码的本地账户只允许进行控制台登录”策略,然后点击它,再选择“已禁用”。
- 重启你的计算机。
试了之后发现解决不了,根据网上信息可能需要手动创建缺失的文件或者重新安装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有什么区别和哪个好的问题,暂时没感觉出来。
下面是网上说的区别:
-
PyCharm是一款专门针对Python开发的IDE,而VS Code是一款通用的代码编辑器,支持多种编程语言。
-
PyCharm具有更强大的Python代码分析和调试功能,可以更好地支持Python开发工作。VS Code则更注重轻量级的代码编辑和快速开发。
-
PyCharm需要占用更多的系统资源,而VS Code则更轻量级,可以在资源受限的环境下运行。
-
PyCharm是商业软件,需要购买许可证才能使用全部功能,而VS Code是免费的开源软件。
-
PyCharm提供了更多的集成开发环境功能,例如版本控制、数据库管理等,而VS Code则更注重扩展性,可以通过插件实现各种功能扩展。
-
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()