deep learning实践经验总结2--准确率再次提升,到达0.8,再来总结一下

本文分享了使用Caffe进行图片分类的实际经验,特别是在调整全连接层初始化参数后的显著改进。通过对大摆裙与一步裙的分类任务,展示了如何通过减小高斯分布的标准差来提高分类准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

deep learning实践经验总结2


最近拿caffe来做图片分类,遇到不少问题,同时也吸取不少教训和获得不少经验。



这次拿大摆裙和一步裙做分类,

多次训练效果一直在0.7,后来改动了全链接层的初始化参数。高斯分布的标准差由0.001改为0.0001,就是调小了。

然后效果很明显,准确率高了,权重图画出来后,也看得出是有意义的了,部分权重图是人的轮廓或者裙子的轮廓。


先看看图片:

大摆裙

    


一步裙

    


然后找一些响应图看一下,当然我这里展示的是一些效果好的响应图。

大摆裙

     

一步裙

     


一些权重图:

    


    

    


这是网络的结构参数:

name: "CIFAR10_full_train"
layers {
 layer {
   name: "cifar"
   type: "data"
   #source: "/home/linger/linger/testfile/crop_train_db"
   #source: "/home/linger/linger/testfile/collar_train_db"
   source: "/home/linger/linger/testfile/skirt_train_db"
   #source: "/home/linger/linger/testfile/pattern_train_db"
   meanfile: "/home/linger/linger/testfile/skirt_train_mean.binaryproto"
   #cropsize: 200
   batchsize: 20
 }
 top: "data"
 top: "label"
}

layers {
  layer {
    name: "conv1"
    type: "conv"
    num_output: 16
    kernelsize: 5
    stride:1 
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.
    }
    blobs_lr: 1.
    blobs_lr: 1.
    weight_decay: 0.001
    weight_decay: 0.
  }
  bottom: "data"
  top: "conv1"
}
layers {
  layer {
    name: "relu1"
    type: "relu"
  }
  bottom: "conv1"
  top: "conv1"
}
layers {
  layer {
    name: "pool1"
    type: "pool"
    pool: MAX
    kernelsize: 2
    stride:1 
  }
  bottom: "conv1"
  top: "pool1"
}
layers {
  layer {
    name: "conv2"
    type: "conv"
    num_output: 16
    group: 2
    kernelsize: 5
    stride:1 
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.
    }
    blobs_lr: 1.
    blobs_lr: 1.
    weight_decay: 0.001
    weight_decay: 0.
  }
  bottom: "pool1"
  top: "conv2"
}
layers {
  layer {
    name: "relu2"
    type: "relu"
  }
  bottom: "conv2"
  top: "conv2"
}
layers {
  layer {
    name: "pool2"
    type: "pool"
    pool: MAX
    kernelsize: 2
    stride: 1
  }
  bottom: "conv2"
  top: "pool2"
}

layers {
  layer {
    name: "ip1"
    type: "innerproduct"
    num_output: 100
    weight_filler {
      type: "gaussian"
      std: 0.0001
    }
    bias_filler {
      type: "constant"
      value: 0.
    }
    blobs_lr: 1.
    blobs_lr: 1.
    weight_decay: 0.001
    weight_decay: 0.
  }
  bottom: "pool2"
  top: "ip1"
}

layers {
  layer {
    name: "ip2"
    type: "innerproduct"
    num_output: 2
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.
    }
    blobs_lr: 1.
    blobs_lr: 1.
    weight_decay: 0.001
    weight_decay: 0.
  }
  bottom: "ip1"
  top: "ip2"
}

#-----------------------output------------------------
layers {
 layer {
   name: "loss"
   type: "softmax_loss"
 }
 bottom: "ip2"
 bottom: "label"
}



name: "CIFAR10_full_test"
layers {
 layer {
   name: "cifar"
   type: "data"
   #source: "/home/linger/linger/testfile/collar_test_db"
   #source: "/home/linger/linger/testfile/crop_test_db"
   source: "/home/linger/linger/testfile/skirt_test_db"
   #source: "/home/linger/linger/testfile/pattern_test_db"
   meanfile: "/home/linger/linger/testfile/skirt_test_mean.binaryproto"
   #cropsize: 200
   batchsize: 10
 }
 top: "data"
 top: "label"
}

