Image 如何将阵列向量转换为4D阵列?

Image 如何将阵列向量转换为4D阵列?,image,julia,Image,Julia,我正在尝试与Knet.jl和CNNs玩一点。我发现的每个示例都要求CNN的输入形式为[dim1,dim2,n_of_channels,n],其中n是实际图像的数量。 我对朱莉娅有点陌生,我不知道如何做到这一点 我从某个私有目录加载了图像,并将它们推送到一个向量中,使它们的长度为N images = Vector() for img_file in readdir(dir) img = load("$dir/$img_file") images = vcat(images, [im

我正在尝试与Knet.jl和CNNs玩一点。我发现的每个示例都要求CNN的输入形式为[dim1,dim2,n_of_channels,n],其中n是实际图像的数量。 我对朱莉娅有点陌生,我不知道如何做到这一点

我从某个私有目录加载了图像,并将它们推送到一个向量中,使它们的长度为N

images = Vector()
for img_file in readdir(dir)
    img = load("$dir/$img_file")
    images = vcat(images, [img])
end

typeof(image)
"320-element Array{Any,1}"
但是,在下面的示例中,xtrn存储为28x28x1x60000数组,这就是我希望通过专用数据集实现的

using Knet; include(Knet.dir("data","mnist.jl"))
xtrn,ytrn,_,_= mnist()

typeof(xtrn)
Array{Float32,4}

我知道channelview、Reforme等函数,它们似乎应该提供解决方案,但我一直在使用它们,并得到了尺寸不匹配错误。我想我遗漏了一些东西。

我没有您在示例中使用的文件。但我会将
cat
与发电机结合使用。下面是一个你可以做的例子:

julia> reduce((x,y)->cat(x, y, dims=4), rand(3,3) for _ in 1:3)
3×3×1×3 Array{Float64,4}:
[:, :, 1, 1] =
 0.366818  0.847529  0.209042
 0.281807  0.467918  0.68881 
 0.179162  0.222919  0.348935

[:, :, 1, 2] =
 0.0418451  0.256611  0.609398
 0.65166    0.281397  0.340405
 0.11109    0.387638  0.974488

[:, :, 1, 3] =
 0.454959  0.37831   0.554323
 0.213613  0.980773  0.743419
 0.133154  0.782516  0.669733
为了对文件执行此操作,这可能会起作用(未经测试):

顺便说一句,你不应该像这样初始化向量:

images = Vector()
这将导致一个非类型化的容器,这将有非常糟糕的性能。写下

images = Matrix{Float32}[]

这初始化了一个空向量
矩阵{Float32}
s.

为了填写DNF的答案,此代码生成的数组形式为[dim1,dim2,1,N]:

images = reduce((x,y)->cat(x, y, dims=4), load(joinpath(dir, img_file)) for img_file in readdir(dir))
我希望第三维是通道,因此,预期输出由以下方式产生:

images = reduce((x, y) -> cat(x, y, dims=4), permutedims(channelview(load(joinpath(dir, img_file))), (2, 3, 1)) for img in readdir(dir))

谢谢,很好用。然而,单个值被存储为(例如)RGB{N0f8}(1.0,0.9,0.9),因此,整个数组具有[dim1,dim2,1,N]形式的维度。我想要的是[dim1,dim2,3(因为RGB),N]的形式,这样数组中存储的单个值就是Float。有什么办法可以达到这个目的吗?旁注:在这种情况下,使用
push!(图像,img)
而不是
vcat
看起来太像Matlab:)也许
sizehint也是。
images = reduce((x, y) -> cat(x, y, dims=4), permutedims(channelview(load(joinpath(dir, img_file))), (2, 3, 1)) for img in readdir(dir))