0%

Intro

本篇主要讲述笔者进行深度学习项目训练时的简单经验,重点为:

在Anaconda中搭建可使用的Tensorflow-GPU环境;

笔者进行简单训练的测试和成功步骤经验(新手向)(目前主要使用U-Net模型,后续可能有更多( ̄︶ ̄)↗ )

环境搭建

前注:

Tensorflow使用独显或集显GPU训练均需CUDA和cuDNN,若使用独显请确保驱动完备;

笔者在conda进行安装,很好用,推荐此环境(需先安装Anaconda,打开Anaconda Prompt即可);

网上教程很多,但其实可以没那么麻烦,跟着下面步骤一步一步来就没毛。

  1. 创建虚拟环境并激活(其中env可改成自己希望的环境名)

    1
    2
    conda create -n env python=3.10 -y
    conda activate env

​ 之后目录前应更变为你激活的环境名,如(env) C:\Users>

  1. 安装版本匹配的CUDA和cuDNN

    1
    conda install -c conda-forge cudatoolkit=11.2 cudnn=8.1.0

    过程中若询问是否继续,选择是(y)

    若频繁卡顿出错,可选择清华镜像源下载:

    1
    2
    3
    4
    conda install cudatoolkit=11.2 cudnn=8.1.0 \
    -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main \
    -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free \
    -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
  2. 安装版本匹配的numpy

    1
    pip install numpy==1.26.4
  3. 安装版本匹配的Tensorflow

    1
    python -m pip install "tensorflow<2.11"
  4. 验证

    1
    2
    3
    python -c "import tensorflow as tf; print('TF version:', tf.__version__)"
    python -c "import tensorflow as tf; print('GPU Available:', tf.config.list_physical_devices('GPU'))"
    python -c "import tensorflow as tf; print('Built with CUDA:', tf.test.is_built_with_cuda())"

    若输出类似:

    TF version: 2.11.0
    GPU Available: [PhysicalDevice(name=’/physical_device:GPU:0’, device_type=’GPU’)]
    Built with CUDA: True

    则为成功。

后注:

  • 若已有某些错误(如没删干净/没下完整),不必执着于删除再下载,直接创建新环境即可;
  • 尽量选择网络通畅的环境运行,若下载CUDA/cuDNN/TF时耗时过长或频繁出错,很可能是网络问题。实测下载三样东西总耗时不超过10分钟;
  • 配置环境时最大的问题其实是版本问题,具体可参考官方文档,指路从源代码构建 | TensorFlow

简易训练(VS Code based)

打开VS Code,创建python文件。

前置以下代码赋能TensorflowGPU训练:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import os, h5py, numpy as np, tensorflow as tf, matplotlib.pyplot as plt

from tensorflow.keras.models import Model

from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
# 以上为库的导入
os.environ['TF_XLA_FLAGS'] = '--tf_xla_enable_xla_devices'

os.environ['CUDA_VISIBLE_DEVICES'] = "0"
# 关键在上面这行:0为用第一块GPU(一般是集显),1为用第二块GPU(一般是独显)
gpus = tf.config.experimental.list_physical_devices('GPU')

if gpus:

tf.config.experimental.set_memory_growth(gpus[0], True)
# 这里的0不用改(因为只是list里的第0个)

之后写入自己的模型训练全过程即可,注意运行时选择我们刚刚搭建好的GPU支持的kernel,一般在右上角或运行时进行选择。若提示需下载kernel,下载即可。kernel名称即为我们自定义的env。

在此附上笔者项目思路:分为数据导入-模型训练-预测结果-画图分析四个步骤,笔者采用U-Net模型,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def unet(input_shape=(52, 36, 5), n_base=64):
def conv_block(x, n):
x = Conv2D(n, 3, activation='relu', padding='same')(x)
x = Conv2D(n, 3, activation='relu', padding='same')(x)
return x

inp = Input(input_shape)
c1 = conv_block(inp, n_base) # 52×36
p1 = MaxPooling2D()(c1) # 26×18
c2 = conv_block(p1, n_base*2) # 26×18
p2 = MaxPooling2D()(c2) # 13×9
c3 = conv_block(p2, n_base*4) # bottleneck 13×9
u4 = UpSampling2D()(c3) # 26×18
u4 = concatenate([u4, c2])
c4 = conv_block(u4, n_base*2)
u5 = UpSampling2D()(c4) # 52×36
u5 = concatenate([u5, c1])
c5 = conv_block(u5, n_base)
out = Conv2D(1, 1, activation='linear')(c5)
return Model(inp, out)

