【Bug已解决】Understanding input shape to PyTorch conv1D? 解决方案
【Bug已解决】Understanding input shape to PyTorch conv1D? 解决方案问题描述在 PyTorch 中使用nn.Conv1d进行一维卷积时输入张量的形状shape是一个经常让开发者困惑的问题。与 TensorFlow/Keras 不同PyTorch 的卷积层对输入维度有特定的要求理解不当会导致维度不匹配的错误。nn.Conv1d期望的输入形状是(batch_size, in_channels, sequence_length)但许多开发者习惯于使用(batch_size, sequence_length, features)或(sequence_length, features)的格式导致各种维度错误。典型报错信息RuntimeError: Given groups1, weight of size [64, 3, 3], expected input with at least 2 dimensions and 3 channels, but got input of size [32, 100, 50]或者RuntimeError: Expected 3-dimensional (unbatched) or 4-dimensional (batched) input to conv1d, but got input of size [32, 100].错误复现复现场景一维度顺序错误import torch import torch.nn as nn # 创建 Conv1d conv nn.Conv1d(in_channels3, out_channels64, kernel_size3) # 错误输入形状为 (batch, seq_len, channels) - 这是 TensorFlow 的格式 x torch.randn(32, 100, 3) # batch32, seq_len100, channels3 try: output conv(x) except RuntimeError as e: print(f错误: {e}) # Conv1d 期望 (batch, channels, seq_len)但收到了 (batch, seq_len, channels)复现场景二缺少 batch 维度import torch import torch.nn as nn conv nn.Conv1d(in_channels3, out_channels64, kernel_size3) # 错误只有2维缺少 batch 维度 x torch.randn(100, 3) # seq_len100, channels3 try: output conv(x) except RuntimeError as e: print(f错误: {e}) # Expected 3-dimensional input, but got 2-dimensional复现场景三通道数不匹配import torch import torch.nn as nn conv nn.Conv1d(in_channels3, out_channels64, kernel_size3) # 错误输入通道数与 Conv1d 定义的 in_channels 不匹配 x torch.randn(32, 5, 100) # in_channels5但 Conv1d 期望 3 try: output conv(x) except RuntimeError as e: print(f错误: {e}) # expected 3 channels but got 5根因分析1. PyTorch Conv1d 的输入格式nn.Conv1d的输入必须是3维张量输入: (N, C_in, L) N batch_size批大小 C_in in_channels输入通道数 L sequence_length序列长度 输出: (N, C_out, L_out) N batch_size C_out out_channels输出通道数 L_out floor((L 2*padding - kernel_size) / stride) 12. 与 TensorFlow/Keras 的区别TensorFlow/Keras Conv1D 输入: (batch, steps, channels) PyTorch Conv1d 输入: (batch, channels, steps)维度顺序不同是导致混淆的主要原因。在 TensorFlow 中通道维度在最后在 PyTorch 中通道维度在中间。3. 通道维度的含义对于不同类型的数据通道的含义不同文本数据NLP(batch, embedding_dim, seq_len) 通道 embedding_dim词向量的维度 序列长度 句子中的词数时间序列数据(batch, num_features, time_steps) 通道 特征数量如温度、湿度、气压等 序列长度 时间步数音频数据(batch, audio_channels, audio_length) 通道 音频通道数单声道1立体声2 序列长度 音频采样点数4. 输出长度的计算L_out floor((L_in 2 * padding - dilation * (kernel_size - 1) - 1) / stride) 1简化版本dilation1L_out floor((L_in 2 * padding - kernel_size) / stride) 1解决方案方案一使用 permute 调整维度顺序import torch import torch.nn as nn # 假设数据格式为 (batch, seq_len, channels) - TensorFlow 风格 x torch.randn(32, 100, 3) # batch32, seq_len100, channels3 # 使用 permute 将通道维度移到中间 x_corrected x.permute(0, 2, 1) # (32, 3, 100) - PyTorch 格式 conv nn.Conv1d(in_channels3, out_channels64, kernel_size3, padding1) output conv(x_corrected) print(f输出形状: {output.shape}) # (32, 64, 100)方案二使用 unsqueeze 添加 batch 维度import torch import torch.nn as nn # 单个样本没有 batch 维度 x torch.randn(100, 3) # (seq_len, channels) # 添加 batch 维度并调整通道顺序 x_batched x.unsqueeze(0) # (1, 100, 3) x_corrected x_batched.permute(0, 2, 1) # (1, 3, 100) conv nn.Conv1d(in_channels3, out_channels64, kernel_size3, padding1) output conv(x_corrected) print(f输出形状: {output.shape}) # (1, 64, 100)方案三在 forward 中自动处理import torch import torch.nn as nn class TextCNN(nn.Module): 文本分类 CNN自动处理输入维度 def __init__(self, vocab_size, embed_dim, num_classes, kernel_sizes[3, 4, 5]): super().__init__() self.embedding nn.Embedding(vocab_size, embed_dim) # 多尺度卷积 self.convs nn.ModuleList([ nn.Conv1d(embed_dim, 128, kernel_sizek, paddingk//2) for k in kernel_sizes ]) self.fc nn.Linear(128 * len(kernel_sizes), num_classes) def forward(self, x): Args: x: (batch, seq_len) - 词索引序列 # 嵌入: (batch, seq_len) - (batch, seq_len, embed_dim) embedded self.embedding(x) # 调整维度: (batch, seq_len, embed_dim) - (batch, embed_dim, seq_len) embedded embedded.permute(0, 2, 1) # 多尺度卷积 conv_outputs [] for conv in self.convs: conv_out conv(embedded) # (batch, 128, seq_len) # 全局最大池化 pooled torch.max(conv_out, dim2)[0] # (batch, 128) conv_outputs.append(pooled) # 拼接所有尺度的特征 combined torch.cat(conv_outputs, dim1) # (batch, 128*len(kernel_sizes)) # 分类 return self.fc(combined) # 使用示例 model TextCNN(vocab_size10000, embed_dim300, num_classes5) x torch.randint(0, 10000, (32, 100)) # (batch, seq_len) output model(x) print(f输出形状: {output.shape}) # (32, 5)完整修复代码 PyTorch Conv1d 输入形状完整指南 涵盖NLP、时间序列、音频处理等场景 import torch import torch.nn as nn import torch.nn.functional as F from typing import List, Tuple, Optional # 工具函数 def ensure_conv1d_input(x: torch.Tensor, expected_channels: int) - torch.Tensor: 确保输入张量符合 Conv1d 的要求: (batch, channels, seq_len) Args: x: 输入张量可能是以下格式之一: - (batch, channels, seq_len) - 已正确 - (batch, seq_len, channels) - 需要转置 - (channels, seq_len) - 需要添加 batch 维度 - (seq_len, channels) - 需要添加 batch 维度并转置 expected_channels: 期望的通道数 Returns: (batch, channels, seq_len) 格式的张量 if x.dim() 2: # 添加 batch 维度 x x.unsqueeze(0) if x.dim() 3: # 检查哪个维度是通道 # 如果最后一维是 expected_channels需要转置 if x.size(-1) expected_channels: x x.permute(0, 2, 1) # (batch, seq_len, channels) - (batch, channels, seq_len) elif x.size(1) expected_channels: pass # 已经是正确格式 else: raise ValueError( f无法确定通道维度。输入形状: {x.shape}, f期望通道数: {expected_channels} ) else: raise ValueError(f输入维度应为2或3但得到 {x.dim()}) return x.contiguous() def compute_conv1d_output_length( input_length: int, kernel_size: int, stride: int 1, padding: int 0, dilation: int 1 ) - int: 计算 Conv1d 输出序列长度 return (input_length 2 * padding - dilation * (kernel_size - 1) - 1) // stride 1 # 模型一文本分类 CNN class TextClassifier(nn.Module): 基于 Conv1d 的文本分类器 输入: (batch, seq_len) - 词索引 输出: (batch, num_classes) - 类别概率 def __init__( self, vocab_size: int, embed_dim: int, num_classes: int, num_filters: int 128, kernel_sizes: List[int] [3, 4, 5], dropout: float 0.3 ): super().__init__() self.embedding nn.Embedding(vocab_size, embed_dim, padding_idx0) # 多尺度一维卷积 self.convs nn.ModuleList([ nn.Conv1d(embed_dim, num_filters, kernel_sizek) for k in kernel_sizes ]) self.dropout nn.Dropout(dropout) self.fc nn.Linear(num_filters * len(kernel_sizes), num_classes) def forward(self, x): Args: x: (batch, seq_len) - 词索引序列 # 嵌入: (batch, seq_len) - (batch, seq_len, embed_dim) embedded self.embedding(x) # 关键调整维度顺序 # (batch, seq_len, embed_dim) - (batch, embed_dim, seq_len) embedded embedded.permute(0, 2, 1) # 多尺度卷积 全局最大池化 conv_results [] for conv in self.convs: conv_out F.relu(conv(embedded)) # (batch, num_filters, seq_len) # 全局最大池化: (batch, num_filters, seq_len) - (batch, num_filters) pooled F.max_pool1d(conv_out, conv_out.size(2)).squeeze(2) conv_results.append(pooled) # 拼接: (batch, num_filters * len(kernel_sizes)) combined torch.cat(conv_results, dim1) # 分类 combined self.dropout(combined) return self.fc(combined) # 模型二时间序列预测 class TimeSeriesModel(nn.Module): 基于 Conv1d 的时间序列预测模型 输入: (batch, num_features, seq_len) 输出: (batch, forecast_horizon) def __init__( self, num_features: int, hidden_dim: int 64, num_layers: int 3, forecast_horizon: int 1, kernel_size: int 3 ): super().__init__() layers [] in_channels num_features for i in range(num_layers): layers.append(nn.Conv1d( in_channels, hidden_dim, kernel_sizekernel_size, paddingkernel_size // 2 )) layers.append(nn.BatchNorm1d(hidden_dim)) layers.append(nn.ReLU()) in_channels hidden_dim self.conv_layers nn.Sequential(*layers) self.global_pool nn.AdaptiveAvgPool1d(1) self.fc nn.Linear(hidden_dim, forecast_horizon) def forward(self, x): Args: x: (batch, num_features, seq_len) # Conv1d: (batch, num_features, seq_len) - (batch, hidden_dim, seq_len) conv_out self.conv_layers(x) # 全局平均池化: (batch, hidden_dim, seq_len) - (batch, hidden_dim, 1) pooled self.global_pool(conv_out).squeeze(-1) # 预测: (batch, hidden_dim) - (batch, forecast_horizon) return self.fc(pooled) # 模型三一维残差网络 class ResidualBlock1D(nn.Module): 一维残差块 def __init__(self, channels, kernel_size3, dilation1): super().__init__() padding dilation * (kernel_size - 1) // 2 self.conv1 nn.Conv1d(channels, channels, kernel_size, paddingpadding, dilationdilation) self.bn1 nn.BatchNorm1d(channels) self.conv2 nn.Conv1d(channels, channels, kernel_size, paddingpadding, dilationdilation) self.bn2 nn.BatchNorm1d(channels) self.relu nn.ReLU() def forward(self, x): Args: x: (batch, channels, seq_len) residual x out self.relu(self.bn1(self.conv1(x))) out self.bn2(self.conv2(out)) return self.relu(out residual) class ResNet1D(nn.Module): 一维残差网络用于序列分类 def __init__( self, in_channels: int, num_classes: int, hidden_dim: int 64, num_blocks: int 3 ): super().__init__() # 初始卷积 self.input_conv nn.Sequential( nn.Conv1d(in_channels, hidden_dim, 7, stride2, padding3), nn.BatchNorm1d(hidden_dim), nn.ReLU(), nn.MaxPool1d(3, stride2, padding1) ) # 残差块 self.res_blocks nn.Sequential(*[ ResidualBlock1D(hidden_dim) for _ in range(num_blocks) ]) # 分类头 self.global_pool nn.AdaptiveAvgPool1d(1) self.fc nn.Linear(hidden_dim, num_classes) def forward(self, x): Args: x: (batch, in_channels, seq_len) x self.input_conv(x) x self.res_blocks(x) x self.global_pool(x).squeeze(-1) return self.fc(x) # 模型四TCN (Temporal Convolutional Network) class TCNBlock(nn.Module): TCN 残差块使用膨胀卷积 def __init__(self, in_channels, out_channels, kernel_size, dilation, dropout0.2): super().__init__() padding (kernel_size - 1) * dilation # 因果卷积的 padding self.conv1 nn.Conv1d(in_channels, out_channels, kernel_size, paddingpadding, dilationdilation) self.conv2 nn.Conv1d(out_channels, out_channels, kernel_size, paddingpadding, dilationdilation) self.bn1 nn.BatchNorm1d(out_channels) self.bn2 nn.BatchNorm1d(out_channels) self.dropout nn.Dropout(dropout) self.relu nn.ReLU() # 如果输入输出通道不同使用 1x1 卷积对齐 self.downsample nn.Conv1d(in_channels, out_channels, 1) if in_channels ! out_channels else None def forward(self, x): Args: x: (batch, in_channels, seq_len) residual x # 第一个卷积因果卷积 - 只看过去的信息 out self.conv1(x) out out[:, :, :x.size(2)] # 截断到原始长度因果性 out self.relu(self.bn1(out)) out self.dropout(out) # 第二个卷积 out self.conv2(out) out out[:, :, :x.size(2)] out self.relu(self.bn2(out)) out self.dropout(out) # 残差连接 if self.downsample is not None: residual self.downsample(residual) return self.relu(out residual) class TCN(nn.Module): Temporal Convolutional Network def __init__( self, in_channels: int, num_classes: int, num_channels: List[int] [64, 64, 64, 64], kernel_size: int 3, dropout: float 0.2 ): super().__init__() layers [] for i in range(len(num_channels)): dilation 2 ** i # 指数增长的膨胀率 in_ch in_channels if i 0 else num_channels[i-1] out_ch num_channels[i] layers.append(TCNBlock(in_ch, out_ch, kernel_size, dilation, dropout)) self.network nn.Sequential(*layers) self.global_pool nn.AdaptiveAvgPool1d(1) self.fc nn.Linear(num_channels[-1], num_classes) def forward(self, x): Args: x: (batch, in_channels, seq_len) x self.network(x) x self.global_pool(x).squeeze(-1) return self.fc(x) # 综合演示 def demo_conv1d_shapes(): 演示 Conv1d 的各种输入形状处理 print( * 60) print(PyTorch Conv1d 输入形状演示) print( * 60) # 1. 基本形状 print(\n1. 基本形状:) conv nn.Conv1d(3, 64, kernel_size3, padding1) x torch.randn(32, 3, 100) # (batch, channels, seq_len) out conv(x) print(f 输入: {x.shape} - 输出: {out.shape}) # 2. 维度转换 print(\n2. 维度转换:) x_tf_style torch.randn(32, 100, 3) # TensorFlow 风格 x_pt_style x_tf_style.permute(0, 2, 1) # 转为 PyTorch 风格 out conv(x_pt_style) print(f TF风格: {x_tf_style.shape} - 转换: {x_pt_style.shape} - 输出: {out.shape}) # 3. 输出长度计算 print(\n3. 输出长度计算:) configs [ {kernel_size: 3, stride: 1, padding: 0}, {kernel_size: 3, stride: 1, padding: 1}, {kernel_size: 5, stride: 2, padding: 2}, {kernel_size: 3, stride: 1, padding: 0, dilation: 2}, ] input_len 100 for cfg in configs: out_len compute_conv1d_output_length(input_len, **cfg) conv nn.Conv1d(1, 1, **cfg) actual_out conv(torch.randn(1, 1, input_len)).size(-1) print(f {cfg} - 输出长度: {out_len} (实际: {actual_out})) # 4. 文本分类 print(\n4. 文本分类 CNN:) model TextClassifier(vocab_size10000, embed_dim300, num_classes5) x torch.randint(0, 10000, (32, 100)) # (batch, seq_len) out model(x) print(f 输入: {x.shape} - 输出: {out.shape}) # 5. 时间序列 print(\n5. 时间序列模型:) model TimeSeriesModel(num_features7, hidden_dim64, forecast_horizon5) x torch.randn(32, 7, 100) # (batch, features, time_steps) out model(x) print(f 输入: {x.shape} - 输出: {out.shape}) # 6. ResNet1D print(\n6. ResNet1D:) model ResNet1D(in_channels3, num_classes10, hidden_dim64) x torch.randn(32, 3, 200) # (batch, channels, seq_len) out model(x) print(f 输入: {x.shape} - 输出: {out.shape}) # 7. TCN print(\n7. TCN:) model TCN(in_channels3, num_classes10, num_channels[32, 64, 64, 64]) x torch.randn(32, 3, 200) out model(x) print(f 输入: {x.shape} - 输出: {out.shape}) # 8. 自动维度修正 print(\n8. 自动维度修正:) x_wrong torch.randn(32, 100, 3) # (batch, seq_len, channels) x_fixed ensure_conv1d_input(x_wrong, expected_channels3) print(f 修正前: {x_wrong.shape} - 修正后: {x_fixed.shape}) if __name__ __main__: demo_conv1d_shapes()常见陷阱与注意事项1. permute vs transpose# permute 可以同时调整多个维度 x torch.randn(32, 100, 3) # (batch, seq, channels) x x.permute(0, 2, 1) # (batch, channels, seq) - 正确 # transpose 只能交换两个维度 x x.transpose(1, 2) # 效果相同但只交换了维度1和22. padding 的计算# same padding输出长度输入长度 kernel_size 3 padding kernel_size // 2 # padding1 kernel_size 5 padding kernel_size // 2 # padding2 kernel_size 3, dilation 2 padding dilation * (kernel_size - 1) // 2 # padding23. groups 参数的影响# groups1: 标准卷积每个输出通道看所有输入通道 conv nn.Conv1d(3, 64, 3, groups1) # groups3: 分组卷积每个输出通道只看1个输入通道 conv nn.Conv1d(3, 66, 3, groups3) # 66必须能被3整除 # groupsin_channels: 深度卷积 conv nn.Conv1d(3, 3, 3, groups3, padding1)4. BatchNorm1d 的输入要求# BatchNorm1d 在 Conv1d 后使用时输入形状为 (batch, channels, seq_len) # channels 维度必须与 BatchNorm1d 的 num_features 一致 bn nn.BatchNorm1d(64) # 期望 64 个通道 conv nn.Conv1d(3, 64, 3) # 输出 64 个通道 x torch.randn(32, 3, 100) out bn(conv(x)) # 正确: (32, 64, 98)5. flatten 的维度# Conv1d 输出后展平 conv_out torch.randn(32, 64, 100) # (batch, channels, seq_len) # 错误直接 flatten 会混合通道和序列维度 flat_wrong conv_out.view(32, -1) # (32, 6400) - 通道和序列混合 # 正确先池化再展平 pooled F.adaptive_avg_pool1d(conv_out, 1).squeeze(-1) # (32, 64) # 或者保留通道维度 flat_right conv_out.view(32, 64, -1) # (32, 64, 100) - 保持通道总结PyTorchnn.Conv1d的输入形状要求为(batch_size, in_channels, sequence_length)这与 TensorFlow/Keras 的(batch, steps, channels)格式不同是导致维度错误的主要原因。理解 Conv1d 的关键要点维度顺序PyTorch 中通道维度在中间第1维不是在最后。使用permute(0, 2, 1)可以从(batch, seq, channels)转换为(batch, channels, seq)。通道的含义对于 NLP通道是词向量维度对于时间序列通道是特征数量对于音频通道是声道数。输出长度L_out (L_in 2*padding - kernel_size) / stride 1通过设置padding kernel_size // 2可以保持序列长度不变。因果卷积在时间序列预测中使用左侧 padding 并截断右侧确保只使用过去的信息。本文提供的四种模型TextCNN、时间序列模型、ResNet1D、TCN覆盖了 Conv1d 的主要应用场景每种模型都正确处理了输入形状的转换可以直接用于实际项目。

