scala学习1- 一些概念

下载和安装

linux简单一些,可以直接 yum install scala就好了 ,windows的话,可以到下载的链接 http://www.scala-lang.org/download/  我下载的是scala-2.11.6 。对应是一个 msi文件(速度有点小慢啊)。下载完以后直接安装,安装完成以后,对应的bin目录会自动添加到path路径下。 然后就可以直接在命令行进入 REPL了

 

REPL 写道

 

C:\Users\zhenghui>scala
Welcome to Scala version 2.11.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_1
1).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

 

在REPL上写表达式

直接看对应的输入输出,比java有意思一些。基本能说明问题了

 

写道

 

scala> 8 * 5
res0: Int = 40

scala> res0* 0.5
res1: Double = 20.0

scala> "str"+res1
res2: String = str20.0

scala> res2.to
toCharArray toLowerCase toString toUpperCase

scala> res2.toUpperCase
res3: String = STR20.0

 REPL就是一个简单的scala的解释器,当然他的真实动作是输入的内容会被快速编译成字节码,然后通过字节码在jvm虚拟机上运行。这是一个 read-evalution-print-loop的过程,简称 REPL。

 

声明值和变量

scala中变量声明可以有两种方式,一种是 val 关键词,这个有点类似java中的 final ,表示常量,声明完了以后就不能再修改,还有一种是变量,通过var 来修饰,具体看下面的例子

 

写道

 

scala> val a = 1 + 2 * 10
a: Int = 21

scala> a = a * 10
<console>:8: error: reassignment to val
a = a * 10
^

scala> var b = 1 + 2 * 10
b: Int = 21

scala> b = b * 10
b: Int = 210

 在scala中,尽量使用 val,这样对jvm的效率优化有好处。

另外,可以看出来,scala似乎不太关心变量的类型。或者说,scala变量的类型是解释器自己推断的。当然,你也可以自己指定对应的类型,当然,你要慢慢习惯这种类型放变量之后的方式。。。

 

写道

 

scala> val str : String = "my name is bill"
str: String = my name is bill

 

基本类型 

sacla中的基本类型和java是一样的,也是8个,但是scala没有包装类型,或者说两者之间的转换已经自动帮我们做掉了。比如

写道
scala> 121212.toString
res6: String = 121212

scala> 1.to(10)
res7: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8,
9, 10)

 

 

操作符

操作符里有下面几个需要注意

1 在scala中, a.方法(b)  可以简写成 a 方法 b 。比如

写道
scala> 1.to(10)
res4: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8,
9, 10)

scala> 1 to 10
res5: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8,
9, 10)

2 scala中,没有 ++ 运算符。。如果需要++ ,那么只能通过 num = num +1来实现

 

写道
scala> var num = 10
num: Int = 10

scala> num = num++
<console>:8: error: value ++ is not a member of Int
num = num++
^

scala> num = num + 1
num: Int = 11

 3 不在参数的方法,可以省略对应的().

写道
scala> "abbccddedf".length
res11: Int = 10

scala> "abbccddedf".length()
res12: Int = 10

 apply方法

scala可以支持函数的()重载,这个在java当中是没有的,所以比较稀奇。他的实现原理是,自动调用对应类的apply方法,比如 “helloworld”(4) 表示的是 获取“helloworld”这个字符串的第4个字符(以0为第一个),实际上是调用了 "helloworld".apply(4) 

scala> "helloworld"(4)
res13: Char = o

scala> "helloworld".apply(4)
res14: Char = o

 

 条件表达式

scala中的条件表达式和java一样。不过在scala中,条件表达式是有值的,这个值就是if或者else后面的那个值。

scala> val x = 1
x: Int = 1

scala> if(x>0) 1 else 0
res1: Int = 1

scala> val y = if(x>0) 1 else 0
y: Int = 1

 

循环

while语句和java一样

 

 

scala> var count = 5;
count: Int = 5

scala> while(count >= 0){ println(count);count=count-1}
5
4
3
2
1
0

 注意while循环中有多个语句的时候,记得用分号括起来,否则scala会只执行 println语句。

 

for循环与java不太一样,不过有点类似java的增强型的for循环,但是也不是完全一样。

 

scala> for(i <- 1 to 5) println(i)
1
2
3
4
5
scala> for(i <- 1 until 5) println(i)
1
2
3
4

 to 和until 的区别,已经很明显了。

 

函数

scala中的函数类似java中的静态方法。

scala> def abs(num :Double) = if(num > 0) num else -num
abs: (num: Double)Double

scala> abs(0)
res5: Double = -0.0

scala> abs(10)
res6: Double = 10.0

 过程

如果方法没有返回值,那么就叫这个是过程。之前的hello world程序中的main方法就是过程,其实没有返回值也可以认为返回值是Unit,但是非常不建议这样写。具体如下

scala> def bar(name : String) {println("hello,"+name)}
bar: (name: String)Unit

scala> bar("bill")
hello,bill

scala> def _bar(name : String):Unit = {println("hello,"+name)}
_bar: (name: String)Unit

scala> _bar("bill")
hello,bill

第二种方式非常不建议写 

 

方法的默认参数

在java中并没有这个功能。很有趣啊。具体的例子如下

scala> def foo(str :String,left : String = "[",right:String = "]") = left + str
+ right
foo: (str: String, left: String, right: String)String

scala> foo("bar")
res0: String = [bar]

scala> foo("bar","<")
res1: String = <bar]

scala> foo("bar","<",">")
res2: String = <bar>

scala> foo("bar",right=">")
res3: String = [bar>

 基本上可以把这个功能说明清楚了。

 

可变参数

可变参数在java中也有,在java中,可变参数是在类型上加点点来实现的,在scala中是加星号。

scala> def sum(num :Int*)= {var count =0;for(i <- num) count += i; count}
sum: (num: Int*)Int

scala> sum(1,2,3,4,5)
res6: Int = 15

 

 

 

 

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值