main 之前之后的那些事儿

本文探讨了在C语言编程中main函数执行前后的初始化与清理操作,介绍了atexit和onexit函数的使用,并提供了实际应用案例。

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

在main函数执行之前 ,总要执行一段代码,如static对象 static函数 以及全局对象的初始化。在退出之前也总要执行一段代码来释放相关的资源。这段代码通常是不可见的

故 一般形式为:

int main()

{

  Initailzation()

  ////

  ourcodes

  ///

  Clear()

}

程序员可以手动控制main函数在退出之前执行一段代码;

atexit 函数和_oneexit函数 

atexit是标准C中的函数,建议使用这个。
onexit是非标准的。有些平台上不存在这个函数

http://blog.youkuaiyun.com/lhb19891029/article/details/9163387



libpng warning: tRNS: invalid with alpha channel libpng warning: tRNS: invalid with alpha channel libpng warning: tRNS: invalid with alpha channel libpng warning: tRNS: invalid with alpha channel libpng warning: tRNS: invalid with alpha channel Traceback (most recent call last): File "C:\Users\你爹\PyCharmMiscProject\DQN.py", line 248, in <module> main() File "C:\Users\你爹\PyCharmMiscProject\DQN.py", line 206, in main train(env,dqn) File "C:\Users\你爹\PyCharmMiscProject\DQN.py", line 141, in train a = dqn.choose_action(s, EPSILON) #选择动作 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\你爹\PyCharmMiscProject\DQN.py", line 76, in choose_action actions_value = self.eval_net.forward(x) #将场景输入Q估计神经网络 ^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\你爹\PyCharmMiscProject\DQN.py", line 54, in forward x=self.f1(x) ^^^^^^^^^^ File "D:\wdnmd\proteus\Proteus 8 Professional\Tools\Python\Lib\.venv\Lib\site-packages\torch\nn\modules\module.py", line 1751, in _wrapped_call_impl return self._call_impl(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\wdnmd\proteus\Proteus 8 Professional\Tools\Python\Lib\.venv\Lib\site-packages\torch\nn\modules\module.py", line 1762, in _call_impl return forward_call(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\wdnmd\proteus\Proteus 8 Professional\Tools\Python\Lib\.venv\Lib\site-packages\torch\nn\modules\linear.py", line 125, in forward return F.linear(input, self.weight, self.bias) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RuntimeError: mat1 and mat2 shapes cannot be multiplied (1x900 and 100x16)
05-24
### PyTorch 中矩阵乘法错误及 libpng 警告问题的解决方法 #### 矩阵乘法错误分析 在 PyTorch 中,当执行矩阵乘法操作时,如果两个张量的维度不匹配,则会抛出 `RuntimeError: mat1 and mat2 shapes cannot be multiplied` 错误。根据错误提示 `(1x900 and 100x16)`,可以看出第一个矩阵的列数(900)与第二个矩阵的行数(100)并不相同,因此无法进行矩阵乘法运算[^1]。 为了修复这一问题,需要确保参与矩阵乘法的两个张量满足以下条件:第一个张量的最后一维大小等于第二个张量的第一维大小。如果不一致,可以通过调整模型结构或数据预处理流程来实现尺寸适配。 --- #### 解决方案 ##### 1. 修改全连接层输入形状 检查神经网络架构中的每一层输出形状是否正确传递给下一层。例如,在卷积层之后通常接有一个展平操作 (`Flatten`) 将多维特征图转换为一维向量形式以便送入后续全连接层中进一步处理[^2]。 假设当前模型设计如下: ```python self.fc1 = nn.Linear(900, 100) self.fc2 = nn.Linear(100, 16) ``` 此时若前一层输出的实际形状不符合预期值(如 `[batch_size, 900]`),则需重新计算中间各阶段产生的特征映射总数目,并据此设定合适的线性变换参数。 --- ##### 2. 添加额外的全连接层作为过渡桥梁 有时由于原始图像分辨率较高或其他因素影响,直接从某个隐藏单元数量跳转到另一较小规模可能会造成不适配状况;为此可在两者之间插入若干辅助性的密集节构成链条状链接方式从而缓解突变带来的冲击力效果更好一些[^4]。 举个例子来说就是像这样子去做改进吧: ```python self.intermediate_fc = nn.Linear(900, 100) # 新增一个中间层用于衔接上下两部分 self.final_fc = nn.Linear(100, 16) def forward(self, x): ... x = F.relu(self.intermediate_fc(x)) # 应用激活函数增加非线性表达能力 output = self.final_fc(x) return output ``` 如此这般便能够有效规避掉原先单纯依靠单一映射所引发出来的各种麻烦事儿啦! --- ##### 3. 数据重塑以适应模型期望格式 另一种可能性在于训练样本本身并未按既定规格准备妥当——也许是因为读取过程中出现了意外变形亦或是人为失误所致的缘故使得最终呈现出来的东西跟我们设想当中有所偏差罢了而已嘛哈~ 所以说咯,在正式投喂之前最好先仔细核对着几个关键指标看看有没有哪里不对劲儿的地方哦~ 比如说采用下面这样的代码片段来进行必要的结构调整动作就很不错呢: ```python input_tensor = input_tensor.view(-1, 900) # 动态改变 batch size 下每条记录的具体表现形态 output_result = model(input_tensor) ``` 这里需要注意的是 `-1` 表达的意思是指让系统自行推断剩余未指定轴上的确切数值长度是多少合适才行哟😊 --- #### LibPNG 警告问题解析 关于 `libpng warning: tRNS chunk with invalid or out-of-range values found in non-indexed PNG file` 的警告消息,这通常是由于图片文件内部含有透明度通道信息但却被标记成了灰阶模式而导致的结果[^6]。虽然这类提示并不会阻止程序正常运行下去,但从长远来看还是应该尽量避免出现这种情况比较好一呀😏 --- #### 处理办法 一种简单有效的做法便是借助 Pillow 库提前一步将所有待处理素材统一转化为 RGB 模式后再继续往下走就好啦😎 具体实现起来就像这样子一样方便快捷又省😄 ```python from PIL import Image img = Image.open('path_to_image.png').convert('RGB') # 继续保存或者传送给下游组件使用均可~ ``` 这样做不仅有助于消除恼人的警报声而且还能够让整个管线变得更加健壮可靠许多倍不止😉 --- ### 结论 综上所述,针对 `PyTorch RuntimeError: mat1 and mat2 shapes cannot be multiplied (1x900 and 100x16)` 和 `libpng warning: tRNS invalid with alpha channel` 这两类常见问题分别给出了详尽可行的技术应对策略供大家参考借鉴学习应用实践检验成果分享交流共同进步成长💪✨ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值