相关新闻

树莓派3B用WiringPi IIC驱动0.96寸OLED实战指南

树莓派3B用WiringPi IIC驱动0.96寸OLED实战指南

简介:面向树莓派3B及同类Linux单板计算机的OLED显示驱动套件,集中解决基于WiringPi库通过IIC/I2C协议控制0.96寸OLED屏的问题,适配SSD1306与SH1106控制器,适合嵌入式DIY学习者与物联网项目开发者参考。资源包共包含10个文件&#…

2026/10/15 18:34:47 阅读更多 →
SAP PP与CO集成配置指南:生产订单成本核算与月末结账要点

SAP PP与CO集成配置指南:生产订单成本核算与月末结账要点

做SAP实施这些年,PP(生产计划)和CO(成本控制)的交接地带一直是项目里最容易翻车的区域。生产部门觉得订单是计划问题,财务觉得订单是钱的问题,但生产订单在系统里却同时承载着物料消耗、工时确认…

2026/10/15 18:33:47 阅读更多 →
如何5分钟开启AI学习之旅:ai-learning-roadmaps环境搭建新手快速入门教程

如何5分钟开启AI学习之旅:ai-learning-roadmaps环境搭建新手快速入门教程

【免费下载链接】ai-learning-roadmaps A complete, structured hub for learning Artificial Intelligence — covering AI, Machine Learning, Deep Learning, and Data Science with books, roadmaps, and curated resources from beginner to advanced. 项目地址&#xff1…