model = unet()

U-Net模型是一个下采样+上采样的过程,关键在于对于多通道数据提取多尺度特征。本代码中将最优模型存储以便后续测试。

训练过成输出样例:

92/92 - 10s - loss: 1.4912e-04 - mae: 0.0027 - val_loss: 1.7216e-04 - val_mae: 0.0028 - lr: 1.0000e-06 - 10s/epoch - 105ms/step Epoch 145/200

可看到损失、用时等信息。一般来说GPU训练时间远低于CPU,以笔者为例,CPU用时1-2min一轮,GPU仅用时10s。

训练完成后即可用生成的模型进行预测,示例代码:

1
y_pred = model.predict(x_test, batch_size=64, verbose=1)

最后保存预测结果并进行误差计算或画图分析即可φ(゜▽゜*)♪


笔者训练项目简单,只是基础的模型训练中的一种方法,以作参考,欢迎指正沟通(指路主页E-Mail~)

小时候总觉得环境问题很无聊,与生活关联太远。然而直到这个夏天我才意识到解决全球变暖问题和给我的电脑装个新硬盘一样重要,都十分关乎我的生命。然而1T的硬盘很快就装好了,给硬盘贴散热片却能纠缠我很久,如同解决全球变暖问题一样。


《欢乐颂》

我想我已经见过无数自己和别人的悲欢离合、阴晴圆缺。而在这些事件之中,幸福的时刻却屈指可数。我十分悲痛地发现,人们似乎对美好常常本能地忽略。譬如在人与人的交往之中,大家往往把不愉快的相处记得久远,回忆起这段关系时第一时间便会想到这些不快,从而认为这段关系不太好。然而很多时候,温暖和谐才是常态,人们却总忽视这些常态。人与人之间或许应该多一些善意和对于爱的捕捉。

我意识到,很多时候用真诚的襟怀帮助别人根本不会对自己造成什么负面影响,但这些小小的举动却可能给人世间添上几分美好。我为过去许多时候仅仅因为懒惰和自私做出的坏决定而忏悔,并至少在此刻坚定多分出我的心给我爱的人一些。事实上,抛开一切,这也可能让我快乐许多。

“幸福和爱”

事实上,每每翻看过去不同时段我对于爱或幸福的思考和记录,感受总有不同。我清楚记得某些时候的甜蜜且的确回味无穷,然而也感受到某些因时间而截然相反的心绪。有时我会怀疑,既然存在未来伤悲的结局,那么是否还应该记录当下的美呢?然而思来想去,于我而言,若对于爱的感受记录有失偏颇,对任何时刻的我大概都是不公平的。我实在太需要爱的感受,就算是好梦都愿意一字一句地铺陈在记忆的镌刻录中。若是未来感到难过,那也只是外物之因,全然不可能是我记录的问题。

而这实在也没有什么关系,拯救任何时刻的自己都是拯救世界。

行云流水

我总感觉自己一直在变,无论是性格、追求,还是什么别的。我总觉得自己太不稳定,因而对任何事情常怀戒备。但我也惊奇地发现,似乎有些东西没有变。比如我喜欢摆弄的音乐,爱好的特定食物,以及永远迷雾一般的未来。我清楚知道自己有多么多和严重的问题,可是也常常想自己可以拥有幸福。这一切的一切,我有些忘记过去的思虑,并不确定当下的选择,更难预测未来的变化。很难说我真的因为什么而快乐,或者我真的因为某些苦痛而一蹶不振。万物总在改变,而我对世界的观测也从未停止和确定。

这种时候,我竟奇迹般感到安心。


多愁善感作为我性格的重要部分,是很好的事情。翻看曾经拍摄的视频,我的注意力却总从人物移到漂亮的烟霞,似乎看着那些东西就能感受到当时的气候和温湿,于是能够回想起感伤的碎片。夏天在所有地方都那么炎热——尽管我已厌倦打下这样的字眼。然而不同地方的夏天实在太过不同,直至现在我都感到如梦似幻。朋友说我这年经历的确不少,虽然现在才不到八月。

其实标题大抵应当叫做热域,但我实在讨厌热,所以我想留一个域就好了。

盖乐世

在这夏秋交替的季节,我因为臭美穿着短裙短袖坐在操场上。晚上七点的风已经被冻住,在我浑身上下滚动,我感到寒冷,却无能为力。抬头时候,漫天都是星星,小小的,白色的光点散落在整个天空上,可我左右环顾,找遍了天空也没有看见月亮。

