PyCallの作者さんのGemがあった。

https://github.com/mrkn/ruby-mnist

images = Mnist.load_images('train-images-idx3-ubyte.gz')[2].size # => 60000
labels = Mnist.load_labels('train-labels-idx1-ubyte.gz').size # => 60000

pixels = images[0].unpack('C*')
pixels.size # => 784
labels[0] # => 5

pixels.map { |p| p > 100 ? '*' : ' ' }.each_slice(28).map { |a| a.join('') }.join("\n")





                *** ****    
           ************     
        **********          
        **********          
         *****   *          
           **               
           ***              
            **              
             ****           
              ****          
               ****         
                 ***        
                 ***        
               *****        
             *******        
           *******          
          ******            
       *******              
     ********               
    *******                 



という感じで使える。

unpack、苦手意識ある。

unpack (String) - Rubyリファレンス

文字列のバイト列を引数formatの書式に従って分解し、配列を返します。文字列をバイナリデータとして扱うときに使います。

わかりやすい。