Back to Top

Monthly Archives: 3月 2017

MNIST手書き文字データを画面表示する

機械学習などに使用されるMNIST手書き文字データをピクチャーボックスに表示する方法を記載します。

MNIST手書き文字データは、手書き文字データファイルとラベルファイルの2つのファイルに分かれています。

文字データファイルの構造

先頭の16バイトがヘッダー部で、それ以降がデータ部分になっています。

  • マジックナンバー:4バイト
  • 文字データ数:4バイト
  • イメージ高さ:4バイト
  • イメージ幅 :4バイト
  • 文字データ:784バイト
  • 文字データ:784バイト
  • ・・・・

 

ラベルデータの構造

先頭の8バイトがヘッダー部で、それ以降がラベルになっています。

  • マジックナンバー:4バイト
  • ラベル数:4バイト
  • ラベル:1バイト
  • ラベル:1バイト
  • ・・・・

 
MNIST手書き数字データは、THE MNIST DATABASEからダウンロードできます。

 

MNIST手書き文字データを画面に表示させる

フォームにボタン、ピクチャーボックス、リストボックスを配置します。

Const cImageSize = 28                                   'イメージのザイズ  24bit color 32 * 32 * 3 = 3072
Const cImageDataLength = cImageSize * cImageSize        'チャネルあたりのバイト数 (784 Byte)

<StructLayout(LayoutKind.Sequential, Pack:=1)>
Friend Structure MNISTImageHead
    <VBFixedArray(4 - 1)> Public MagicNumber() As Byte      'マジックナンバー
    <VBFixedArray(4 - 1)> Public Images() As Byte           'データ個数
    <VBFixedArray(4 - 1)> Public Rows() As Byte             'イメージ高さ
    <VBFixedArray(4 - 1)> Public Columns() As Byte          'イメージ幅
End Structure

<StructLayout(LayoutKind.Sequential, Pack:=1)>
Friend Structure MNISTImageData
    <VBFixedArray(cImageDataLength - 1)> Public Pixel() As Byte          '1つのイメージデータ
End Structure

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim FilePath As String = "C:\work\train-images.idx3-ubyte"

    'レコード長を取得する
    Dim ImageHedLen As Long = Len(New MNISTImageHead())     'ヘッダーレコード長
    Dim ImageDataLen As Long = Len(New MNISTImageData())    'データレコード長

    Dim ImageHead = New MNISTImageHead()                    'ヘッダー読み込み領域
    Dim ImageData = New MNISTImageData()                    'データ読み込み領域

    'ファイルをオープンする
    Dim FileNo As Integer = FileSystem.FreeFile
    FileSystem.FileOpen(FileNo, FilePath, OpenMode.Random, OpenAccess.Read, OpenShare.Default, 1)

    'イメージデータ数を取得する
    Dim fileBytes As Long = FileSystem.LOF(FileNo)
    Dim recordMax As Long = (fileBytes - ImageHedLen) \ ImageDataLen

    FileSystem.FileGet(FileNo, ImageHead)                   'ヘッダー読み込み

    For rec As Integer = 1 To recordMax
        Dim pos As Long = ImageDataLen * (rec - 1) + ImageHedLen
        FileSystem.Seek(FileNo, pos)
        FileSystem.FileGet(FileNo, ImageData)               'イメージデータ読み込み

        Dim bmp = MNISTToBitmap(ImageData)                  'イメージデータをビットマップ変換
        PictureBox1.Image = bmp
        PictureBox1.Refresh()

        MNISTImageDataDisp(ImageData)                       'バイナリーデータを画面表示

        System.Threading.Thread.Sleep(100)
    Next

    'ファイルをクローズする
    FileSystem.FileClose(FileNo)
End Sub

'イメージデータをビットマップ変換
Private Function MNISTToBitmap(ImageData As MNISTImageData)
    Dim Data As Byte() = New Byte(cImageDataLength - 1) {}

    For i = 0 To cImageDataLength - 1
        Data(i) = ImageData.Pixel(i)
    Next

    Dim bmp As Bitmap = New Bitmap(cImageSize, cImageSize, PixelFormat.Format8bppIndexed)
    Dim rect = New Rectangle(0, 0, cImageSize, cImageSize)

    Dim bitmapData = bmp.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed)
    Marshal.Copy(Data, 0, bitmapData.Scan0, Data.Length)
    bmp.UnlockBits(bitmapData)

    Return bmp
End Function

'バイナリーデータを画面表示
Private Sub MNISTImageDataDisp(ImageData As MNISTImageData)
    ListBox1.Items.Clear()
    Dim pnt As Integer = 0
    For i = 0 To cImageSize - 1
        Dim s As String = ""
        For j = 0 To cImageSize - 1
            s = s + " " + String.Format("{0:X2}", ImageData.Pixel(pnt))
            pnt = pnt + 1
        Next
        ListBox1.Items.Add(s)
    Next
    ListBox1.Refresh()