即使毕业多年,喜欢经常逛高中的贴吧,想探索这座学校如今的光景几何。其实贴吧似乎也并不活跃,但我喜欢在每一条骂这座学校的帖子下留下自己的网名和才华。每次有人回复我,也会莫名其妙暗喜、会心一笑,似乎只有这样,才能证明我曾经来过。我迫切地想知道那些老师、主任、校长现在如何,这个过程总是让我有一种老去之人努力回望过去记忆的感觉。

我想,我理应是个夜行动物。白日光景常让我开怀,然而只有夜晚能让我安定。和任何人出去对我来说都是耗电的过程,只有自己呆在自己的小空间才能充电。我不仅讨厌人类,还讨厌一切生物。冬天马上就要来了,我似乎成为了诅咒的一部分,回到了抱怨心脏僵化的日子。但我知道我所有的回忆都在美化一切东西,无论如何我再也不想回到那段每天因为成绩而郁郁寡欢的时光,今天去逛了万达,这是一件很开心的事,叙述出来似乎也很普通,但若放在高中一定是我好几个月都惊天动地的大事,多可笑啊。我讨厌这样的夸张化叙事,什么高考是改变一辈子的大事、高考可以改变一个人…无论如何这样的论点应该由每个人自己去体会,而不是被社会训导如此。

似乎变成了一个不停回忆过去、感慨人生的失败者,企图回到才华横溢而百家争鸣的鼎盛时期,想要拥有最纯粹的爱,不愿意面对如今灰色忙碌又虚浮的一切生活和感情。我不敢活在当下,我只能不停地翻找记忆盒子里的美好和幻想未来的安宁幸福。各种打击都能把我打倒,把我打成没有感情的、心脏被冻住又碎掉的失败者。我需要很多很多爱。

我用的最长时间的一部智能手机是三星盖乐世。我还记得它经常发烫的机身,以及开机时好看的字体写出“Galaxy”。我记得我把它所有的智能功能发挥到极致,以及落后手机独有的圆耳机孔。我知道,“Galaxy”是银河的意思。我想再一次看看星星,对应出北斗七星、火星、射手座…以及郊外淡淡的银河。什么时候能安心地看一次流星雨呢?

SEASIDE SUMMER

五月底又是否算是夏天呢?我不得而知。天气到目前为止也没有超过30摄氏度,或许这就是海边的初夏吧。早八的时候一楼的教室有些阴冷,中午在食堂周边又炎热且暴晒。晚上回宿舍时,夜幕又把人间变得静谧而寒凉。嘴上总总抱怨这此地的气候变幻无常,细细怀想,此等感觉,又何尝不是一种新奇的体验呢。费了九牛二虎之力死乞白赖着也要来北方,为的又是什么呢——不过是这一些与南方截然相反的瞬间罢了。

有的时候我觉得我的人生是我“迄今为止最伟大的作品”。有的时候却又觉得悲哀,觉得自己不过沧海一粟、泯然众人。而夏天这样一个听起来就十分热烈和充满奇迹的季节,好像也理所应当地集结了我许许多多色彩明艳的记忆。《哈利·波特》里,女贞路的夏天总是故事启动的镜头。而在我的人生作品里,大约也有许多属于夏天的篇章。就像我还是会回忆起我每一个梦开始的地方,无论是小学英语比赛时在漂亮的比赛场地闲逛吟赏烟霞,初中操场上望着不远处蓝莹莹的高楼大厦思绪飘飞,还是高中周五下午的班会课堂上看着讲台上的女生打出“人工智能时代”时交映着晴朗的窗外。而这些夏天也都一去不复返了,像脆弱的蝴蝶一样,随着我所有的幻梦一起飘碎在了现实的角落。(或许也并没有碎,只是“不攻击五秒后隐身”罢了…)

我时常在想,现在经历的一切,无论是我觉得无聊的还是太快的、有趣的还是可恨的,数年以后,或许也会有些成为我回忆的高亮。而有意思的是,在真正开始回忆之前,没有人会知道哪些碎片将会留存,哪些碎片将会消逝。就像刚入学时我一个人去看的那场《前任四》,当时还吃了一顿美味的kfc,一定也觉得这是独一无二的难忘回忆,可现在想来却模糊得不成样子了。这或许就是记忆的不确定性吧,薛定谔的记忆——不过那部电影,我到现在也觉得拍的不错。

