AJMC2002's picture
Upload lab1.livemd
f4ccc2a verified
<!-- livebook:{"persist_outputs":true} -->
# Cleaned vs Dirty V2
```elixir
Mix.install(
[
{:stb_image, "~> 0.5.2"},
{:axon, "~> 0.5"},
{:polaris, "~> 0.1"},
{:exla, "~> 0.5"},
{:explorer, "~> 0.8.0"},
{:nx, "~> 0.5"},
{:kino_ripmd, github: "clm-a/kino_ripmd"},
{:kino_explorer, "~> 0.1.0"},
{:kino_vega_lite, "~> 0.1.0"},
{:kino, "~> 0.10.0"},
{:csv, "~> 3.2"}
],
config: [
nx: [
default_backend: EXLA.Backend,
default_defn_options: [compiler: EXLA]
],
exla: [
default_client: :cuda,
clients: [
cuda: [platform: :cuda],
rocm: [platform: :rocm],
tpu: [platform: :tpu],
host: [platform: :host]
],
memory_fraction: 0.9,
preallocate: false
]
],
system_env: [
XLA_TARGET: "cuda120"
]
)
```
## Goal
_Hi! It is boring to wash the dishes. Luckily, half of them are already clean. Train a classifier to determine clean ones to save time for the new machine learning course ;)_
_It is a few shot learning competition. We have a dataset of 20 clean and 20 dirty plates in train and hundreds of plates in test. Good luck!_
Igor.Slinko. (2019). Cleaned vs Dirty V2. Kaggle. https://kaggle.com/competitions/platesv2
## Setting up the model
```elixir
alias Axon.Loop.State
import Nx.Defn
directories =
"/home/le-moski/Documents/FEFU/7S/AI/lab1-dirtyplates/platesv2/plates/train/{cleaned,dirty}/*.jpg"
batch_size = 8
image_channels = 3
image_w = 256
image_h = 256
channel_value_max = 255
cleaned_class = Nx.tensor([1, 0], type: {:u, 8})
dirty_class = Nx.tensor([0, 1], type: {:u, 8})
```
<!-- livebook:{"output":true} -->
```
#Nx.Tensor<
u8[2]
EXLA.Backend<cuda:0, 0.463371035.4063887383.206028>
[0, 1]
>
```
```elixir
parse_img = fn filename ->
class =
if Path.dirname(filename)
|> String.split("/")
|> List.last() == "cleaned" do
cleaned_class
else
dirty_class
end
{:ok, img} = StbImage.read_file(filename)
img = StbImage.resize(img, image_h, image_w)
{StbImage.to_nx(img), class}
end
```
<!-- livebook:{"output":true} -->
```
#Function<42.39164016/1 in :erl_eval.expr/6>
```
```elixir
data =
Path.wildcard(directories)
|> Enum.shuffle()
|> Stream.chunk_every(batch_size, batch_size)
|> Task.async_stream(fn batch ->
{imgs, classes} = batch |> Enum.map(&parse_img.(&1)) |> Enum.unzip()
{Nx.stack(imgs), Nx.stack(classes)}
end)
|> Stream.map(fn {:ok, {imgs, classes}} -> {imgs |> Nx.divide(channel_value_max), classes} end)
```
<!-- livebook:{"output":true} -->
```
#Stream<[
enum: #Function<3.112894672/2 in Task.build_stream/3>,
funs: [#Function<50.38948127/1 in Stream.map/2>]
]>
```
```elixir
model =
Axon.input("input", shape: {nil, image_w, image_h, image_channels})
|> Axon.conv(64, kernel_size: {3, 3})
|> Axon.batch_norm()
|> Axon.relu()
|> Axon.max_pool(kernel_size: {2, 2})
|> Axon.conv(128, kernel_size: {3, 3})
|> Axon.batch_norm()
|> Axon.relu()
|> Axon.max_pool(kernel_size: {2, 2})
|> Axon.flatten()
|> Axon.dense(256, activation: :relu)
|> Axon.dropout()
|> Axon.dense(2, activation: :softmax)
```
<!-- livebook:{"output":true} -->
```
#Axon<
inputs: %{"input" => {nil, 256, 256, 3}}
outputs: "softmax_0"
nodes: 15
>
```
```elixir
optimizer = Polaris.Optimizers.adam(learning_rate: 1.0e-3)
centralized_optimizer = Polaris.Updates.compose(Polaris.Updates.centralize(), optimizer)
epochs = 4
model_state =
model
|> Axon.Loop.trainer(:binary_cross_entropy, centralized_optimizer, log: 1)
|> Axon.Loop.metric(:accuracy)
|> Axon.Loop.run(data, %{}, epochs: epochs, iterations: 30, compiler: EXLA)
```
<!-- livebook:{"output":true} -->
```
08:12:25.650 [debug] Forwarding options: [compiler: EXLA] to JIT compiler
08:12:37.790 [warning] Allocator (GPU_0_bfc) ran out of memory trying to allocate 480.50MiB (rounded to 503840768)requested by op
08:12:37.791 [info] BFCAllocator dump for GPU_0_bfc
08:12:37.791 [info] Bin (256): Total Chunks: 102, Chunks in use: 102. 25.5KiB allocated for chunks. 25.5KiB in use in bin. 11.5KiB client-requested in use in bin.
08:12:37.791 [info] Bin (512): Total Chunks: 20, Chunks in use: 20. 10.0KiB allocated for chunks. 10.0KiB in use in bin. 10.0KiB client-requested in use in bin.
08:12:37.792 [info] Bin (1024): Total Chunks: 4, Chunks in use: 4. 4.0KiB allocated for chunks. 4.0KiB in use in bin. 4.0KiB client-requested in use in bin.
08:12:37.792 [info] Bin (2048): Total Chunks: 16, Chunks in use: 16. 44.0KiB allocated for chunks. 44.0KiB in use in bin. 43.0KiB client-requested in use in bin.
08:12:37.793 [info] Bin (4096): Total Chunks: 4, Chunks in use: 4. 16.0KiB allocated for chunks. 16.0KiB in use in bin. 16.0KiB client-requested in use in bin.
08:12:37.793 [info] Bin (8192): Total Chunks: 0, Chunks in use: 0. 0B allocated for chunks. 0B in use in bin. 0B client-requested in use in bin.
08:12:37.795 [info] Bin (16384): Total Chunks: 0, Chunks in use: 0. 0B allocated for chunks. 0B in use in bin. 0B client-requested in use in bin.
08:12:37.795 [info] Bin (32768): Total Chunks: 0, Chunks in use: 0. 0B allocated for chunks. 0B in use in bin. 0B client-requested in use in bin.
08:12:37.796 [info] Bin (65536): Total Chunks: 8, Chunks in use: 8. 624.5KiB allocated for chunks. 624.5KiB in use in bin. 576.0KiB client-requested in use in bin.
08:12:37.797 [info] Bin (131072): Total Chunks: 8, Chunks in use: 8. 1.20MiB allocated for chunks. 1.20MiB in use in bin. 1.12MiB client-requested in use in bin.
08:12:37.797 [info] Bin (262144): Total Chunks: 4, Chunks in use: 4. 1.12MiB allocated for chunks. 1.12MiB in use in bin. 1.12MiB client-requested in use in bin.
08:12:37.797 [info] Bin (524288): Total Chunks: 2, Chunks in use: 0. 1.54MiB allocated for chunks. 0B in use in bin. 0B client-requested in use in bin.
08:12:37.798 [info] Bin (1048576): Total Chunks: 0, Chunks in use: 0. 0B allocated for chunks. 0B in use in bin. 0B client-requested in use in bin.
08:12:37.798 [info] Bin (2097152): Total Chunks: 4, Chunks in use: 1. 9.57MiB allocated for chunks. 2.50MiB in use in bin. 2.50MiB client-requested in use in bin.
08:12:37.798 [info] Bin (4194304): Total Chunks: 2, Chunks in use: 1. 11.25MiB allocated for chunks. 6.00MiB in use in bin. 6.00MiB client-requested in use in bin.
```
<!-- livebook:{"output":true} -->
```
08:12:37.798 [info] Bin (8388608): Total Chunks: 1, Chunks in use: 0. 10.49MiB allocated for chunks. 0B in use in bin. 0B client-requested in use in bin.
08:12:37.799 [info] Bin (16777216): Total Chunks: 0, Chunks in use: 0. 0B allocated for chunks. 0B in use in bin. 0B client-requested in use in bin.
08:12:37.799 [info] Bin (33554432): Total Chunks: 4, Chunks in use: 4. 133.00MiB allocated for chunks. 133.00MiB in use in bin. 133.00MiB client-requested in use in bin.
08:12:37.800 [info] Bin (67108864): Total Chunks: 0, Chunks in use: 0. 0B allocated for chunks. 0B in use in bin. 0B client-requested in use in bin.
08:12:37.800 [info] Bin (134217728): Total Chunks: 6, Chunks in use: 4. 994.80MiB allocated for chunks. 600.00MiB in use in bin. 600.00MiB client-requested in use in bin.
08:12:37.801 [info] Bin (268435456): Total Chunks: 2, Chunks in use: 0. 629.22MiB allocated for chunks. 0B in use in bin. 0B client-requested in use in bin.
08:12:37.801 [info] Bin for 480.50MiB was 256.00MiB, Chunk State:
08:12:37.801 [info] Size: 295.97MiB | Requested Size: 153.12MiB | in_use: 0 | bin_num: 20, prev: Size: 223.5KiB | Requested Size: 144.0KiB | in_use: 1 | bin_num: -1, next: Size: 144.0KiB | Requested Size: 144.0KiB | in_use: 1 | bin_num: -1
08:12:37.803 [info] Size: 333.25MiB | Requested Size: 153.12MiB | in_use: 0 | bin_num: 20, prev: Size: 33.25MiB | Requested Size: 33.25MiB | in_use: 1 | bin_num: -1
08:12:37.804 [info] Next region of size 1880004864
08:12:37.804 [info] Free at 736310000000 of size 2575616 next 65
08:12:37.806 [info] InUse at 736310274d00 of size 256 next 1947
08:12:37.806 [info] InUse at 736310274e00 of size 73728 next 438
08:12:37.807 [info] InUse at 736310286e00 of size 73728 next 1507
08:12:37.807 [info] InUse at 736310298e00 of size 115712 next 1943
08:12:37.807 [info] InUse at 7363102b5200 of size 256 next 420
08:12:37.808 [info] Free at 7363102b5300 of size 786688 next 238
08:12:37.808 [info] InUse at 736310375400 of size 256 next 259
08:12:37.809 [info] Free at 736310375500 of size 10996736 next 3677
08:12:37.809 [info] InUse at 736310df2100 of size 2618880 next 1580
08:12:37.810 [info] Free at 736311071700 of size 2671872 next 291
08:12:37.810 [info] InUse at 7363112fdc00 of size 147456 next 1912
08:12:37.810 [info] InUse at 736311321c00 of size 147456 next 386
08:12:37.811 [info] InUse at 736311345c00 of size 148736 next 39
08:12:37.811 [info] Free at 73631136a100 of size 5500672 next 1277
08:12:37.811 [info] InUse at 7363118a9000 of size 294912 next 3916
08:12:37.811 [info] InUse at 7363118f1000 of size 294912 next 3549
08:12:37.812 [info] InUse at 736311939000 of size 294912 next 1748
08:12:37.812 [info] InUse at 736311981000 of size 294912 next 1904
08:12:37.812 [info] InUse at 7363119c9000 of size 73728 next 1575
08:12:37.812 [info] InUse at 7363119db000 of size 3584 next 1797
08:12:37.812 [info] InUse at 7363119dbe00 of size 3584 next 1919
08:12:37.813 [info] InUse at 7363119dcc00 of size 3584 next 230
08:12:37.813 [info] InUse at 7363119dda00 of size 3584 next 1730
08:12:37.813 [info] InUse at 7363119de800 of size 2048 next 1774
08:12:37.813 [info] InUse at 7363119df000 of size 2048 next 1639
08:12:37.813 [info] InUse at 7363119df800 of size 2048 next 1728
08:12:37.814 [info] InUse at 7363119e0000 of size 2048 next 1531
08:12:37.814 [info] InUse at 7363119e0800 of size 1024 next 1504
08:12:37.814 [info] InUse at 7363119e0c00 of size 1024 next 1498
08:12:37.815 [info] InUse at 7363119e1000 of size 1024 next 1636
08:12:37.815 [info] InUse at 7363119e1400 of size 1024 next 1742
08:12:37.815 [info] InUse at 7363119e1800 of size 512 next 1855
08:12:37.815 [info] InUse at 7363119e1a00 of size 512 next 2919
08:12:37.816 [info] InUse at 7363119e1c00 of size 512 next 342
08:12:37.816 [info] InUse at 7363119e1e00 of size 512 next 1903
08:12:37.816 [info] InUse at 7363119e2000 of size 512 next 3877
08:12:37.816 [info] InUse at 7363119e2200 of size 512 next 1808
08:12:37.816 [info] InUse at 7363119e2400 of size 512 next 1749
08:12:37.817 [info] InUse at 7363119e2600 of size 512 next 3830
08:12:37.817 [info] InUse at 7363119e2800 of size 512 next 1832
08:12:37.817 [info] InUse at 7363119e2a00 of size 512 next 1656
08:12:37.817 [info] InUse at 7363119e2c00 of size 512 next 1491
08:12:37.817 [info] InUse at 7363119e2e00 of size 512 next 3251
08:12:37.818 [info] InUse at 7363119e3000 of size 512 next 3922
08:12:37.818 [info] InUse at 7363119e3200 of size 512 next 3914
08:12:37.818 [info] InUse at 7363119e3400 of size 512 next 3755
08:12:37.818 [info] InUse at 7363119e3600 of size 512 next 1768
08:12:37.818 [info] InUse at 7363119e3800 of size 512 next 1488
08:12:37.819 [info] InUse at 7363119e3a00 of size 512 next 1831
08:12:37.819 [info] InUse at 7363119e3c00 of size 512 next 1689
08:12:37.819 [info] InUse at 7363119e3e00 of size 512 next 1846
08:12:37.819 [info] InUse at 7363119e4000 of size 256 next 1861
08:12:37.821 [info] InUse at 7363119e4100 of size 256 next 1708
08:12:37.821 [info] InUse at 7363119e4200 of size 256 next 3907
08:12:37.821 [info] InUse at 7363119e4300 of size 256 next 1828
08:12:37.822 [info] InUse at 7363119e4400 of size 256 next 1892
08:12:37.822 [info] InUse at 7363119e4500 of size 256 next 1759
08:12:37.822 [info] InUse at 7363119e4600 of size 256 next 310
08:12:37.822 [info] InUse at 7363119e4700 of size 256 next 1670
08:12:37.823 [info] InUse at 7363119e4800 of size 256 next 1758
08:12:37.823 [info] InUse at 7363119e4900 of size 256 next 3781
08:12:37.823 [info] InUse at 7363119e4a00 of size 256 next 1851
08:12:37.823 [info] InUse at 7363119e4b00 of size 256 next 1741
08:12:37.823 [info] InUse at 7363119e4c00 of size 256 next 1674
08:12:37.823 [info] InUse at 7363119e4d00 of size 256 next 274
08:12:37.824 [info] InUse at 7363119e4e00 of size 256 next 1666
08:12:37.824 [info] InUse at 7363119e4f00 of size 256 next 1879
08:12:37.824 [info] InUse at 7363119e5000 of size 256 next 1744
08:12:37.824 [info] InUse at 7363119e5100 of size 256 next 72
08:12:37.824 [info] InUse at 7363119e5200 of size 256 next 1755
08:12:37.824 [info] InUse at 7363119e5300 of size 256 next 426
08:12:37.825 [info] InUse at 7363119e5400 of size 256 next 1702
08:12:37.825 [info] InUse at 7363119e5500 of size 256 next 1785
08:12:37.825 [info] InUse at 7363119e5600 of size 256 next 1553
08:12:37.825 [info] InUse at 7363119e5700 of size 256 next 1517
08:12:37.825 [info] InUse at 7363119e5800 of size 256 next 1733
08:12:37.825 [info] InUse at 7363119e5900 of size 256 next 3883
08:12:37.825 [info] InUse at 7363119e5a00 of size 256 next 146
08:12:37.826 [info] InUse at 7363119e5b00 of size 256 next 1726
08:12:37.826 [info] InUse at 7363119e5c00 of size 256 next 1678
08:12:37.826 [info] InUse at 7363119e5d00 of size 256 next 3708
08:12:37.826 [info] InUse at 7363119e5e00 of size 256 next 1539
08:12:37.826 [info] InUse at 7363119e5f00 of size 256 next 1684
08:12:37.826 [info] InUse at 7363119e6000 of size 256 next 1751
08:12:37.827 [info] InUse at 7363119e6100 of size 256 next 1552
08:12:37.827 [info] InUse at 7363119e6200 of size 256 next 1736
08:12:37.827 [info] InUse at 7363119e6300 of size 256 next 1543
08:12:37.827 [info] InUse at 7363119e6400 of size 256 next 1723
08:12:37.827 [info] InUse at 7363119e6500 of size 256 next 325
08:12:37.827 [info] InUse at 7363119e6600 of size 256 next 1880
08:12:37.827 [info] InUse at 7363119e6700 of size 256 next 1685
08:12:37.827 [info] InUse at 7363119e6800 of size 256 next 200
08:12:37.827 [info] InUse at 7363119e6900 of size 256 next 1900
08:12:37.828 [info] InUse at 7363119e6a00 of size 256 next 1677
08:12:37.828 [info] InUse at 7363119e6b00 of size 256 next 8
08:12:37.828 [info] InUse at 7363119e6c00 of size 256 next 1767
08:12:37.828 [info] InUse at 7363119e6d00 of size 256 next 1794
08:12:37.828 [info] InUse at 7363119e6e00 of size 256 next 1790
08:12:37.828 [info] InUse at 7363119e6f00 of size 256 next 1776
08:12:37.828 [info] InUse at 7363119e7000 of size 256 next 1579
08:12:37.828 [info] InUse at 7363119e7100 of size 256 next 1550
08:12:37.829 [info] InUse at 7363119e7200 of size 256 next 1698
08:12:37.829 [info] InUse at 7363119e7300 of size 256 next 1683
08:12:37.829 [info] InUse at 7363119e7400 of size 256 next 1839
08:12:37.829 [info] InUse at 7363119e7500 of size 256 next 1556
08:12:37.829 [info] InUse at 7363119e7600 of size 256 next 56
08:12:37.830 [info] InUse at 7363119e7700 of size 256 next 1893
08:12:37.830 [info] InUse at 7363119e7800 of size 256 next 3837
08:12:37.830 [info] Free at 7363119e7900 of size 2173440 next 2023
08:12:37.830 [info] InUse at 736311bfa300 of size 147456 next 3854
08:12:37.831 [info] InUse at 736311c1e300 of size 147456 next 3887
08:12:37.831 [info] InUse at 736311c42300 of size 228864 next 3908
08:12:37.831 [info] Free at 736311c7a100 of size 310345216 next 347
08:12:37.832 [info] InUse at 736324471f00 of size 147456 next 199
08:12:37.832 [info] InUse at 736324495f00 of size 147456 next 447
08:12:37.832 [info] InUse at 7363244b9f00 of size 73728 next 3843
08:12:37.833 [info] InUse at 7363244cbf00 of size 73728 next 7
08:12:37.833 [info] InUse at 7363244ddf00 of size 81408 next 256
08:12:37.833 [info] InUse at 7363244f1d00 of size 256 next 1657
08:12:37.833 [info] InUse at 7363244f1e00 of size 256 next 233
08:12:37.833 [info] Free at 7363244f1f00 of size 832512 next 3910
08:12:37.834 [info] InUse at 7363245bd300 of size 73728 next 257
08:12:37.834 [info] InUse at 7363245cf300 of size 4096 next 3790
08:12:37.834 [info] InUse at 7363245d0300 of size 4096 next 128
08:12:37.834 [info] InUse at 7363245d1300 of size 4096 next 335
08:12:37.834 [info] InUse at 7363245d2300 of size 4096 next 1908
08:12:37.834 [info] InUse at 7363245d3300 of size 3584 next 116
08:12:37.834 [info] InUse at 7363245d4100 of size 3584 next 410
08:12:37.834 [info] InUse at 7363245d4f00 of size 3584 next 307
08:12:37.834 [info] InUse at 7363245d5d00 of size 3584 next 139
08:12:37.835 [info] InUse at 7363245d6b00 of size 2048 next 1817
08:12:37.835 [info] InUse at 7363245d7300 of size 2048 next 1917
08:12:37.835 [info] InUse at 7363245d7b00 of size 2048 next 297
08:12:37.835 [info] InUse at 7363245d8300 of size 2048 next 1791
08:12:37.835 [info] InUse at 7363245d8b00 of size 256 next 1801
08:12:37.835 [info] InUse at 7363245d8c00 of size 256 next 348
08:12:37.835 [info] InUse at 7363245d8d00 of size 256 next 3741
08:12:37.835 [info] InUse at 7363245d8e00 of size 256 next 264
08:12:37.835 [info] InUse at 7363245d8f00 of size 256 next 324
08:12:37.835 [info] InUse at 7363245d9000 of size 256 next 1806
08:12:37.836 [info] InUse at 7363245d9100 of size 256 next 3713
08:12:37.836 [info] InUse at 7363245d9200 of size 256 next 117
08:12:37.836 [info] InUse at 7363245d9300 of size 256 next 1859
08:12:37.836 [info] InUse at 7363245d9400 of size 256 next 3745
08:12:37.836 [info] InUse at 7363245d9500 of size 256 next 20
08:12:37.836 [info] InUse at 7363245d9600 of size 256 next 3702
08:12:37.837 [info] InUse at 7363245d9700 of size 256 next 3879
08:12:37.837 [info] InUse at 7363245d9800 of size 256 next 226
08:12:37.837 [info] InUse at 7363245d9900 of size 256 next 1910
08:12:37.837 [info] InUse at 7363245d9a00 of size 256 next 237
08:12:37.837 [info] InUse at 7363245d9b00 of size 256 next 229
08:12:37.837 [info] InUse at 7363245d9c00 of size 256 next 136
08:12:37.837 [info] InUse at 7363245d9d00 of size 256 next 448
08:12:37.837 [info] InUse at 7363245d9e00 of size 256 next 286
08:12:37.837 [info] InUse at 7363245d9f00 of size 256 next 213
08:12:37.837 [info] InUse at 7363245da000 of size 256 next 37
08:12:37.837 [info] InUse at 7363245da100 of size 256 next 346
08:12:37.838 [info] InUse at 7363245da200 of size 256 next 165
08:12:37.838 [info] InUse at 7363245da300 of size 256 next 318
08:12:37.838 [info] InUse at 7363245da400 of size 256 next 372
08:12:37.838 [info] InUse at 7363245da500 of size 256 next 443
08:12:37.838 [info] InUse at 7363245da600 of size 256 next 193
08:12:37.838 [info] InUse at 7363245da700 of size 256 next 127
08:12:37.838 [info] InUse at 7363245da800 of size 256 next 43
08:12:37.838 [info] InUse at 7363245da900 of size 256 next 550
08:12:37.838 [info] InUse at 7363245daa00 of size 256 next 376
08:12:37.838 [info] InUse at 7363245dab00 of size 256 next 467
08:12:37.839 [info] InUse at 7363245dac00 of size 256 next 47
08:12:37.839 [info] InUse at 7363245dad00 of size 256 next 207
08:12:37.839 [info] InUse at 7363245dae00 of size 256 next 540
08:12:37.839 [info] InUse at 7363245daf00 of size 256 next 408
08:12:37.839 [info] InUse at 7363245db000 of size 256 next 279
08:12:37.839 [info] InUse at 7363245db100 of size 256 next 76
08:12:37.839 [info] InUse at 7363245db200 of size 256 next 532
08:12:37.839 [info] InUse at 7363245db300 of size 6291456 next 2880
08:12:37.840 [info] Free at 736324bdb300 of size 150994944 next 151
08:12:37.840 [info] InUse at 73632dbdb300 of size 157286400 next 1816
08:12:37.840 [info] InUse at 7363371db300 of size 157286400 next 1783
08:12:37.840 [info] InUse at 7363407db300 of size 157286400 next 3758
08:12:37.840 [info] InUse at 736349ddb300 of size 157286400 next 1731
08:12:37.840 [info] Free at 7363533db300 of size 262984704 next 48
08:12:37.840 [info] InUse at 736362ea8700 of size 34865152 next 319
08:12:37.840 [info] InUse at 736364fe8700 of size 34865152 next 321
08:12:37.840 [info] InUse at 736367128700 of size 34865152 next 221
08:12:37.840 [info] InUse at 736369268700 of size 34865152 next 419
08:12:37.840 [info] Free at 73636b3a8700 of size 349442560 next 18446744073709551615
08:12:37.840 [info] Summary of in-use Chunks by size:
08:12:37.841 [info] 102 Chunks of size 256 totalling 25.5KiB
08:12:37.841 [info] 20 Chunks of size 512 totalling 10.0KiB
08:12:37.841 [info] 4 Chunks of size 1024 totalling 4.0KiB
08:12:37.841 [info] 8 Chunks of size 2048 totalling 16.0KiB
08:12:37.841 [info] 8 Chunks of size 3584 totalling 28.0KiB
08:12:37.841 [info] 4 Chunks of size 4096 totalling 16.0KiB
08:12:37.841 [info] 6 Chunks of size 73728 totalling 432.0KiB
08:12:37.841 [info] 1 Chunks of size 81408 totalling 79.5KiB
08:12:37.842 [info] 1 Chunks of size 115712 totalling 113.0KiB
08:12:37.842 [info] 6 Chunks of size 147456 totalling 864.0KiB
08:12:37.842 [info] 1 Chunks of size 148736 totalling 145.2KiB
08:12:37.842 [info] 1 Chunks of size 228864 totalling 223.5KiB
08:12:37.842 [info] 4 Chunks of size 294912 totalling 1.12MiB
08:12:37.842 [info] 1 Chunks of size 2618880 totalling 2.50MiB
08:12:37.842 [info] 1 Chunks of size 6291456 totalling 6.00MiB
08:12:37.842 [info] 4 Chunks of size 34865152 totalling 133.00MiB
08:12:37.842 [info] 4 Chunks of size 157286400 totalling 600.00MiB
08:12:37.842 [info] Sum Total of in-use chunks: 744.53MiB
08:12:37.843 [info] Total bytes in pool: 1880004864 memory_limit_: 1880005017 available bytes: 153 curr_region_allocation_bytes_: 3760010240
08:12:37.843 [info] Stats:
Limit: 1880005017
InUse: 780699904
MaxInUse: 1871703296
NumAllocs: 97350
MaxAllocSize: 1152347648
Reserved: 0
PeakReserved: 0
LargestFreeBlock: 0
08:12:37.843 [warning] **________________*_______***********************************____________*********__________________
08:12:37.843 [error] Execution of replica 0 failed: RESOURCE_EXHAUSTED: Out of memory while trying to allocate 503840768 bytes.
BufferAssignment OOM Debugging.
BufferAssignment stats:
parameter allocation: 0B
constant allocation: 273B
maybe_live_out allocation: 1.88GiB
preallocated temp allocation: 7.5KiB
preallocated temp fragmentation: 1.2KiB (16.09%)
total allocation: 1.88GiB
total fragmentation: 7.8KiB (0.00%)
Peak buffers:
Buffer 1:
Size: 480.50MiB
XLA Label: fusion
Shape: f32[492032,256]
==========================
Buffer 2:
Size: 480.50MiB
XLA Label: fusion
Shape: f32[492032,256]
==========================
Buffer 3:
Size: 480.50MiB
XLA Label: fusion
Shape: f32[125960192]
==========================
Buffer 4:
Size: 480.50MiB
XLA Label: fusion
Shape: f32[492032,256]
==========================
Buffer 5:
Size: 288.0KiB
XLA Label: fusion
Shape: f32[3,3,64,128]
==========================
Buffer 6:
Size: 288.0KiB
XLA Label: fusion
Shape: f32[3,3,64,128]
==========================
Buffer 7:
Size: 288.0KiB
XLA Label: fusion
Shape: f32[73728]
==========================
Buffer 8:
Size: 288.0KiB
XLA Label: fusion
Shape: f32[3,3,64,128]
==========================
Buffer 9:
Size: 6.8KiB
XLA Label: fusion
Shape: f32[3,3,3,64]
==========================
Buffer 10:
Size: 6.8KiB
XLA Label: fusion
Shape: f32[3,3,3,64]
==========================
Buffer 11:
Size: 6.8KiB
XLA Label: fusion
Shape: f32[1728]
==========================
Buffer 12:
Size: 6.8KiB
XLA Label: fusion
Shape: f32[3,3,3,64]
==========================
Buffer 13:
Size: 2.0KiB
XLA Label: fusion
Shape: f32[256,2]
==========================
Buffer 14:
Size: 2.0KiB
XLA Label: fusion
Shape: f32[512]
==========================
Buffer 15:
Size: 2.0KiB
XLA Label: fusion
Shape: f32[256,2]
==========================
```
## Testing
```elixir
test_directory = "/home/le-moski/Documents/FEFU/7S/AI/lab1-dirtyplates/platesv2/plates/test/*.jpg"
test_filenames =
Path.wildcard(test_directory)
|> Stream.chunk_every(batch_size, batch_size)
test_data_raw =
test_filenames
|> Task.async_stream(fn batch ->
batch
|> Enum.map(fn filename ->
{:ok, img} = StbImage.read_file(filename, channels: image_channels)
StbImage.resize(img, image_h, image_w) |> StbImage.to_nx()
end)
|> Nx.stack()
end)
test_data =
test_data_raw
|> Stream.map(fn {:ok, batch} -> batch |> Nx.divide(channel_value_max) end)
```
<!-- livebook:{"output":true} -->
```
#Stream<[
enum: #Function<3.112894672/2 in Task.build_stream/3>,
funs: [#Function<50.38948127/1 in Stream.map/2>]
]>
```
```elixir
predictions =
test_data
|> Stream.map(fn batch ->
Axon.predict(model, model_state, batch)
end)
prediction_labels =
predictions
|> Stream.map(fn batch ->
batch
|> Nx.to_list()
|> Enum.map(
&if &1 |> Enum.at(0) >= &1 |> Enum.at(1) do
"Cleaned"
else
"Dirty"
end
)
end)
```
<!-- livebook:{"output":true} -->
```
#Stream<[
enum: #Function<3.112894672/2 in Task.build_stream/3>,
funs: [#Function<50.38948127/1 in Stream.map/2>, #Function<50.38948127/1 in Stream.map/2>,
#Function<50.38948127/1 in Stream.map/2>]
]>
```
```elixir
predictions |> Enum.to_list()
```
<!-- livebook:{"output":true} -->
```
[
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186328.98827>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN]
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186328.98830>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN]
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186328.98833>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN]
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186328.98836>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN]
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186325.94801>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN]
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186325.94804>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN]
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186325.94807>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN]
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186325.94810>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN]
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186325.94813>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN]
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186328.98846>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN]
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186321.95355>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...]
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186321.95357>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186322.99151>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186328.98858>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186325.94881>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186328.98903>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186326.102539>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186328.98921>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186329.96026>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186325.94929>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186326.102571>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186330.95297>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186321.95421>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186321.95441>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186326.102666>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186326.102702>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186329.96108>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186329.96120>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186329.96125>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186321.95471>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186326.102744>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186328.99042>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186330.95355>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186330.95367>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186325.95024>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186330.95386>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
...
]
>,
#Nx.Tensor<
f32[20][2]
EXLA.Backend<cuda:0, 0.691480651.217186330.95409>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, ...],
...
]
>,
#Nx.Tensor<
f32[4][2]
EXLA.Backend<cuda:0, 0.691480651.217186330.95412>
[
[NaN, NaN],
[NaN, NaN],
[NaN, NaN],
[NaN, NaN]
]
>
]
```
```elixir
results = Stream.zip([test_filenames, test_data_raw, prediction_labels])
```
<!-- livebook:{"output":true} -->
```
#Function<76.38948127/2 in Stream.zip_with/2>
```
```elixir
csv =
results
|> Stream.flat_map(fn batch ->
{filenames_batch, _, labels_batch} = batch
Enum.zip([filenames_batch, labels_batch])
|> Enum.map(fn {filename, label} ->
%{id: Path.basename(filename, ".jpg"), label: String.downcase(label)}
end)
end)
|> CSV.encode(headers: [:id, :label])
|> Enum.join()
File.write!("/home/le-moski/Documents/FEFU/7S/AI/lab1-dirtyplates/results.csv", csv)
```
<!-- livebook:{"output":true} -->
```
:ok
```
```elixir
visualization =
results
|> Stream.map(fn batch ->
{filenames_batch, {:ok, raw_batch}, labels_batch} = batch
filenames_batch
|> Stream.with_index(fn filename, index ->
Kino.Layout.grid(
[
Kino.Markdown.new("# " <> Path.basename(filename)),
raw_batch |> Nx.to_list() |> Enum.at(index) |> Nx.tensor(type: :u8) |> Kino.Image.new(),
labels_batch |> Enum.at(index) |> Kino.Markdown.new()
],
boxed: true
)
end)
|> Enum.to_list()
|> Kino.Layout.grid()
end)
```
<!-- livebook:{"output":true} -->
```
#Stream<[
enum: #Function<76.38948127/2 in Stream.zip_with/2>,
funs: [#Function<50.38948127/1 in Stream.map/2>]
]>
```
```elixir
visualization |> Enum.at(0)
```
```elixir
visualization |> Enum.at(1)
```