layers {
  layer {
    name: "conv1"
    type: "conv"
    num_output: 16
    kernelsize: 5
    stride:1 
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.
    }
    blobs_lr: 1.
    blobs_lr: 1.
    weight_decay: 0.001
    weight_decay: 0.
  }
  bottom: "data"
  top: "conv1"
}
layers {
  layer {
    name: "relu1"
    type: "relu"
  }
  bottom: "conv1"
  top: "conv1"
}
layers {
  layer {
    name: "pool1"
    type: "pool"
    pool: MAX
    kernelsize: 2
    stride:1 
  }
  bottom: "conv1"
  top: "pool1"
}
layers {
  layer {
    name: "conv2"
    type: "conv"
    num_output: 16
    group: 2
    kernelsize: 5
    stride:1 
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.
    }
    blobs_lr: 1.
    blobs_lr: 1.
    weight_decay: 0.001
    weight_decay: 0.
  }
  bottom: "pool1"
  top: "conv2"
}
layers {
  layer {
    name: "relu2"
    type: "relu"
  }
  bottom: "conv2"
  top: "conv2"
}
layers {
  layer {
    name: "pool2"
    type: "pool"
    pool: MAX
    kernelsize: 2
    stride: 1
  }
  bottom: "conv2"
  top: "pool2"
}
layers {
  layer {
    name: "ip1"
    type: "innerproduct"
    num_output: 100
    weight_filler {
      type: "gaussian"
      std: 0.0001
    }
    bias_filler {
      type: "constant"
      value: 0.
    }
    blobs_lr: 1.
    blobs_lr: 1.
    weight_decay: 0.001
    weight_decay: 0.
  }
  bottom: "pool2"
  top: "ip1"
}

layers {
  layer {
    name: "ip2"
    type: "innerproduct"
    num_output: 2
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.
    }
    blobs_lr: 1.
    blobs_lr: 1.
    weight_decay: 0.001
    weight_decay: 0.
  }
  bottom: "ip1"
  top: "ip2"
}

#-----------------------output------------------------
layers {
 layer {
   name: "prob"
   type: "softmax"
 }
 bottom: "ip2"
 top: "prob"
}
layers {
  layer {
    name: "accuracy"
    type: "accuracy"
  }
  bottom: "prob"
  bottom: "label"
  top: "accuracy"
}


# reduce learning rate after 120 epochs (60000 iters) by factor 0f 10
# then another factor of 10 after 10 more epochs (5000 iters)

# The training protocol buffer definition
train_net: "cifar10_full_train.prototxt"
# The testing protocol buffer definition
test_net: "cifar10_full_test.prototxt"
# test_iter specifies how many forward passes the test should carry out.
# In the case of CIFAR10, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.
test_iter: 20
# Carry out testing every 1000 training iterations.
test_interval: 100
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.00001
momentum: 0.9
weight_decay: 0.004
# The learning rate policy
lr_policy: "fixed"
# Display every 200 iterations
display: 20
# The maximum number of iterations
max_iter: 60000
# snapshot intermediate results
snapshot: 1000
snapshot_prefix: "cifar10_full"
# solver mode: 0 for CPU and 1 for GPU
solver_mode: 1


真的是多玩数据,才会对数据形成一种感觉啊。

下次玩3类的。敬请期待!





