介绍

Elixir 的 Nx 外设技术我在之前的文章中已经介绍过好几次了

但是,Nx 目前正在进行中并稳步发展

在旧版本中工作的代码不再工作或被弃用

于是,我在下面的版本中重写了每篇文章的处理,也就是最新的版本

  • 活簿:0.7.1
  • 奇诺:0.7.0
  • Nx:0.4.0
  • 资源管理器:0.3.1
  • 版本:0.1.14

我将只提取和介绍每个变化的本质

这是实现的完整代码

Evision 安装选项

安装选项的默认值已更改

  • 0.1.6 及更早版本

    • 如果没有指定则编译安装,
    • 如果在环境变量中指定了EVISION_PREFER_PRECOMPILED=true,则安装编译版本
  • 0.1.7及以上

    • 如果未指定任何内容,则安装已编译
    • 如果在环境变量中指定了EVISION_PREFER_PRECOMPILED=false,则编译并安装

Evision矩阵图像显示

最方便的是Evision的矩阵可以原样显示为图像。

还有,只返回矩阵没有!

  • !的规格变更
    • 旧:{:ok, mat} = Evision.imread(lenna)mat = Evision.imread!(lenna)
    • 新:mat = Evision.imread(lenna)

Evision 图像显示 旧版本实现示例

加载图像后,我必须将其转换为二进制并将其传递给 Kino

defmodule Helper do
  def show_image(mat) do
    Evision.imencode!(".png", mat)
    |> IO.iodata_to_binary()
    |> Kino.Image.new(:png)
  end
end

{:ok, mat} = Evision.imread(lenna)
Helper.show_image(mat)

Elixir Nx 周辺の更新

Evision 图像显示 新版本实现示例

现在可以通过加载图像文件来显示图像

执行结果中显示RawImageNumeric选项卡,您可以在Image选项卡中看到图像

mat = Evision.imread(lenna)

Elixir Nx 周辺の更新

Evision 规格变更

Nx 张量和 Evision 矩阵之间的转换发生了变化

  • Nx -> 愿景

    • 旧:Evision.Nx.to_mat()
    • 新:Evision.Mat.from_nx()
  • 愿景-> Nx

    • 老:Evision.Nx.to_nx()
    • 新:Evision.Mat.to_nx()

此外,将 List 作为参数传递的位置已更改为 Tuple

  • 参数规范更改
    • 旧:Evision.warpAffine!(affine, [512, 512])
    • 新:Evision.warpAffine(affine, {512, 512})

Evision图像处理旧版实现示例

{:ok, affine} =
  [
    [1, 0, 100],
    [0, 1, 50]
  ]
  |> Nx.tensor(type: {:f, 32})
  |> Evision.Nx.to_mat()

lenna
|> Evision.imread!()
|> Evision.warpAffine!(affine, [512, 512])
|> Helper.show_image()

Evision图像处理新版本实现示例

affine =
  [
    [1, 0, 100],
    [0, 1, 50]
  ]
  |> Nx.tensor(type: {:f, 32})
  |> Evision.Mat.from_nx()

lenna
|> Evision.imread()
|> Evision.warpAffine(affine, {512, 512})

Evision.后端

实际上,Evision 作为 Nx 后端,
使用 Evision.Mat.to_nx() 将使用 Evision 后端

但是,有些功能是不支持的,所以像下面这样运行代码会报错

给出错误的代码

predictions
|> Enum.map(fn prediction ->
  Evision.Mat.to_nx(prediction)
end)
|> Nx.concatenate()

错误信息

operation concatenate is not yet supported on Evision.Backend
Please use another backend like Nx.BinaryBackend or Torchx.Backend.

为避免该错误,您必须显式使用另一个后端

错误避免代码

predictions
|> Enum.map(fn prediction ->
  Evision.Mat.to_nx(prediction, Nx.BinaryBackend)
end)
|> Nx.concatenate()

Explorer 规格变更

一些功能已被弃用,取而代之的是替代品

  • 筛选

    • 旧:DataFrame.filter()
    • 新:DataFrame.filter_with()
  • 加工

    • 旧:DataFrame.mutate()
    • 新:DataFrame.mutate_with()

Explorer旧版本实现示例

mutate 将“人口(千)”列转换为浮动
filter 仅提取“prefecture”列为“Tokyo”的行

population_df
|> DataFrame.mutate("人口(千人)": &Series.cast(&1["人口(千人)"], :float))
|> DataFrame.filter(&Series.equal(&1["都道府県"], "東京都"))

Explorer新版本实现示例

mutate_with 将“人口(千)”列转换为浮动
filter_with 仅提取“prefecture”列为“Tokyo”的行

population_df
|> DataFrame.mutate_with(fn df ->
  [
    "人口(千人)": Series.cast(df["人口(千人)"], :float)
  ]
end)
|> DataFrame.filter_with(&Series.equal(&1["都道府県"], "東京都"))
|> DataFrame.select(["年齢層", "性別", "人口(千人)"])

mutate_with 的问题

DataFrame.mutate_with 不能使用 Series.transform

给出错误的代码

trim_comma = fn input ->
  String.replace(input, ",", "")
end

population_df
|> DataFrame.mutate_with(fn df ->
  [
    "人口(千人)": Series.transform(df["人口(千人)"], trim_comma)
  ]
end)

错误信息

cannot perform operation on an Explorer.Backend.LazySeries

这个问题也在官方issue中,所以在Explorer 0.4中应该有一些替代方案

关于 AxonOnnx

AxonOnnx 0.2.1 还是不能用 Nx 0.4

综上所述

现在很热技术在不断发展,因此我们需要定期更新。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308631558.html

相关文章:

  • 2021-07-27
  • 2021-11-03
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-29
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-04-12
  • 2022-03-06
  • 2021-04-19
  • 2021-11-05
  • 2022-12-23
相关资源
相似解决方案