import
			
			 
			CairoMakie
			

			
			using
			
			 

	
			FastAI

New visualization tools for FastAI.jl

  • based on blocks

  • support for different backends (currently text and Makie.jl)

  • high-level functions for use with learning tasks

Learning tasks


			
			
			
			
			data
			,
			 
			blocks
			 
			=
			 
			
			loaddataset
			(
			
			"
			imagenette2-320
			"
			,
			 
			
			(

	
			Image
			,
			 

	
			Label
			)
			)
			

			
			task
			 
			=
			 
			

	
			ImageClassificationSingle
			(
			blocks
			)

			BlockTask(Image{2} -> Label{String})

showsample shows one sample from the data container:


			
			
			
			sample
			 
			=
			 
			

	
			getobs
			(
			data
			,
			 
			1
			)
			

			

	
			showsample
			(
			task
			,
			 
			sample
			)

			┌─────────────────────────────────────────────────────────┬───────────┐
│ Input                                                    Target    │
├─────────────────────────────────────────────────────────┼───────────┤
│  │ n01440764 │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│  │           │
│ ▀▀ │           │
└─────────────────────────────────────────────────────────┴───────────┘

showencodedsample shows a sample after encodings have been applied to it:


			
			
			
			
			x
			,
			 
			y
			 
			=
			 
			

	
			encodesample
			(
			task
			,
			 
			

	
			Validation
			(
			)
			,
			 
			sample
			)
			

			

	
			showencodedsample
			(
			task
			,
			 
			
			(
			x
			,
			 
			y
			)
			)

			┌───────────────────────────────────┬──────────────────────────────────────┐
│ x                                  y                                    │
├───────────────────────────────────┼──────────────────────────────────────┤
│ ┌                    ┐  │
│  │    n01440764 ■■■■■■■■■■■■■■■ 1.0    │
│  │    n02102040  0.0                   │
│  │    n02979186  0.0                   │
│  │    n03000684  0.0                   │
│  │    n03028079  0.0                   │
│  │    n03394916  0.0                   │
│  │    n03417042  0.0                   │
│  │    n03425413  0.0                   │
│  │    n03445777  0.0                   │
│  │    n03888257  0.0                   │
│ └                    ┘  │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
└───────────────────────────────────┴──────────────────────────────────────┘

Any encoded block that can't be visualized (here ImageTensor) is decoded until it can be using the task's encodings.


			
			
			
			
			using
			
			 
			Markdown
			;
			
			 
			
			

	
			FastAI
			.
			

	
			describeencodings
			(
			
			task
			.
			
			encodings
			,
			 
			
			task
			.
			
			blocks
			)
			 
			|>
			 
			
			Markdown
			.
			
			parse

It is also possible to show a complete (collated) batch using showbatch:


			
			
			
			
			xs
			,
			 
			ys
			 
			=
			 
			

	
			makebatch
			(
			task
			,
			 
			data
			,
			 
			
			1
			:
			3
			)
			

			

	
			showbatch
			(
			task
			,
			 
			
			(
			xs
			,
			 
			ys
			)
			)

			┌───────────────────────────────────┬──────────────────────────────────────┐
│ x                                  y                                    │
├───────────────────────────────────┼──────────────────────────────────────┤
│ ┌                    ┐  │
│  │    n01440764 ■■■■■■■■■■■■■■■ 1.0    │
│  │    n02102040  0.0                   │
│  │    n02979186  0.0                   │
│  │    n03000684  0.0                   │
│  │    n03028079  0.0                   │
│  │    n03394916  0.0                   │
│  │    n03417042  0.0                   │
│  │    n03425413  0.0                   │
│  │    n03445777  0.0                   │
│  │    n03888257  0.0                   │
│ └                    ┘  │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
├───────────────────────────────────┼──────────────────────────────────────┤
│ ┌                    ┐  │
│  │    n01440764 ■■■■■■■■■■■■■■■ 1.0    │
│  │    n02102040  0.0                   │
│  │    n02979186  0.0                   │
│  │    n03000684  0.0                   │
│  │    n03028079  0.0                   │
│  │    n03394916  0.0                   │
│  │    n03417042  0.0                   │
│  │    n03425413  0.0                   │
│  │    n03445777  0.0                   │
│  │    n03888257  0.0                   │
│ └                    ┘  │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│ ▀▀ │                                      │
├───────────────────────────────────┼──────────────────────────────────────┤
│ ┌                    ┐  │
│  │    n01440764 ■■■■■■■■■■■■■■■ 1.0    │
│  │    n02102040  0.0                   │
│  │    n02979186  0.0                   │
│  │    n03000684  0.0                   │
│  │    n03028079  0.0                   │
│  │    n03394916  0.0                   │
│  │    n03417042  0.0                   │
│  │    n03425413  0.0                   │
│  │    n03445777  0.0                   │
│  │    n03888257  0.0                   │
│ └                    ┘  │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│ ▀▀▀▀ │                                      │
└───────────────────────────────────┴──────────────────────────────────────┘

