- 博客(184)
- 资源 (3)
- 收藏
- 关注
原创 基于LSTM的文本分类2——文本数据处理
由于计算机无法认识到文字内容,因此在训练模型时需要将文字映射到计算机能够识别的编码内容。这篇文章的目的就是搞懂上面的代码如何实现,即如何构建文字数据集和迭代器。
2025-04-05 22:37:13
774
1
原创 基于LSTM的文本分类1——模型搭建
经过embedding映射后可以看到,张量out里的数据变成128*32*300的维度,300的维度就是词向量维度,可以看到data里的数据都由原来的整数映射成了向量。由于我们的数据量较小,所以使用较低的词向量维度。另外,如果使用预训练模型,词向量维度的值需要和预训练模型的值相同。全连接的输入通道数是隐藏层维度的两倍,原因是我们的模型是双向的,双向的结果都需要输出给全连接层。前面的汉字部分是模型学习的文本,后面接一个tab键是对该文本的分类。配置的重点是模型的超参数,这里分析一下模型涉及的超参数。
2025-04-01 00:35:25
932
原创 pytorch中dataloader自定义数据集
from PIL import Image # 从PIL库导入Image类"""花朵分类任务数据集类,继承自torch的Dataset类""""""初始化数据集实例Args:root_dir (str): 数据集根目录路径ann_file (str): 标注文件路径transform (callable, optional): 数据预处理变换函数"""# 加载图片路径与标签的映射字典 {文件名: 标签}# 构建完整图片路径列表 [root_dir/文件名1, ...]
2025-03-29 23:51:45
558
原创 基于CNN的FashionMNIST数据集识别6——ResNet模型
在反向传播过程中,梯度通过链式法则逐层传递。对于包含 L 层的网络,第 l 层的梯度计算为:其中 a(k) 表示第 k层的激活值。当多个雅可比矩阵 ∂a(k+1)/∂a(k) 的乘积中出现大量小于1的特征值时(例如使用Sigmoid激活函数),梯度会指数级衰减();反之若特征值大于1,则梯度爆炸式增长()。实验证明,VGG-19的训练损失曲线在后期趋于平缓,参数更新停滞。网络退化问题通常是过深的网络的表达力下降导致的,原始像素信息需经过所有层的非线性变换,关键特征可能在传递过程中被破坏。
2025-03-23 01:04:19
1034
原创 基于CNN的FashionMNIST数据集识别5——GoogleNet模型
从整个链路上看,googlenet的复杂度相比于之前我们提到的cnn网络更复杂。仔细分析可以看到,googlenet的网络结构里面有多个核心模块inception。搞懂inception就基本搞清楚了googlenet。
2025-03-20 01:05:59
795
原创 基于CNN的FashionMNIST数据集识别4——VGG-16模型
VGG-16 是牛津大学 在 2014 年提出的经典卷积神经网络模型,发表于论文《Very Deep Convolutional Networks for Large-Scale Image Recognition》。它在 ImageNet 图像分类任务中取得了突破性成绩,核心贡献是证明了 对模型性能的重要性(当然太深了也不好)。
2025-03-13 00:23:40
354
原创 基于CNN的FashionMNIST数据集识别3——模型验证
和之前训练模型时的验证逻辑基本相同。只进行前向传播,将预测正确的样本个数进行累加。当模型训练完毕后,我们得到的是一组最优的参数配置。在代码运行时,需要将参数载入到模型里,再进行验证。最后要做的就是验证这组参数的表现。
2025-02-24 00:05:42
273
原创 基于CNN的FashionMNIST数据集识别1——模型搭建与数据准备
我们这次使用LeNet模型,LeNet是一个经典的卷积神经网络(Convolutional Neural Network, CNN)架构,最初由Yann LeCun等人在1998年提出,用于手写数字识别任务创建一个文件model.py。实现以下代码。
2025-02-16 22:35:37
906
5
原创 Fragment学习笔记
静态加载直接注册在布局的xml文件里。需要注意,要指定frament的类型<android:name>和id<android:id>。
2024-08-18 23:23:34
698
原创 Service入门笔记
Service 是 Android 系统中的一种组件,用于在后台执行长时间运行的操作或处理异步任务。Service 可以在不依赖于用户界面的情况下运行,并且可以在应用程序被关闭后继续运行。
2024-08-11 11:25:43
413
原创 android轮播图入门2——触摸停止与指示器
监听轮播图切换轮播视图事件,每次组件切换都遍历一次圆点,将对应当前数据位置的圆点改成选中态。触摸停播的设计思路是:监听实现轮播图的触摸事件,如果用户正在触摸就停止自动轮播。轮播图初始化时,创建数据个数相等的小圆点,默认为未选中状态。
2024-07-06 19:21:24
440
原创 android轮播图入门1——简单无限自动轮播图
自动定时轮播可以通过Handler的延时方式实现,首先要明确,在用户不可见的情况要停止自动轮播,因此要在上屏/移出屏幕时做处理。另外还有一个问题,就是我们希望轮播图一开始可以往左滑动,而不是只能向右滑动,这样可以给用户一种无限循环的感觉。改写getCount方法,返回的数值就是轮播图的组件数量,我们设置为int的最大值,视作无限多。因此在视图初始化时,应该手动给轮播图当前的组件设定一个足够大的值,使得用户可以不断地向左滑。需要注意,设定的值需要是数据数组长度的倍数,这样才能定位到第一个轮播组件。
2024-06-29 20:38:26
677
原创 Installed Build Tools revision xxx is corrupted. Remove and install again 解决
1.在buildTools文件下找到对应的sdk版本,首先将版本对应目录下的d8.bat改名为dx.bat。2.在lib文件下将d8.jar改名为dx.jar。3.重新编译工程即可。
2024-06-29 18:28:19
2511
2
原创 LORA学习笔记3——训练参数
模型训练时ai模型会根据标注生成一个图片,并与学习图片进行对比,通过对比的结果调整嵌入向量。这样的一个流程就被称为“一步”。如果一个训练集中有50张图片,每张图片设定为要训练10次,所以训练完这一组数据集需要50*10=500步。:一个训练集里面的全部图片按照规定的训练次数训练完一次,被称之为训练完“一轮”。参考刚才的例子,500步就是该训练集的一轮所需要的步数。通常我们使用这个概念来控制训练一个模型的总步数。模型训练的总步数=
2024-05-26 20:08:32
2722
原创 FileProvider与apk下载
我们这次把某个apk放在storage下的一个目录下,用一个FileProvider生成uri后,启动一个活动去安装。首先用apk所在的path生成一个uri。这里需要注意,external_path是storage/emulated/0这个目录,这个目录直接写入文件似乎是不可以的(创建文件夹可以),因此我们把apk存放在storage/emulated/0的子目录下,确保不发生权限问题。我们这里自定义了一个FileProvider,单纯继承自安卓提供的基类。
2024-05-26 17:55:51
2701
原创 LORA学习笔记2——训练集处理
对于ai训练来说,处理训练集是模型训练的重要环节。训练集的质量对最终模型的质量影响巨大。这里以二次元角色为例,记录下训练集处理的流程和一些心得。
2024-05-12 22:35:58
1995
原创 Broadcast入门1
从示例中可以看出,如果仅实现动态注册——监听广播,需要实现的部分如下:1.实现一个receiver,继承自BroadcastReceiver。重写onReceive方法,在里面实现监听到具体广播后的逻辑。2.实例化并注册该receiver,在注册时通过在intentFilter里设置action来指定监听的广播类型。3.在销毁活动时取消注册。否则会导致内存泄漏。该示例展示的是动态注册方法。安卓系统的一些系统级别的广播是要求动态注册的。但是也可以发现动态注册存在的一个问题,就是在程序启动之后才会生效。
2024-04-21 20:36:08
318
1
原创 Activity入门2——生命周期与任务栈
OnCreate:创建一个活动。OnDestroy:销毁一个活动。假设某个用户在一个活动里输入了一些信息,用户由于某些原因退出了该活动,返回时希望能够还原之前输入的信息,不然重新输入就太麻烦了。从以上代码可以看到:onDestroy:在活动销毁时,将用户输入的内容通过持久化的方式存起来。onCreate:在活动创建时,如果已经有持久化存储的内容,就把该内容取出并赋值到输入栏里。
2024-04-05 15:48:43
337
原创 RecyclerView入门
什么是recyclerView?我们常见的可以滑动的,分块的视图样式就可以认为是recyclerView。比如:在开发前还需要了解一些概念:ViewHolder:可以看到recyclerView是以分块的视图形式组织的。分块无论其形状,里面的内容如何,每一个分快称之为ViewHolder。上图中一个title+subtitle的条形分块就是一个ViewHolder。
2024-03-17 19:57:13
889
原创 stable diffusion学习笔记 手部修复
某张图片在生成后,仅有手部表现不符合预期(多指,畸形等)。这种情况下我们通常使用【局部重绘】的方式对该图片的手部进行【图生图】操作,重新绘制手部区域。但是仅采用重绘的方式也很难保证生成的手没有问题。因此这里我们采用【contorlNet】进行辅助,定向生成某种手部的形状。
2024-02-25 20:46:28
5185
原创 stable diffusion学习笔记——高清修复
以上问题说明了,玩ai画图,需要掌握提高画图分辨率的方式,同时要掌握方式对应的技巧,避免出现画面内容的问题。
2024-02-03 21:49:39
2317
原创 stable diffusion学习笔记——文生图(二)
LORA和Embeddings都可以对画面内容进行调整。目前LORA主要用来定义画面特征,如具体的人物,衣物,画风等。Embeddings目前主要用于反面提示词中,用来避免错误的画面表现。
2024-01-28 15:24:55
587
原创 stable diffusion学习笔记——文生图(一)
基本模型也就是常说的checkpoint(大模型),基本模型决定了生成图片的主体风格。如上图所示,基本模型的后缀为.safetensors。需要存放在特定的文件夹下。如果用的是启动器,可以在启动器内直接下载。
2024-01-27 12:42:34
2280
原创 c++函数返回字符串指针
在以上代码中,在函数中创建一个字符数组,直接将字符数组的名称作为char类型的指针作为返回值向外传递。这种做法是错误的,编译器会弹出警告:Address of stack memory associated with local variable 'chp' returned。意思是将在栈上的局部变量返回了,这在c++中是不推荐的。问题的原因在于,testfunc1中的字符数组chp属于局部变量,位于内存的栈区,因此指针*p指向的是栈里的局部变量。
2022-09-22 16:54:39
2475
原创 c++ strcpy相关坑点
strcpy的作用是将一个字符串的内容复制到另外一个字符串中,覆盖原有的内容。常见的例程有:将字符数组里的内容复制到字符数组里。将字符串常量里的内容复制到字符数组里。需要注意的是,在c++中char *p这样的变量是存放在常量区。
2022-09-22 15:31:24
1134
原创 Linux 文件/目录访问(opendir/closedir/readdir)
在Linux系统中我们需要在一个特定目录下对该目录下所有的文件以及目录(文件夹)进行便利访问。Linux获取目录文件的流程如下:1.打开指定目录,使用opendir得到目录句柄。2.while循环中使用readdir获取目录的内容,并存储到struct dirent 结构体变量中。3.dirent结构体变量存储了文件/文件夹的一些属性,可以通过这些属性进行一些差异化操作。4.最后关闭目录句柄closedir。
2022-09-21 16:23:02
2119
原创 c++ 程序中使用命令行
头文件函数原型函数功能popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。如果type是"r"则文件指针连接到command的标准输出,读取命令的标准输出;如果type是"w"则文件指针连接到command的标准输入,写入命令的标准输入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。
2022-09-20 21:05:23
6611
原创 java 低耦合观察者模式
在之前的文章中,虽然被观察者并不依赖于观察者,但是被观察者知道观察者的存在,这就出现了一定程度的耦合关系。我们通常希望一个观察者模式是这样的:1.观察者依赖于被观察者,被观察者不依赖于观察者。2.被观察者最好不知道观察者的存在,既能独立工作,又能减少与观察者的耦合关系。
2022-09-14 17:52:19
553
原创 Android HandlerThread例程
在多线程通信中我们通常使用handler进行异步通信。在线程中使用handler稍微有一些麻烦,比如说创建handler的时候必须保证当前线程中有Looper对象,否则会创建失败。安卓的主线程自带一个Looper,但是我们手动创建的子线程是不会自带Looper对象的,因此我们如果想要在子线程接收信息,也就是在子线程创建handler,就必须在子线程先创建Looper对象,有点麻烦。于是HandlerThread可以解决这个问题,里面内部自带了Looper对象。
2022-09-14 10:57:44
673
原创 JNI学习5.jstring的处理
代码中GetStringUTFChars能够得到一个修改后的utf8类型的字符串,将该字符串赋值给需要返回的字符串即可。此外需要ReleaseStringUTFChars对临时创建的char指针进行内存释放。
2022-09-02 15:01:02
2544
原创 Android多线程实现
Android基础的多线程实现方式主要有两种,一种是创建一种线程类并直接继承Thread类,重写其run函数实现线程功能,第二种是实现Runnable接口,通过线程辅助类实现线程功能。
2022-08-17 20:17:35
1588
原创 Android Handler例程(sendMessage与post)
在安卓中,只有主线程才能进行UI操作。说明子线程内无法实现对UI的修改,因此安卓必然支持一种线程通信机制,使得子线程可以发消息让主线程改一下UI,该方案就是handler。安卓中子线程之间也需要通信,通信方案也是handler。......
2022-08-15 16:58:31
2286
1
原创 观察者模式
观察者模式常用于一对多的监听情景,并且被监听者可以实现监听者的回调,也就是说被监听者能够触发监听者的动作,该动作就是回调。观察者模式的特点:1.被观察者不知道具体的观察者是谁,只知道自己被观察了,并且在合适的时机进行广播,让感兴趣的观察者知道发生了什么事情。2.观察者依赖于被观察者,被观察者不依赖于观察者,是单向关系,耦合程度不高。没有被观察者,观察者无法工作;没有观察者,被观察者该干啥干啥,因为被观察者本来就不清楚谁观察他,发广播是被观察的个人行为。......
2022-08-10 21:38:43
1901
原创 JNI学习4.动态注册
静态注册较为简单,只需要在Java程序中声明jni函数,随后在cpp程序中实现此jni函数即可。静态注册的实现方式为:当java程序第一次使用某个jni函数时,会进行搜索,根据包名-类名-函数名进行搜索,随后与对应的jni函数建立连接,随后便可以调用。由于虚拟机自动实现了注册匹配,所以在实际编写中比较省力,名字匹配了就可以直接用。但是静态注册有一些缺点:1.函数名称需要匹配,不能自定义。2.每个jni函数第一次被调用时都需要搜索,增加了额外开销。如果工程中的jni函数较多,在搜索方面可能会花费较多时间。..
2022-08-04 17:51:58
938
qt-everywhere-src-5.14.1.tar.xz
2020-06-30
gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
2020-06-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人