系列文章目录
文章目录
一、上期问题
- CNN 中的局部连接(Sparse Connectivity)和权值共享(Shared Weights)特点
- GAN 与diffusion的对比
- Stable Diffusion是怎么训练的?
- L1和L2正则化的区别
- JS散度
- Dropout的作用和原理,在训练和测试时是如何运行?
二、本期理论问题
1、clip编码优缺点
优点:泛化性能强,特征在同一空间下衡量,模型简单不需要额外训练
缺点:文本描述简单“A photo of a XXX”,图文理解能力偏弱
2、Torch 和 Tensorflow 的区别
- 创建和运行计算图的方式:
- pyTorch 中,图结构是动态的,这意味着图在运行时构建;
- TensorFlow 中,图结构是静态的,这意味着图先被“编译”然后再运行。
- 灵活性:
- pytorch:动态计算图,数据参数在 CPU 与 GPU 之间迁移十分灵活,调试简便(可以使用pdb并在任何地方设置断点);
- tensorflow:静态计算图,数据参数在 CPU 与 GPU 之间迁移麻烦,调试麻烦(需要从会话请求要检查的变量,或者使用 tensorFlow 的调试器)
- 设备管理
- pytorch:需要明确启用的设备
- tensorflow:不需要手动调整,简单
3、RNN
循环神经网络模型(RNN)是一种节点定向连接成环的人工神经网络,是一种反馈神经网络,RNN利用内部的记忆来处理任意时序的输入序列,并且在其处理单元之间既有内部的反馈连接又有前馈连接。而在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此无法对时间序列上的变化进行建模。具体来说,RNN中的神经元的输出可以在下一个时间段直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出。RNN主要由输入层,Hidden Layer, 输出层组成,Hidden Layer之间会有数据的循环更新, 用于实现时间记忆功能。
4、1x1卷积在卷积神经网络中有什么作用
- 可以实现输出feature map(特征图)的升维和降维:
- 1x1的卷积,卷积核长宽尺寸都是1,在计算的过程中,不存在长、宽方向像素之间的融合计算(乘累加计算),而仅仅存在通道之间的融合计算,卷积核的个数就是卷积输出的通道数。因此如果想让输出特征图的通道数增大,就要使用更多数量的卷积核来做卷积,从而实现特征维度的升或者降。
- 可以减少模型中的参数量,从而减少计算量,提升模型的推理性能:
- 在输出相同特征图的前提下,将一个普通的卷积,替换成一个1x1的卷积加上另一个卷积,先进行降维,然后计算,如此一来整体的计算量要比普通卷积少。
- 可以增加网络的深度从而提升模型的非线性表达能力:
- 1x1的卷积可以使得在完成相同卷积功能的前提下网络的层数变得更深,导致更多非线性层数的增加从而使得整个神经网络模型的非线性表达能力更强。
5、AIGC 存在的问题
图像生成方面不能用一个模型满足所有要求,有时候需要定制化微调;以及存在部分情况生成效果不佳(比如人,数字,位置关系等需要推理的情况);可控生成方面最近也有很大进展(可以说很多问题都得到了解决:比如位置控制等);视频生成领域还有较大的进步空间。
6、AlexNet
AlexNet是一个较早应用在ImageNet上的深度网络,其准确度相比传统方法有一个很大的提升。它首先是5个卷积层,然后紧跟着是3个全连接层。AlexNet在卷积层和全连接层后面都使用ReLU激活函数。另外在每个全连接层后面加上Dropout层减少模型过拟合。还有数据增广。
三、力扣刷题回顾-字符串
上期涉及题目:
本期题目:
344.反转字符串:
- 给定输入:一个字符数组
- 要求输出:将输入的字符串(字符数组)反转过来
- 注意事项:不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
541. 反转字符串II:
- 给定输入:一个字符串 s 和一个整数 k
- 要求输出:从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符
- 注意事项:
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
替换数字:
- 给定输入:一个包含小写字母和数字字符的字符串
- 要求输出:将字符串中的字母字符保持不变,而将每个数字字符替换为number
对比分析:
344.反转字符串 问题可以使用双指针法很快解决,541. 反转字符串II是前一道题的进阶版,关键是对于题目要求的理解,实际上就是遍历时采用2k的步长,每一步中调换前k个即可。替换数字一题也比较常规,就是在遍历字符串时增加一个判断条件即可。
344.反转字符串
使用双指针法:
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left,right=0,len(s)-1
while left < right:
s[left],s[right]=s[right],s[left]
left+=1
right-=1
return s
541. 反转字符串II
调换时采用字符串切片的方法:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
i = 0
while i < len(s):
i2 = i+k
s = s[:i]+s[i:i2][::-1]+s[i2:]
i += 2*k
return s
调换时采用事先用双指针法定义好的函数:
class Solution:
def reverse(self,s):
left,right=0,len(s)-1
while left<right:
s[left],s[right]=s[right],s[left]
left+=1
right-=1
return s
def reverseStr(self, s: str, k: int) -> str:
res=list(s)
i=0
while i < len(s):
i2=i+k
res[i:i2]=self.reverse(res[i:i2])
i+=2*k
return ''.join(res)
替换数字
n=input()
left=0
right=len(n)-1
ans=""
for i in n:
if ord('0')<=ord(i)<=ord("9"):
ans+="number"
else:
ans+=i
print(ans)
参考:
代码随想录算法训练营第七天|344.反转字符串,541. 反转字符串II,卡码网:54.替换数字,151.翻转字符串里的单词,卡码网:55.右旋转字符串