2026/10/15 18:33:47 阅读更多 →

最新新闻

云快充充电桩通信协议1.6详解:帧结构、报文解析与联调避坑指南

云快充充电桩通信协议1.6详解:帧结构、报文解析与联调避坑指南

简介:云快充平台与设备通信协议1.6是江苏云快充新能源科技有限公司发布的充电桩与云平台交互规范,面向充电桩厂商、运营商及后端开发人员,用于解决设备接入、数据上报、远程控制等场景下的通信兼容与稳定问题。协议基于TCP/IP五层模型&#x…

2026/10/15 19:19:14 阅读更多 →
AC822B蓝牙音频SoC规格书解读:从音频链路到硬件设计

AC822B蓝牙音频SoC规格书解读:从音频链路到硬件设计

简介:杰理AC822B规格书是面向嵌入式硬件工程师与芯片应用开发者的技术文档,系统说明这款芯片的功能架构与硬件设计要点。包体为单份PDF,压缩包约1.05MB,共1个文件;内容覆盖文档修订历史、AC822B特性、内部模块框图、引…

2026/10/15 19:19:14 阅读更多 →
Power BI度量值组实战:从重复DAX到高效计算组

Power BI度量值组实战:从重复DAX到高效计算组

1. 度量值组到底解决了什么痛点如果你用 Power BI Desktop 做过三个以上的中型模型,大概率经历过这种场景:打开一张报表,右侧字段列表里密密麻麻躺着七八十个度量值,销售额、利润额、同比、环比、YTD、MTD、QTD、滚动12个月……找…