所以,到底怎样的经历才能让记忆被镌刻,

到底怎样的事迹才能让我被铭记?

海边的夏天大概才刚刚开始。这让我想起我在江城的一年四季,我在大江两侧的十多个夏天,夏夜,

如果它们也有情感,应当铭记我吧。

ANN&DL

人工智能元年:1956年,美国,达特茅斯会议(用机器模仿人类学习以及其他方面的智能)

参会人员有:约翰·麦卡锡,克劳德·香农等

历史探索:亚里士多德(三段论),帕斯卡(机械计算器),莱布尼兹(微积分,二进制),冯诺依曼(计算机,博弈论),图灵…

简介

  • 传统的AI技术:串行处理,用程序实现,精确计算(模仿左脑)

    ANN技术:并行处理,用人工神经元之间相互作用实现,非精确计算(模拟处理)(模仿右脑)

  • 人工神经网络(Artificial Neural Networks):数学模型

    • 关键点:

      1)信息的分布表示

      2)运算的全局并行与局部操作

      3)处理的非线性特征

    • 对大脑基本特征的模拟:

      1)形式上:神经元机器及其连结

      2)表现特征:信息的存储与处理

    • 学习能力:

      其信息的分布存储提供了容错能力,系统在受到局部损伤时还可以正常工作

      对一类网来说,完成学习后如果再学习新的东西,会破坏原来已经学会的东西

    • 主要领域:

      对大量数据进行分类;

      学习一个复杂的非线性映射;

    • 提出历程:

      1943年,M-P模型(阈值加权和模型)

      1949年,Hebb学习律(神经元之间突出联系是可变的)

      1950-1968(第一高潮期),单级感知器(Perceptron),可用电子线路模拟

      1969-1982(反思期),发现”异或“运算不可表示

      1983-1990(第二高潮期),循环网络,设计研制Hopfield网电路,解决TSP问题,Boltzmann机,BP算法(多层网络)

      1991-2006(再认识与应用研究期)

      2006至今,深度学习,CNN,DBN,深度学习的循环网络

理论基础

人工神经元

  • 具有生物神经元的六个特征

    1)神经元及其联接

    2)连接强度决定信号传递强弱

    3)连接强度可以随训练改变

    4)信号可以刺激/抑制

    5)一个神经元接受的信号的累积效果决定该神经元状态

    6)每个神经元可以有一个阈值

  • 基本构成

ANBase64
[]:

人工神经元模拟生物神经元的一阶特性。
输入:X=(x1,x2,…,xn)
联接权(权重):W=(w1,w2,…,wn)
网络输入:net=Σxiwi
向量形式:net=XW

  • 具体的
    激活函数:o=f(net)
    上层节点的输出和下层(隐层或输出层)节点的输入之间的函数关系,也称激励函数/活化函数
    作用:使深层神经网络的表达能力更强大,而非把输入线性组合再输出
    常见的有Sigmoid函数、TanH函数等
    FNETBase64
    γ>0,为一常数,称为饱和值,为该神经元的最大输出。

M-P模型(也称处理单元):如上结构图

拓扑特性

  • 连接模式
    ”+“:表示传送来的信号起刺激作用,用于增加神经元的活跃度
    ”-“:抑制作用,降低活跃度

    • 层级内联接:加强和完成层内神经元之间的竞争
    • 循环连接:反馈信号
    • 层级间联接:不同层中神经元之间的联接,用来实现层间的信号传递
  • 网络的分层结构

    • 简单单级网

djwBase64

输出层的第j个神经元的网络输入记为netj,netj=x1wij+x2w2j+…+xnwnj
(重点:上述为同一层的输入-输出,而激励函数是上一层的输出-下一层的输入)
即:NET=XW,O=F(NET)

  • 网络的分层结构
    • 单级横向反馈网

hxBse64

NET=XW+OV,O=F(NET)

(主要注意输出层每个神经元多了横向的联接)

  • 网络的分层结构
    • 多级网

DJW2Bse64

最终结果:F3(F2(F1(XW(1))W(2))W(3))

  • 网络的分层结构

    • 循环网

XHWBase64

将输入信号反馈到输出端,输入的原始信号被逐步加强、修复;
反馈信号引起网络输入的不断变化,若这种变化经过循环最后可消失,则称网络达到了平衡状态,该网络是稳定的;若不能消失,则称该网络是不稳定的

  • 层次划分

    信号只被允许从低层流到高层;

