介绍
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)
Evision 图像显示 新版本实现示例
现在可以通过加载图像文件来显示图像
执行结果中显示RawImageNumeric选项卡,您可以在Image选项卡中看到图像
mat = Evision.imread(lenna)
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