<think>我们正在处理个关于使用Qwen大模型训练TSB-AD-U数据集的问题。首先,我们需要明确几个关键点: 1. TSB-AD-U数据集是什么?根据名称,它可能与时间序列数据(Time Series Data)和异常检测(Anomaly Detection)有关,但具体需要确认。 2. Qwen大模型:通常指阿里云推出的通义千问(Qwen)系列大型语言模型(LLM),包括不同规模的版本(如Qwen-1.8B, Qwen-7B, Qwen-14B等)。注意,LLM通常是针对自然语言处理的,而时间序列数据是数值型数据,因此可能需要调整模型结构或数据表示。 由于问题中没有提供TSB-AD-U数据集的详细信息,我们假设这是个公开的时间序列异常检测数据集。如果没有现成的信息,我们可以推测训练步骤大致如下: ### 步骤1: 数据准备 - 加载TSB-AD-U数据集,通常包含多个时间序列,每个时间序列可能有多维特征,并标注了异常点或异常段。 - 预处理:数据清洗、归化、缺失值处理等。 - 将时间序列数据转化为适合大模型输入的格式。对于LLM,通常需要将数值序列转化为文本序列(例如,将每个时间步的数值转化为token),或者使用其他方法(如使用时间序列特征提取器将数据转化为特征向量,再输入LLM)。 ### 步骤2: 模型选择 - 选择Qwen系列中的个模型作为基础模型。考虑到计算资源,可以选择较小版本(如Qwen-1.8B)进行初步实验。 - 由于Qwen是语言模型,处理时间序列数据需要调整: - 方法1:将时间序列数据转换为文本描述(例如,将每个时间点的数值用自然语言描述,形成段文本),然后进行微调。但这种方法可能丢失数值精度。 - 方法2:使用个时间序列编码器(如Transformer Encoder)将时间序列数据编码为特征向量,然后输入到Qwen的中间层(例如,作为额外的输入嵌入)。这需要修改模型结构。 - 方法3:将时间序列数据分段,每段数据转化为维向量,然后通过个线性层映射到与Qwen词嵌入相同的维度,再输入到Qwen的Transformer中。这样,时间序列数据被当作个特殊的“语言”来处理。 ### 步骤3: 模型微调 - 目标:使Qwen能够理解时间序列数据并检测异常。 - 任务定义:通常时间序列异常检测可以视为序列标注问题(每个时间点是否异常)或序列分类问题(整个序列是否包含异常)。 - 损失函数:对于序列标注,可以使用二分类交叉熵;对于序列分类,可以使用交叉熵损失。 - 训练:在训练集上微调模型,使用优化器(如AdamW)和适当的学习率。 ### 步骤4: 评估 - 使用验证集和测试集评估模型性能,常用指标包括精确率、召回率、F1分数、AUC等。 ### 注意事项 - 计算资源:大模型训练需要大量GPU资源,确保有足够的计算能力。 - 数据规模:如果数据集较小,可能需要使用数据增强或迁移学习来避免过拟合。 由于具体细节(如数据集格式、任务要求)不明确,以上为般性步骤。下面提供个概念性代码框架: ```python import torch from transformers import AutoModel, AutoTokenizer, TrainingArguments, Trainer # 假设我们已经将时间序列数据转化为特征向量序列,并处理成模型输入格式 # 例如,每个时间步的数值被转化为个向量,然后通过个线性层映射到嵌入空间 class QwenTimeSeriesModel(torch.nn.Module): def __init__(self, base_model_name="Qwen/Qwen-1_8B"): super().__init__() self.base_model = AutoModel.from_pretrained(base_model_name) self.input_proj = torch.nn.Linear(time_series_feature_dim, self.base_model.config.hidden_size) self.classifier = torch.nn.Linear(self.base_model.config.hidden_size, 2) # 二分类:正常/异常 def forward(self, time_series_input, attention_mask=None, labels=None): # time_series_input: [batch_size, seq_len, feature_dim] inputs_embeds = self.input_proj(time_series_input) # [batch_size, seq_len, hidden_size] outputs = self.base_model(inputs_embeds=inputs_embeds, attention_mask=attention_mask) sequence_output = outputs.last_hidden_state # [batch_size, seq_len, hidden_size] logits = self.classifier(sequence_output) # [batch_size, seq_len, 2] loss = None if labels is not None: loss_fct = torch.nn.CrossEntropyLoss() loss = loss_fct(logits.view(-1, 2), labels.view(-1)) return (loss, logits) if loss is not None else logits # 数据加载和预处理(伪代码) def load_and_preprocess_data(): # 加载TSB-AD-U数据集 # 返回训练集、验证集:包括时间序列数据和标签 pass # 训练 model = QwenTimeSeriesModel() training_args = TrainingArguments( output_dir='./results', num_train_epochs=5, per_device_train_batch_size=4, per_device_eval_batch_size=4, logging_dir='./logs', logging_steps=10, evaluation_strategy="epoch", save_strategy="epoch", load_best_model_at_end=True, ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, # 需要自定义数据集类 eval_dataset=val_dataset, # 可以自定义compute_metrics函数来评估 ) trainer.train() ``` ### 相关问题 1. TSB-AD-U数据集的具体结构是什么?包含哪些字段? 2. 如何将时间序列数据转换为适合Qwen模型的输入? 3. 在微调Qwen模型时,如何避免过拟合? 4. 除了分类方法,还有哪些时间序列异常检测的建模方式? 5. 如何评估时间序列异常检测模型的性能?</think>### 使用Qwen大模型训练TSB-AD-U数据集的指南 #### 1. **数据预处理** - **格式转换**:将TSB-AD-U数据集(时间序列异常检测数据)转换为Qwen兼容的文本格式。例如,将时间戳、传感器值和标签转化为自然语言描述: `"2023-01-01 12:00:00, 传感器A=25.6, 传感器B=0.8, 标签=正常"` - **归化处理**:对数值型特征进行标准化(如Z-score归化),公式: $$ x' = \frac{x - \mu}{\sigma} $$ 其中$\mu$为均值,$\sigma$为标准差[^1]。 - **序列分段**:将长时序列切分为固定长度片段(如256个时间步),作为模型输入单元。 #### 2. **模型选择与配置** - **模型版本**:推荐使用**Qwen-7B**(70亿参数)或其微调版本,平衡性能与计算需求。 - **输入适配**: - 在Embedding层前添加线性投影层,将数值特征映射到词向量空间。 - 添加特殊标记如`[SENSOR]`、`[ANOMALY]`标识数据域。 - **训练模式**:采用**指令微调(Instruction Tuning)**,构造任务提示: `"根据传感器数据判断是否异常:{数据片段} → 答案:"` #### 3. **训练流程** ```python from transformers import AutoModelForCausalLM, Trainer # 加载预训练模型 model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-7B") # 添加自定义投影层(假设输入维度为10) model.resize_token_embeddings(model.config.vocab_size + 1) # 新增特殊token model.model.embed_tokens.proj = torch.nn.Linear(10, model.config.hidden_size) # 配置训练参数 training_args = TrainingArguments( output_dir="./results", per_device_train_batch_size=8, num_train_epochs=10, learning_rate=5e-5, fp16=True # 启用混合精度 ) # 启动训练 trainer = Trainer( model=model, args=training_args, train_dataset=dataset # 预处理后的数据集 ) trainer.train() ``` #### 4. **性能优化技巧** - **知识蒸馏**:用大型模型(如Qwen-14B)的输出作为软标签,训练轻量版模型。 - **混合精度训练**:使用`fp16`或`bf16`减少显存占用。 - **梯度累积**:通过`gradient_accumulation_steps`模拟更大batch size。 - **LoRA微调**:冻结原模型权重,仅训练低秩适配矩阵,显著减少参数量[^2]。 #### 5. **评估与部署** - **评估指标**: - 准确率:$$ \text{Accuracy} = \frac{TP+TN}{TP+TN+FP+FN} $$ - F1分数:$$ F1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} $$ - **部署方案**: - 使用**vLLM**框架实现高并发推理 - 通过OpenAI格式API暴露服务: `POST /v1/completions { "prompt": "传感器数据...", "max_tokens": 5 }` #### 6. **注意事项** - **数据偏差**:TSB-AD-U中异常样本较少,需采用过采样(SMOTE)或加权损失函数。 - **领域适配**:若数据含专业术语(如工业设备名称),需扩展词表并继续预训练。 - **计算资源**:Qwen-7B训练需至少4×A10080G)GPU,推荐使用阿里云PAI平台。 --- ### 相关问题 1. 如何处理TSB-AD-U数据中的类别不平衡问题? 2. 在资源受限环境下如何优化Qwen大模型的训练效率? 3. 如何将时间序列数据有效转化为自然语言描述? 4. 微调后的模型如何部署到边缘设备(如工业传感器网关)? 5. 除了准确率,还有哪些指标适合评估时间序列异常检测模型? [^1]: 归化处理可提升模型收敛速度,参考《Deep Learning》Chapter 8.1. [^2]: LoRA微调方法详见论文《LORA: Low-Rank Adaptation of Large Language Models》.
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值