End Sub

 

ラベルデータを画面に表示させる

フォームにボタン、ラベルを配置します。

<StructLayout(LayoutKind.Sequential, Pack:=1)>
Friend Structure MNISTLabelHead
    <VBFixedArray(4 - 1)> Public MagicNumber() As Byte              'マジックナンバー
    <VBFixedArray(4 - 1)> Public Images() As Byte                   'データ個数
End Structure

<StructLayout(LayoutKind.Sequential, Pack:=1)>
Friend Structure MNISTLabelData
    <VBFixedArray(cImageDataLength - 1)> Public Label() As Byte     'ラベル
End Structure

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button4.Click
    Dim FilePath As String = "C:\work\train-labels.idx1-ubyte"

    'レコード長を取得する
    Dim LabelHedLen As Long = Len(New MNISTLabelHead())     'ヘッダーレコード長
    Dim LabelDataLen As Long = Len(New MNISTLabelData())    'データレコード長

    Dim LabelHead = New MNISTLabelHead()                    'ヘッダー読み込み領域
    Dim LabelData = New MNISTLabelData()                    'データ読み込み領域

    'ファイルをオープンする
    Dim FileNo As Integer = FileSystem.FreeFile
    FileSystem.FileOpen(FileNo, FilePath, OpenMode.Random, OpenAccess.Read, OpenShare.Default, 1)

    'イメージデータ数を取得する
    Dim fileBytes As Long = FileSystem.LOF(FileNo)
    Dim recordMax As Long = (fileBytes - LabelHedLen) \ LabelDataLen

    FileSystem.FileGet(FileNo, LabelHead)                   'ヘッダー読み込み

    For rec As Integer = 1 To recordMax
        Dim pos As Long = LabelDataLen * (rec - 1) + LabelHedLen
        FileSystem.Seek(FileNo, pos)
        FileSystem.FileGet(FileNo, LabelData)               'イメージデータ読み込み

        Label1.Text = String.Format("{0:X2}", LabelData.Label(0))
        Label1.Refresh()
        System.Threading.Thread.Sleep(100)
    Next

    'ファイルをクローズする
    FileSystem.FileClose(FileNo)
End Sub

 

 

WindowsのAnaconda環境にTensorFlowをインストール

Windows版のAnaconda環境に、TensorFlowをインストールする方法を記載します。

Anacondaはインストールされているものとして説明を進めます。

TensorFlowを動作させる場合は、Anacondaの64bit版がインストールされている必要があります。

 

以下の説明は、AnacondaにTensorFlow専用の環境を作成して、インストールする手順とします。

初めにAnaconda専用の、Anaconda Promptを起動します。

TensorFlow公式サイト

 

TensorFlow専用の仮想環境の作成

仮想環境の作成には、condaを使用します。

conda create -n tensorflow python=3.5

上記は、仮想環境 tensorflow を作成して、Python3.5をインストールしています。

※現在(2017/03) TensorFlowは、Python3.5の環境で動作します。
 

TensorFlowのインストール

TensorFlowは、pipコマンドを使用してインストールします。

TensorFlowの仮想環境に移動します。

activate tensorflow

 
TensorFlowをインストールします。(TensorFlow1.0をインストール)

pip install tensorflow

旧バージョンのインストールは、下記のようにします。

pip install --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.1-cp35-cp35m-win_amd64.whl

 

TensorFlowのパッケージを確認します。

conda list

 

TensorFlowの動作確認

以下のコマンドを実行し、バージョンが表示されたら成功です。

python -c "import tensorflow; print(tensorflow.__version__);"

 

Jupyter Notebookのインストール

通常インストールされているので、インストールの必要はありませんが、うまく動作しないときがあります。ので記載します。

Jupyter Notebookのアップデート

pip install -U jupyter

Jupyter Notebookのインストール

pip install jupyter

※Jupyter Notebookを使用するブラウザーはGoogle Chromeを使用しないとうまく動作しない場合があります。

 

Jupyter Notebookの起動

jupyter notebook

Jupyter Notebookにて、TensorFlowの動作確認

import tensorflow as tf

hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

 

TensorBoardの可視化

import tensorflow as tf

# 定数で1 + 3
x = tf.constant(1, name='x')
y = tf.constant(3, name='y')
z = x + y

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(z)
    # FileWriterでグラフを書く
    summary_writer = tf.summary.FileWriter('data', graph=sess.graph)
    tf.summary.scalar('one_plus_one_summary', z)

上記のコードを実行させる。

 

TensorBoardを起動させる

tensorboard --logdir data

http://localhost:6006

上記のコードは、TensorFlow 1.0で記述しています。詳しくは公式サイトを見てください。