论 fmap、fmap fmap、与 fmap fmap fmap

本文探讨了Haskell中fmap的用法,包括fmap、fmap fmap和fmap fmap fmap。通过类型推导分析了fmap如何将函数应用于不同类型的结构,并解释了遇到fmap的多重应用时可能出现的类型混淆。文章强调了理解Haskell类型系统的重要性,指出积累经验和培养直觉是成为优秀Haskell程序员的关键。
摘要由CSDN通过智能技术生成

论 fmap、fmap fmap、与 fmap fmap fmap

希望标题没有吓到读者……

fmap

长话短说,首先让我们看一下 Haskell 的 Functor 中 fmap 类型信息:

fmap :: Functor f => (a -> b) -> f a -> f b

为简洁起见,文本文字部分的对 Functor 的 typeclass 约束将会省略。

fmap 的作用可以简单理解为将普通函数 (a -> b) 提升到能够作用于 f 所在的世界:(f a -> f b)

对于 Listfmapmap 等价;对于 Maybefmap 只将提升后的函数作用在 Just 字段的值上,Nothing 的情况则直接返回 Nothing……等等这些 fmap 的应用理解起来相当简单。

然而,如果你偶然间遇到了 fmap fmap 甚至 fmap fmap fmap,你是否能够理解它们的含义?

fmap fmap

若不明其类型信息,何谈了解?让我们先看 fmap fmap

Prelude> :t fmap
fmap :: Functor f => (a -> b) -> f a -> f b

Prelude> :t fmap fmap
fmap fmap
  :: (Functor f1, Functor f) => f (a -> b) -> f (f1 a -> f1 b)

fmap 的表述是:将某函数“提升”。在这里,我们要提升的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据您提供的代码片段,我可以看出您正在处理一个名为"fmap"的特征映射。下面是对您的代码进行的一些解释: 1. `fmap_dict['conv']`:根据代码中的注释,这是一个字典,其中包含名为'conv'的键对应的特征映射。 2. `fmap = t.stack(fmap)`:这将特征映射堆叠在一起。`fmap`现在是一个张量。 3. `fmap.squeeze_(0)`:这将移除张量中的尺寸为1的维度,即将其从`(1, H, W)`变为`(H, W)`,其中H和W分别代表高度和宽度。 4. `print(fmap.shape)`:打印出特征映射的形状,即它的高度和宽度。 5. `fmap.transpose_(0, 1)`:这将张量的维度进行转置,从`(H, W)`变为`(W, H)`。 6. `print(fmap.shape)`:打印特征映射转置后的形状。 7. `nrow = int(np.sqrt(fmap.shape[0]))`:计算特征映射中行数的平方根,并将结果转换为整数。这将用于在创建网格时指定每行显示的特征映射数量。 8. `fmap_grid = vutils.make_grid(fmap, normalize=True, scale_each=True, nrow=nrow)`:使用`make_grid`函数创建特征映射的网格。`normalize=True`将对特征映射进行归一化处理,`scale_each=True`将对每个特征映射进行独立的缩放,`nrow=nrow`指定每行显示的特征映射数量。 9. `writer.add_image('feature map in conv', fmap_grid, global_step=322)`:将特征映射的网格添加到名为'feature map in conv'的图像中,使用全局步骤编号322。 这段代码的目的是将特征映射可视化并将其添加到TensorBoard中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值