输入层:为第0层,负责接收来自网络外部的信息;
隐藏层:输入层与输出层之间,不直接接受和发送信号;
输出层:具有该网络的最大信号,输出网络计算结果

​ 输出层的层号为该网络的层数(称为n层或n级网络);
​ 第j-1到j层的连接矩阵称为第j层连接矩阵,输出层对应的矩阵称输出层连接矩阵;
​ 用W(j)表示第j层矩阵

EXP_B10g

*在3.3写下第一篇T3CH文章!!

本篇作为一篇实际上一点也不硬的技术博客,简单记录一下笔者博客发展的小小问题、经验。

前言:本人博客目前的搭建方式是Github.io+Hexo,主题选用Next

快捷方式

为了防止以后更新博客的时候忘记怎么快速操作,先简单码住本人(不具有普适性)博客基本操作的详细方式。

更新博文

在根目录的source目录下的_posts目录中右键GIT BASH,输入”hexo new ‘标题’ “即可。之后用管理员身份打开md编辑器,打开刚刚创建的文件,撰写博客即可。

文章前面的代码块中,注意写分类的时候格式为:(不要忘记空格)

1
2
categories:
- 类别名

写完后在根目录下GIT BASH,进行hexo三件套(hexo clean,hexo g(enarate),hexo d(eploy))即可

三件套运行成功后,进入自己github的博客项目,Settings-Pages-Custom domain中,输入自己的博客网址(例如我的adauniverse.com)并保存

当上面显示Last deployed为一分钟前或now之类,且显示”Your site is live at 你的网址“说明此次部署成功,更新博客网页即可。

注:

  1. 不可直接以管理员身份创建md文件另存为到目录下,这样部署不上去;
  2. 最后一步hexo三件套时,如果其他步骤无问题,部署出现问题,删除根目录下刚生成的.deploy_git文件夹,再次生成即可;
  3. 在github页面中保存更新时,建议开梯子,且很可能要保存多次你的网址并使其DNS检查多次,故建议先复制好网址,免得之后每次都要再打一遍。

个性化

根目录themes目录掌控着主要的个性化内容。个人头像、动态效果、背景样式等都在该目录下进行调整。具体的操作等有空细写。

W1T3R

不知道从什么时候坚定地喜欢冬天。小学的时候老师布置作文,题目是《最喜欢的季节》,写的就是冬天;后来直到现在,他人问起最喜欢的季节,依然会毫不犹豫地说是冬天。也会很期待雪,虽然说起来那些兴奋根本不知道到底源于什么——明明也见过很多次雪了,也知道冬天冷得要命。

2024年的冬天也是这样的冷。北方吹的寒冷的大风,南风下的难得的冻雨,也全被我收入囊中了。而在当下这样已经过了雨水节气的冬天,我又常常期盼春夏快些来到。

高中时候和朋友聊天,我不止一次谈到感觉冬天的自己的心脏好像被冻住了一样。当时在事实上并没有那么冷的、并不宽敞的校园里,为数不多的闲暇时光,和朋友相伴谈话——大抵也没谈多久;但现在回想,却觉得旁边好像空无一人,只有我和她,而好像也谈了很久很久,一直走啊走,场景既模糊又生动。”感觉自己变得很冷漠,对什么都提不起兴趣,“我如是说,”或许是冬天太冷的原因吧,感觉再也找不到曾经鲜活的自己了,很害怕。“她似乎还说我们做到的一篇英语语法填空里有提到这个,说科学证明了冬天人的情感的确不怎么激烈生动云云。具体的字眼却已记不太清。

樱花大道上所有的树都瘦得像濒死的老人。我拥有大堆空闲时光。而我也不知道我现在到底是心理冷漠状态还是鲜活状态,抑或啥也不是。说来奇怪,紧张的时光里我更喜欢想得更多,而空闲的时光里我反而想的更少。或者可能只是想的东西不同吧。他们说,”痛苦的环境能诞生伟大的作品“。现在看来,我之前的作品还真伟大。

之前似乎也不会去想冬天何时结束。现在却常常看着天气,想着何时升温。不过想的多或者少又有什么关系呢,人本来就会活得时而肤浅时而深沉,而我本来也是这样的人。想来深沉的我也不应该嘲笑肤浅的我,什么会真的让自己开心我应当是一直知道的。想得太多有时候也不是什么好事。(但想得太少总归是个坏事。)春天总是会来的。

he110_w0r1d

耗时半盒海苔饼干+半包黄瓜薯片,博客搭建完成!!!