If you used a trained model to create outputs, you can compare these to the true data with showoutputbatch:


			
			
			
			outputs
			 
			=
			 
			
			reduce
			(
			hcat
			,
			 
			
			[
			
			
			rand
			(
			10
			)
			 
			for
			
			 
			_
			 
			in
			
			 
			1
			:
			3
			]
			)
			

			

	
			showoutputbatch
			(
			task
			,
			 
			
			(
			xs
			,
			 
			ys
			)
			,
			 
			outputs
			)

			┌──────────────────────────────────────────────────────────────────────────────┬──────────────────────────────────────┐
│ Encoded sample                                                                Output                               │
├──────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────┤
│ ┌───────────────────────────────────┬──────────────────────────────────────┐ │              ┌                    ┐  │
│ │ ┌                    ┐  │ │    n01440764 ■■■■■■■■■■■■ 0.14      │
│ │  │    n01440764 ■■■■■■■■■■■■■■■ 1.0    │ │    n02102040 ■■■■■ 0.0645           │
│ │  │    n02102040  0.0                   │ │    n02979186 ■■■■■■ 0.0727          │
│ │  │    n02979186  0.0                   │ │    n03000684 ■■■■■■ 0.0727          │
│ │  │    n03000684  0.0                   │ │    n03028079 ■■■■■■■■■■■■■ 0.157    │
│ │  │    n03028079  0.0                   │ │    n03394916 ■■■■■■■■■■ 0.12        │
│ │  │    n03394916  0.0                   │ │    n03417042 ■■■■■■■■ 0.0978        │
│ │  │    n03417042  0.0                   │ │    n03425413 ■■■■■■■■■■■■ 0.141     │
│ │  │    n03425413  0.0                   │ │    n03445777 ■■■■■ 0.063            │
│ │  │    n03445777  0.0                   │ │    n03888257 ■■■■■■ 0.0705          │
│ │  │    n03888257  0.0                   │ │              └                    ┘  │
│ │ └                    ┘  │ │                                      │
│ │  │                                      │ │                                      │
│ │  │                                      │ │                                      │
│ │  │                                      │ │                                      │
│ │  │                                      │ │                                      │
│ │  │                                      │ │                                      │
│ └───────────────────────────────────┴──────────────────────────────────────┘ │                                      │
│                                                                              │                                      │
├──────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────┤
│ ┌───────────────────────────────────┬──────────────────────────────────────┐ │              ┌                    ┐  │
│ │ ┌                    ┐  │ │    n01440764 ■■■■■ 0.0617           │
│ │  │    n01440764 ■■■■■■■■■■■■■■■ 1.0    │ │    n02102040 ■■■■■■■ 0.082          │
│ │  │    n02102040  0.0                   │ │    n02979186 ■■■■■■■■■■■ 0.133      │
│ │  │    n02979186  0.0                   │ │    n03000684 ■■■■■■ 0.0761          │
│ │  │    n03000684  0.0                   │ │    n03028079 ■■■■■■■■■■■■■ 0.156    │
│ │  │    n03028079  0.0                   │ │    n03394916 ■■■■■■■■■■■■ 0.14      │
│ │  │    n03394916  0.0                   │ │    n03417042 ■■■■■■■■■■■ 0.133      │
│ │  │    n03417042  0.0                   │ │    n03425413 ■■■■■ 0.0642           │
│ │  │    n03425413  0.0                   │ │    n03445777 ■■■■■ 0.0582           │
│ │  │    n03445777  0.0                   │ │    n03888257 ■■■■■■■■ 0.0963        │
│ │  │    n03888257  0.0                   │ │              └                    ┘  │
│ │ └                    ┘  │ │                                      │
│ │  │                                      │ │                                      │
│ │  │                                      │ │                                      │
│ │  │                                      │ │                                      │
│ │  │                                      │ │                                      │
│ │ ▀▀ │                                      │ │                                      │
│ └───────────────────────────────────┴──────────────────────────────────────┘ │                                      │
│                                                                              │                                      │
├──────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────┤
│ ┌───────────────────────────────────┬──────────────────────────────────────┐ │              ┌                    ┐  │
│ │ ┌                    ┐  │ │    n01440764 ■■■■■■■ 0.0815         │
│ │  │    n01440764 ■■■■■■■■■■■■■■■ 1.0    │ │    n02102040 ■■■■■■■ 0.0873         │
│ │  │    n02102040  0.0                   │ │    n02979186 ■■■■■■■ 0.0851         │
│ │  │    n02979186  0.0                   │ │    n03000684 ■■■■■■■ 0.0826         │
│ │  │    n03000684  0.0                   │ │    n03028079 ■■■■■■■■■■■■■ 0.155    │
│ │  │    n03028079  0.0                   │ │    n03394916 ■■■■■ 0.0637           │
│ │  │    n03394916  0.0                   │ │    n03417042 ■■■■■■ 0.0729          │
│ │  │    n03417042  0.0                   │ │    n03425413 ■■■■■■■■■■■■ 0.141     │
│ │  │    n03425413  0.0                   │ │    n03445777 ■■■■■■■■■ 0.106        │
│ │  │    n03445777  0.0                   │ │    n03888257 ■■■■■■■■■■ 0.124       │
│ │  │    n03888257  0.0                   │ │              └                    ┘  │
│ │ └                    ┘  │ │                                      │
│ │  │                                      │ │                                      │
│ │  │                                      │ │                                      │
│ │  │                                      │ │                                      │
│ │  │                                      │ │                                      │
│ │ ▀▀▀▀ │                                      │ │                                      │
│ └───────────────────────────────────┴──────────────────────────────────────┘ │                                      │
│                                                                              │                                      │
└──────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────┘

These works for any learning task that deal with blocks that have a visualization defined. The following definition is all that is needed to add support for the Image block type to the text backend:


			
			
			
			function
			 
			

	
			showblock!
			(
			io
			,
			 
			
			::

	
			ShowText
			,
			 
			
			block
			::
			

	
			Image
			{
			2
			}
			,
			 
			data
			)
			
			

			
    
			
			
			ImageInTerminal
			.
			
			imshow
			(
			io
			,
			 
			data
			)
			

			

			end

			
			
			
			
			data
			,
			 
			blocks
			 
			=
			 
			
			loaddataset
			(
			
			"
			camvid
			"
			,
			 
			
			(

	
			Image
			,
			 

	
			Mask
			)
			)
			

			
			task
			 
			=
			 
			

	
			ImageSegmentation
			(
			blocks
			)

			BlockTask(Image{2} -> Mask{2, String})

			
			
			
			sample
			 
			=
			 
			

	
			getobs
			(
			data
			,
			 
			1
			)
			

			

	
			showsample
			(
			task
			,
			 
			sample
			)

			┌───────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────┐
│ Input                                                          Target                                                        │
├───────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────┤
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
│ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │
└───────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────┘

showblock


			
			
			
			
			data
			,
			 
			blocks
			 
			=
			 
			
			loaddataset
			(
			
			"
			pascal_2007
			"
			,
			 
			
			(

	
			Image
			,
			 

	
			LabelMulti
			)
			)
			

			
			sample
			 
			=
			 
			

	
			getobs
			(
			data
			,
			 
			6
			)
			

			

	
			showblock
			(
			blocks
			,
			 
			sample
			)

			┌───────────────────────────────────────────────────────────────┬──────────────────────────────────────┐
│ ▀▀▀▀ │ SubString{String}["person", "horse"] │
│ ▀▀ │                                      │
│ ▀▀ │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│ ▀▀ │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│  │                                      │
│ ▀▀▀▀▀▀▀▀ │                                      │
└───────────────────────────────────────────────────────────────┴──────────────────────────────────────┘

showblock and showblocks

Using showblock, arbitrary visualizations can be created:


			
			
			
			blocks
			 
			=
			 
			
			(
			
			
			"
			Image
			"
			 
			=>
			 
			
			

	
			Image
			{
			2
			}
			(
			)
			,
			 
			
			
			"
			Mask
			"
			 
			=>
			 
			
			

	
			Mask
			{
			2
			}
			(
			
			1
			:
			3
			)
			,
			 
			
			
			"
			Class label
			"
			 
			=>
			 
			

	
			Label
			(
			
			1
			:
			10
			)
			)
			

			
			obs
			 
			=
			 
			
			

	
			FastAI
			.
			

	
			mockblock
			(
			
			last
			.
			
			(
			blocks
			)
			)
			

			

	
			showblock
			(
			blocks
			,
			 
			obs
			)

			┌──────────────────────────────────┬──────────────────────────────────┬─────────────┐
│ Image                             Mask                              Class label │
├──────────────────────────────────┼──────────────────────────────────┼─────────────┤
│ ████████████████████████████████████████████████████████████████ │ 3           │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
└──────────────────────────────────┴──────────────────────────────────┴─────────────┘

showblocks visualizes multiple observations:


			
			
			

	
			showblocks
			(
			blocks
			,
			 
			
			[
			
			
			

	
			FastAI
			.
			

	
			mockblock
			(
			
			last
			.
			
			(
			blocks
			)
			)
			 
			for
			
			 
			_
			 
			in
			
			 
			1
			:
			2
			]
			)

			┌──────────────────────────────────┬──────────────────────────────────┬─────────────┐
│ Image                             Mask                              Class label │
├──────────────────────────────────┼──────────────────────────────────┼─────────────┤
│ ████████████████████████████████████████████████████████████████ │ 2           │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
├──────────────────────────────────┼──────────────────────────────────┼─────────────┤
│ ████████████████████████████████████████████████████████████████ │ 6           │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
│ ████████████████████████████████████████████████████████████████ │             │
└──────────────────────────────────┴──────────────────────────────────┴─────────────┘

Makie

Makie.jl is no longer a required dependency. Instead, Makie.jl visualizations are only loaded if you have it imported (using Requires.jl). This reduces the load time of FastAI.jl significantly.


			
			
			
			
			data
			,
			 
			blocks
			 
			=
			 
			
			loaddataset
			(
			
			"
			imagenette2-320
			"
			,
			 
			
			(

	
			Image
			,
			 

	
			Label
			)
			)
			

			
			task
			 
			=
			 
			

	
			ImageClassificationSingle
			(
			blocks
			)

			BlockTask(Image{2} -> Label{String})

showsample shows one sample from the data container:


			
			
			
			sample
			 
			=
			 
			

	
			getobs
			(
			data
			,
			 
			1
			)
			

			

	
			showsample
			(
			task
			,
			 
			sample
			)

showencodedsample shows a sample after encodings have been applied to it:


			
			
			
			
			x
			,
			 
			y
			 
			=
			 
			

	
			encodesample
			(
			task
			,
			 
			

	
			Validation
			(
			)
			,
			 
			sample
			)
			

			

	
			showencodedsample
			(
			task
			,
			 
			
			(
			x
			,
			 
			y
			)
			)

Any encoded block that can't be visualized (here ImageTensor) is decoded until it can be using the task's encodings.


			
			
			
			task
			.
			
			encodings

			(ProjectiveTransforms{2}(
    sz = (128, 128), 
    buffered = true, 
    augmentations = DataAugmentation.Identity()
), ImagePreprocessing{FixedPointNumbers.N0f8, 3, ColorTypes.RGB, Float32}(
    buffered = true, 
    augmentations = DataAugmentation.Identity()
), OneHot{DataType}(Float32, 0.5f0))

It is also possible to show a complete (collated) batch using showbatch:


			
			
			
			
			xs
			,
			 
			ys
			 
			=
			 
			

	
			makebatch
			(
			task
			,
			 
			data
			,
			 
			
			1
			:
			3
			)
			

			

	
			showbatch
			(
			task
			,
			 
			
			(
			xs
			,
			 
			ys
			)
			)

If you used a trained model to create outputs, you can compare these to the true data with showoutputbatch:


			
			
			
			outputs
			 
			=
			 
			
			reduce
			(
			hcat
			,
			 
			
			[
			
			
			rand
			(
			10
			)
			 
			for
			
			 
			_
			 
			in
			
			 
			1
			:
			3
			]
			)
			

			

	
			showoutputbatch
			(
			task
			,
			 
			
			(
			xs
			,
			 
			ys
			)
			,
			 
			outputs
			)

These works for any learning task that deal with blocks that have a visualization defined. The following definition is all that is needed to add support for the Image block type to the text backend:


			
			
			
			function
			 
			

	
			showblock!
			(
			io
			,
			 
			
			::

	
			ShowText
			,
			 
			
			block
			::
			

	
			Image
			{
			2
			}
			,
			 
			data
			)
			
			

			
    
			
			
			ImageInTerminal
			.
			
			imshow
			(
			io
			,
			 
			data
			)
			

			

			end

			
			
			
			
			data
			,
			 
			blocks
			 
			=
			 
			
			loaddataset
			(
			
			"
			camvid
			"
			,
			 
			
			(

	
			Image
			,
			 

	
			Mask
			)
			)
			

			
			task
			 
			=
			 
			

	
			ImageSegmentation
			(
			blocks
			)

			BlockTask(Image{2} -> Mask{2, String})

			
			
			
			sample
			 
			=
			 
			

	
			getobs
			(
			data
			,
			 
			1
			)
			

			

	
			showsample
			(
			task
			,
			 
			sample
			)

showblock


			
			
			
			
			data
			,
			 
			blocks
			 
			=
			 
			
			loaddataset
			(
			
			"
			imagenette2-320
			"
			,
			 
			
			(

	
			Image
			,
			 

	
			Label
			)
			)
			

			
			sample
			 
			=
			 
			

	
			getobs
			(
			data
			,
			 
			1
			)
			

			

	
			showblock
			(
			blocks
			,
			 
			sample
			)

			
			
			
			
			data
			,
			 
			blocks
			 
			=
			 
			
			loaddataset
			(
			
			"
			pascal_2007
			"
			,
			 
			
			(

	
			Image
			,
			 

	
			LabelMulti
			)
			)
			

			
			sample
			 
			=
			 
			

	
			getobs
			(
			data
			,
			 
			6
			)
			

			

	
			showblock
			(
			blocks
			,
			 
			sample
			)

showblock and showblocks

Using showblock, arbitrary visualizations can be created:


			
			
			
			blocks
			 
			=
			 
			
			(
			
			
			"
			Image
			"
			 
			=>
			 
			
			

	
			Image
			{
			2
			}
			(
			)
			,
			 
			
			
			"
			Mask
			"
			 
			=>
			 
			
			

	
			Mask
			{
			2
			}
			(
			
			1
			:
			3
			)
			,
			 
			
			
			"
			Class label
			"
			 
			=>
			 
			

	
			Label
			(
			
			1
			:
			10
			)
			)
			

			
			obs
			 
			=
			 
			
			

	
			FastAI
			.
			

	
			mockblock
			(
			
			last
			.
			
			(
			blocks
			)
			)
			

			

	
			showblock
			(
			blocks
			,
			 
			obs
			)

showblocks visualizes multiple observations:


			
			
			

	
			showblocks
			(
			blocks
			,
			 
			
			[
			
			
			

	
			FastAI
			.
			

	
			mockblock
			(
			
			last
			.
			
			(
			blocks
			)
			)
			 
			for
			
			 
			_
			 
			in
			
			 
			1
			:
			2
			]
			)