一、整体界面



上面分别为**CodeBuddy国际版、Trae CN以及cursor(免费版)**的主界面,其实都是与vscode的界面一脉相承的,重点还得是实际的使用,接下来我将分别使用上述三种IDE来从项目理解,代码生成,交互性等方面进行对比。
一、项目理解
0x00:为尽可能保证测评的公平性,使用相同的项目相同的prompt以及IDE默认的LLM配置,如Code Buddy使用Claude -3.7-sonnect,Trae CN及cursor均使用的是Auto。
0x01 :首先,进行项目理解 测试,所使用的项目是pytorch-UNet,使用的prompt为:请先阅读整个项目,分析项目的目的,理解项目的意图后给出分析结果。
Code Buddy IDE



Trac CN



cursor


在这项对比中,前两者的结果对比cusor有更多的技术(代码)细节,同时Code Buddy的内容会比Trae CN生成的更加详细,从个人的学习需求来看,更喜欢Code Buddy一点,其次是cursor,反而最后才是Trae CN,具体的评判只能说感觉,接下来是代码生成,这点才是重头戏。
二、代码生成
此处的代码生成,主要面对的是个人学习开源项目来设置的prompt(因为我目前还是以跟着项目学习为主,未曾尝试从0开始实现一个完整的项目,这一方面水平欠缺得再等一等),prompt为:我想要学习该项目,请根据该项目的重点内容,以完型填空的形式给出相应的学习模板,我只需要根据提示在学习模板中填空,即可实现完整项目,现在请以该项目中的算法模型为例。
Code Buddy
基本卷积块实现:
python
class DoubleConv(nn.Module):
"""(convolution => [BN] => ReLU) * 2"""
def __init__(self, in_channels, out_channels, mid_channels=None):
super().__init__()
if not mid_channels:
mid_channels = out_channels
self.double_conv = nn.Sequential(
nn.Conv2d(in_channels, mid_channels, kernel_size=________, padding=________, bias=________),
nn.________(mid_channels),
nn.________(inplace=True),
nn.Conv2d(mid_channels, out_channels, kernel_size=________, padding=________, bias=________),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True)
)
def forward(self, x):
return self._________(x)
下采样/上采样及输出模块实现:
python
class Down(nn.Module):
"""Downscaling with maxpool then double conv"""
def __init__(self, in_channels, out_channels):
super().__init__()
self.maxpool_conv = nn.Sequential(
nn._________(________),
_________(in_channels, out_channels)
)
def forward(self, x):
return self.maxpool_conv(x)
class Up(nn.Module):
"""Upscaling then double conv"""
def __init__(self, in_channels, out_channels, bilinear=True):
super().__init__()
# if bilinear, use the normal convolutions to reduce the number of channels
if bilinear:
self.up = nn._________(scale_factor=2, mode='bilinear', align_corners=True)
self.conv = DoubleConv(in_channels, out_channels, in_channels // 2)
else:
self.up = nn._________(in_channels, in_channels // 2, kernel_size=2, stride=2)
self.conv = DoubleConv(in_channels, out_channels)
def forward(self, x1, x2):
x1 = self.up(x1)
# input is CHW
diffY = x2.size()[2] - x1.size()[2]
diffX = x2.size()[3] - x1.size()[3]
x1 = F._________(x1, [diffX // 2, diffX - diffX // 2,
diffY // 2, diffY - diffY // 2])
x = torch._________(_________, dim=1)
return self.conv(x)
class OutConv(nn.Module):
def __init__(self, in_channels, out_channels):
super(OutConv, self).__init__()
self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=________)
def forward(self, x):
return self.conv(x)
完整模型及损失函数及数据加载模块实现
python
class UNet(nn.Module):
def __init__(self, n_channels, n_classes, bilinear=False):
super(UNet, self).__init__()
self.n_channels = n_channels
self.n_classes = n_classes
self.bilinear = bilinear
self.inc = (DoubleConv(n_channels, _______))
self.down1 = (Down(64, _______))
self.down2 = (Down(128, _______))
self.down3 = (Down(256, _______))
factor = _______ if bilinear else 1
self.down4 = (Down(512, 1024 // factor))
self.up1 = (Up(_______, 512 // factor, bilinear))
self.up2 = (Up(512, _______ // factor, bilinear))
self.up3 = (Up(256, _______ // factor, bilinear))
self.up4 = (Up(128, _______, bilinear))
self.outc = (OutConv(64, _______))
def forward(self, x):
x1 = self.inc(x)
x2 = self.down1(x1)
x3 = self.down2(x2)
x4 = self.down3(x3)
x5 = self.down4(x4)
x = self.up1(x5, _______)
x = self.up2(x, _______)
x = self.up3(x, _______)
x = self.up4(x, _______)
logits = self.outc(x)
return logits
def dice_coeff(input: Tensor, target: Tensor, reduce_batch_first: bool = False, epsilon: float = 1e-6):
# Average of Dice coefficient for all batches, or for a single mask
assert input.size() == target.size()
assert input.dim() == 3 or not reduce_batch_first
sum_dim = (-1, -2) if input.dim() == 2 or not reduce_batch_first else (-1, -2, -3)
inter = _______ * (input * target).sum(dim=sum_dim)
sets_sum = input.sum(dim=sum_dim) + target.sum(dim=sum_dim)
sets_sum = torch.where(sets_sum == 0, inter, sets_sum)
dice = (inter + epsilon) / (_______ + epsilon)
return dice._______()
class BasicDataset(Dataset):
def __init__(self, images_dir: str, mask_dir: str, scale: float = 1.0, mask_suffix: str = ''):
self.images_dir = Path(images_dir)
self.mask_dir = Path(mask_dir)
assert 0 < scale <= 1, 'Scale must be between 0 and 1'
self.scale = scale
self.mask_suffix = mask_suffix
self.ids = [splitext(file)[0] for file in listdir(images_dir) if isfile(join(images_dir, file)) and not file.startswith('.')]
if not self.ids:
raise RuntimeError(f'No input file found in {images_dir}, make sure you put your images there')
# 其他初始化代码...
def __len__(self):
return len(self.________)
@staticmethod
def preprocess(mask_values, pil_img, scale, is_mask):
w, h = pil_img._______
newW, newH = int(scale * w), int(scale * h)
assert newW > 0 and newH > 0, 'Scale is too small, resized images would have no pixel'
pil_img = pil_img.resize((newW, newH), resample=Image._______ if is_mask else Image._______)
img = np.asarray(pil_img)
# 图像预处理代码...
return img
def __getitem__(self, idx):
name = self.ids[idx]
mask_file = list(self.mask_dir.glob(name + self.mask_suffix + '.*'))
img_file = list(self.images_dir.glob(name + '.*'))
# 加载和预处理图像和掩码...
return {
'image': torch.as_tensor(img.copy()).float().contiguous(),
'mask': torch.as_tensor(mask.copy())._______.contiguous()
}

Trae CN


cursor
基于我对PyTorch UNet项目的分析,我将为您创建一个以算法模型为重点的完型填空学习模板。这个模板将帮助您逐步理解U-Net的核心架构和实现细节。
## U-Net算法模型学习模板
### 第一部分:网络架构理解
#### 1. U-Net整体结构填空
```
U-Net是一个_______架构的卷积神经网络,主要用于_______任务。
整个网络包含_______个下采样层和_______个上采样层,形成_______形状的网络结构。
网络的核心思想是通过_______连接将低层特征与高层特征融合,保留_______信息。
```
**答案提示:**
- 编码器-解码器
- 语义分割
- 4, 4, U
- 跳跃, 空间
#### 2. 网络深度和通道数填空
```
编码器部分(下采样)的通道数变化:
输入层:_______通道 → 第1层:_______通道 → 第2层:_______通道 → 第3层:_______通道 → 第4层:_______通道
解码器部分(上采样)的通道数变化:
第4层:_______通道 → 第3层:_______通道 → 第2层:_______通道 → 第1层:_______通道 → 输出层:_______通道
```
**答案提示:**
- 3, 64, 128, 256, 512, 1024
- 1024, 512, 256, 128, 64, n_classes
### 第二部分:核心模块实现
#### 3. DoubleConv模块填空
```python
class DoubleConv(nn.Module):
"""(convolution => [BN] => ReLU) * 2"""
def __init__(self, in_channels, out_channels, mid_channels=None):
super().__init__()
if not mid_channels:
mid_channels = _______ # 如果没有指定中间通道数,使用什么值?
self.double_conv = nn.Sequential(
# 第一个卷积块
nn.Conv2d(_______, _______, kernel_size=3, padding=1, bias=False),
nn.BatchNorm2d(_______),
nn.ReLU(inplace=True),
# 第二个卷积块
nn.Conv2d(_______, _______, kernel_size=3, padding=1, bias=False),
nn.BatchNorm2d(_______),
nn.ReLU(inplace=True)
)
```
**答案提示:**
- out_channels
- in_channels, mid_channels, mid_channels
- mid_channels, out_channels, out_channels
#### 4. Down模块填空
```python
class Down(nn.Module):
"""下采样:最大池化 + 双卷积"""
def __init__(self, in_channels, out_channels):
super().__init__()
self.maxpool_conv = nn.Sequential(
nn.MaxPool2d(_______), # 池化核大小
DoubleConv(_______, _______) # 输入和输出通道数
)
def forward(self, x):
return self.maxpool_conv(x)
```
**答案提示:**
- 2
- in_channels, out_channels
#### 5. Up模块填空
```python
class Up(nn.Module):
"""上采样:上采样 + 双卷积"""
def __init__(self, in_channels, out_channels, bilinear=True):
super().__init__()
if bilinear:
# 双线性插值上采样
self.up = nn.Upsample(scale_factor=_______, mode='bilinear', align_corners=True)
self.conv = DoubleConv(_______, _______, _______ // 2)
else:
# 转置卷积上采样
self.up = nn.ConvTranspose2d(_______, _______ // 2, kernel_size=2, stride=2)
self.conv = DoubleConv(_______, _______)
def forward(self, x1, x2):
x1 = self.up(x1)
# 处理尺寸不匹配问题
diffY = x2.size()[2] - x1.size()[2]
diffX = x2.size()[3] - x1.size()[3]
# 填充处理
x1 = F.pad(x1, [diffX // 2, diffX - diffX // 2,
diffY // 2, diffY - diffY // 2])
# 特征融合:在通道维度上拼接
x = torch.cat([_______, _______], dim=1)
return self.conv(x)
```
**答案提示:**
- 2
- in_channels, out_channels, in_channels
- in_channels, in_channels
- in_channels, out_channels
- x2, x1
### 第三部分:完整网络组装
#### 6. UNet主网络填空
```python
class UNet(nn.Module):
def __init__(self, n_channels, n_classes, bilinear=False):
super(UNet, self).__init__()
self.n_channels = n_channels # 输入图像通道数
self.n_classes = n_classes # 输出类别数
self.bilinear = bilinear # 是否使用双线性插值
# 编码器部分(下采样)
self.inc = DoubleConv(_______, 64) # 输入层
self.down1 = Down(64, _______) # 第1层下采样
self.down2 = Down(128, _______) # 第2层下采样
self.down3 = Down(256, _______) # 第3层下采样
factor = 2 if bilinear else 1
self.down4 = Down(512, _______ // factor) # 第4层下采样
# 解码器部分(上采样)
self.up1 = Up(1024, _______ // factor, bilinear) # 第1层上采样
self.up2 = Up(512, _______ // factor, bilinear) # 第2层上采样
self.up3 = Up(256, _______ // factor, bilinear) # 第3层上采样
self.up4 = Up(128, _______, bilinear) # 第4层上采样
# 输出层
self.outc = OutConv(_______, n_classes)
def forward(self, x):
# 编码器前向传播
x1 = self.inc(x) # 输入层
x2 = self.down1(x1) # 第1层下采样
x3 = self.down2(x2) # 第2层下采样
x4 = self.down3(x3) # 第3层下采样
x5 = self.down4(x4) # 第4层下采样
# 解码器前向传播(注意跳跃连接)
x = self.up1(_______, _______) # 第1层上采样,连接x4
x = self.up2(_______, _______) # 第2层上采样,连接x3
x = self.up3(_______, _______) # 第3层上采样,连接x2
x = self.up4(_______, _______) # 第4层上采样,连接x1
# 输出层
logits = self.outc(x)
return logits
```
**答案提示:**
- n_channels
- 128, 256, 512
- 1024
- 512, 256, 128, 64
- 64
- x5, x4
- x, x3
- x, x2
- x, x1
### 第四部分:关键概念理解
#### 7. 跳跃连接的作用填空
```
跳跃连接(Skip Connection)的作用:
1. _______:将低层特征直接传递给高层,避免信息丢失
2. _______:帮助梯度在反向传播时更好地流动,缓解梯度消失问题
3. _______:保留更多的空间细节信息,提高分割精度
4. _______:使网络能够同时利用局部和全局特征信息
```
**答案提示:**
- 信息保留
- 梯度传播
- 细节保持
- 特征融合
#### 8. 网络设计优势填空
```
U-Net相比传统CNN的优势:
1. _______:通过编码器-解码器结构实现像素级预测
2. _______:跳跃连接保留空间信息,适合医学图像等需要精确定位的任务
3. _______:网络结构对称,易于理解和实现
4. _______:参数量相对较少,训练效率高
```
**答案提示:**
- 端到端分割
- 空间信息保持
- 结构清晰
- 计算效率
### 使用说明
1. **逐步填写**:按照顺序完成每个部分的填空
2. **理解原理**:每完成一个部分,思考其在整个网络中的作用
3. **代码验证**:填写完成后,可以运行代码验证正确性
4. **扩展学习**:理解基础结构后,可以尝试修改网络参数或添加新功能
这个模板将帮助您深入理解U-Net的核心原理和实现细节,为后续的深度学习项目打下坚实基础。
在这项任务中,cursor除了给出模板外还附加了答案,这点对于初学者很有用,另外两者则只是给出了答案,其实从实用角度看,都差不多,毕竟原始代码是有的,但就怕对比。。。这项投给cursor。
三、总结
目前只是简单使用了几个IDE,得到的想法很主观,等之后更深入的使用后再做一个尽可能详细的,标准化的测评吧,仅从使用来看,我更倾向于Code Buddy和Trae CN,cursor据说很好用,但根据注册时免费pro体验的那一段时间来看,我用的不是很习惯,Trae CN我一直想试试SOLO模型,但很明显没拿到邀请码,Code Buddy是前几天刚知道的,内测码是最容易申请到的,是用它来学习rust的,用的很起劲,不知道是我个人想学rust的意愿强烈,还是Code Buddy更符合我的习惯,其实无论别人怎么说,适合自己的才是最好的。
四、邀请码获取方式
时间:2025 年 8 月 4日 00:00-2025年 8 月20 日 24:00 (还有3天哦,想要体验的及时扫码进群领取内测邀请码哦)
活动详情见下方链接:
官方作者群二维码也贴在下方哦:(和上方链接中的二维码一致哦)