2026/10/15 19:19:14 阅读更多 →
superpowers:给AI编码助手上规矩的技能库实战指南

superpowers:给AI编码助手上规矩的技能库实战指南

第一次在 GitHub 趋势榜上刷到“superpowers”这个名字,我以为是哪个中二程序员给项目起的网红名。直到我把它装进 Claude Code,让 AI 带着整套 TDD 流程、系统性调试步骤和代码审查清单去独立完成一个 Java 重构任务,才发现这个名字背后是实…

2026/10/15 19:19:14 阅读更多 →
libmesh-mingw构建指南:Windows下用MinGW编译libMesh的完整步骤与避坑

libmesh-mingw构建指南:Windows下用MinGW编译libMesh的完整步骤与避坑

简介:面向需要在Windows平台借助Mingw完成libmesh编译与集成的科研和工程人员,压缩包内提供了编译好的libmesh动态库、大量头文件及配套工具,可直接用于有限元程序开发,免去手动配置CMake与MinGW环境的繁琐流程。资源共625个文件&…

2026/10/15 19:19:14 阅读更多 →
企业微信外部群主动推送实战:接口选型、合规要点与代码实现

企业微信外部群主动推送实战:接口选型、合规要点与代码实现

各位做运营和开发的朋友,今天我想跟你聊聊企业微信外部群主动推送这件事。在客户社群、供应商协同群、项目对接群里,主动把消息推出去,往往决定了业务响应速度和协作效率。很多人一开始以为只能被动等客户发消息,其实从企业微信的…

2026/10/15 19:18:13 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →