読者です 読者をやめる 読者になる 読者になる
自分のための備忘録的なブログです。

Ubuntu14.04LTS および Win10 を使って、ディープラーニングの勉強をしています。記載されているコードは、他の OS には互換性がない可能性があります。


DNN:
マシン性能別 学習速度の比較, TFチュートリアルをmodifyする

python3:
オブジェクト指向プログラミングとは, モジュールとインポート、パスを通す, システムコマンド(os), ファイル・フォルダ名取得, 画像の前処理,

Ubuntu14 の初期設定:
Ubuntu14初期設定, 初期設定-2, cudaなども,

pydicom の基本的な使い方

DICOM ファイルを python で扱いたいとき、まず触るのが pydicom でしょう。

科学技術分野に強いプログラミング言語python で dicom を自由に扱えるようになれば、医用画像の研究にとても便利! もちろんディープラーニングにも。

しかし日本語ドキュメントが少ないのが残念なところ。

とりあえず、いくつかコードを試してみます。

 

Python で DICOM を扱うのは、情報が少ないですが、

学習できるページ:

https://pyscience.wordpress.com/2014/09/08/dicom-in-python-importing-medical-image-data-into-numpy-with-pydicom-and-vtk/ 

http://qiita.com/fukuit/items/ed163f9b566baf3a6c3f

 

元のユーザーガイドはこちらです(英語)。

Pydicom User Guide — pydicom 1.0a documentation

一通りのコマンドを使ってみます。

 

python 3.6 (Anaconda) + pydicom 0.9.9 にて動作確認。

・・・・・・・・・・・・・・・・・・・・・・・・・・・

 

 

pydicom をインストールする。

PIP を使えば簡単。

bash

$ bash

pip install pydicom

 

pydicom のバージョンを確認する。

PIP にて確認。

bash

 $ bash

pip freeze

 

# answer

alabaster==0.7.9

anaconda-client==1.6.0

anaconda-navigator==1.5

...

pydicom==0.9.9

...

xlrd==1.0.0

XlsxWriter==0.9.6

xlwt==1.2.0 

 

 

 

pydicom をインポートする

# 以下、python

 

>>> python

import dicom #0.9.9までの対応

import pydicom as dicom #1.0以降への対応 

 

# 互換性を維持するため、呼び出し時のメソッドを、pydicom から dicom に変更。

 

# よく使うので、自分はついでに

import sys, os, time, random, dicom, pylab, cv2

import numpy as np

import tensorflow as tf

import matplotlib.pyplot as plt

from PIL import Image

# あたりまで一気にインポートしてしまう。

# コピペ。

 

DICOM 画像を読み込む

 

dicom.read_file() を使う

>>> python

ds = dicom.read_file("IM0.dcm")  # 0.9.9

 

# version >= 1.0a で、メソッドを変更しておかない場合は

ds = pydicom.read_file("IM0.dcm") # >= 1.0a

# dicom.read の代わりに pydicom.read と書く。

 

 

 

 

DICOM ヘッダーを表示する

 

>>> python

ds

 

# answer

(0008, 0005) Specific Character Set CS: 'ISO_IR 100'
(0008, 0008) Image Type CS: ['DERIVED', 'SECONDARY', 'AXIAL', 'MPR THICK', '', '', 'PARALLEL']
(0008, 0012) Instance Creation Date DA: '20171201'
(0008, 0013) Instance Creation Time TM: '105041.192537'
(0008, 0016) SOP Class UID UI: CT Image Storage

...

(0008, 0060) Modality CS: 'CT'

....

 

 

 

 

特定の DICOM ヘッダーを表示する

 

>>> python

ds.Modality

 

# answer

CT

 

 

 

ヘッダーを指定するメソッド( DICOM タグ)を確認する

 

>>> python

ds.dir()

 

# answer

['AccessionNumber', 'AcquisitionDate', 'AcquisitionNumber', 'AcquisitionTime', 'BitsAllocated', 'BitsStored', 'ClinicalTrialProtocolID', 'ClinicalTrialProtocolName', 'ClinicalTrialSiteID', 'ClinicalTrialSiteName', 'ClinicalTrialSponsorName', 'ClinicalTrialSubjectID', 'ClinicalTrialTimePointID', 'Columns', 'ContentDate', 'ContentTime',

(中略)

, 'PatientPosition', 'PatientSex', 'PhotometricInterpretation', 'PixelData', 'PixelRepresentation', 'PixelSpacing', 'PositionReferenceIndicator', 'PresentationLUTShape', 'ProcedureCodeSequence', 'ProtocolName', 'ReferringPhysicianName', 'RequestAttributesSequence', 'RequestedProcedureDescription', 'RescaleIntercept', 'RescaleSlope', 'Rows', 'SOPClassUID', 'SOPInstanceUID', 'SamplesPerPixel', 'SeriesDate', 'SeriesDescription', 'SeriesInstanceUID', 'SeriesNumber', 'SeriesTime', 'SliceThickness', 'SpecificCharacterSet', 'StationName', 'StudyDate', 'StudyDescription', 'StudyID', 'StudyInstanceUID', 'StudyTime', 'WindowCenter', 'WindowCenterWidthExplanation', 'WindowWidth'] 

 

 

 

特定の DICOM タグがあるかどうかを確認する

>>> python

"PatientsName" in ds

# answer

True

 

"Patients\ Name" in ds 

# answer

False

 

 

"""Patients Name""" in ds 

# answer

False

 

 

 

 

"pat" の入っている DICOM タグだけを grep (検索)したい

 

>>> python

ds.dir("pat")

 

# answer
 

['ImageOrientationPatient', 'ImagePositionPatient', 'IssuerOfPatientID', 'PatientAge', 'PatientBirthDate', 'PatientID', 'PatientIdentityRemoved', 'PatientName', 'PatientPosition', 'PatientSex']

 

 

 

特定の DICOM タグを削除する # 挙動は未確認

>>> python

del ds[0x10,0x1000]

 

# OR

 

tag = ds.data_element("OtherPatientIDs").tag
del ds[tag]

 

 

 

ピクセルデータを取り出したい

幾つかの方法がある。

一列でデータを取る。

  普通に DL 目的に使うならこちらで良いか。

# MRIデータ

>>> python

pixel_bytes = ds.PixelData

pixel_bytes

 

 

# answer

\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00

\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00

\x00\x00\x00\x00\x00\x00 ....

 

# CT データ 。

 

>>>python

CT_pixel_bytes = ds.PixelData

CT_pixel_bytes

 

# answer

'x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\

#中略

0\x93\x00\x8b\x00}\x00V\x00F\x008\x007\x00<\x00B\x00@\x00@\

x000\x00;\x005\x001\x00=\x00,\x00(\x00*\x00$\x00,\x00\x004\x00/\

x00G\x00^\x00Z\x00T\x00^\x00\x00R\x00N\x00G\x00F\x00?\

x00:\x003\x00-\x00:\x003\x00=\

#中略

\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

### CT では x00^ とか、x00Z とか、多彩な数字が出てきました (^_^;)

### x00 が マイナス1000 でしょうね。

### わからん・・・

 

array, 2次元でデータを取る。  

  jpg とかの CNN と、互換性を気にするならこちら。

>>> python
pix = ds.pixel_array # NumPy ライブラリが必要とのこと

pix 

 

 

# answer

array([[0, 0, 0, ..., 0, 0, 0],
          [0, 0, 0, ..., 0, 0, 0],
          [0, 0, 0, ..., 0, 0, 0],
          ...,
          [0, 0, 0, ..., 0, 0, 0],
          [0, 0, 0, ..., 0, 0, 0],
          [0, 0, 0, ..., 0, 0, 0]], dtype=int16)

### int16 16ビット整数

### -2 **15 から 2**15 - 1 の値をとる。

### -32768 ~ 32767

### ムムム、バックグラウンドは-1000HU のはずなのに、0になっとる。。。 

 

 

 

 

 

画像を表示させたい

matplotlib を使う場合。

 

>>> python

import matplotlib.pyplot as plt

import pylab

ds = dicom.read_file("IM0.dcm")

im = ds.pixel_array

plt.imshow(im, cmap=pylab.cm.bone)

plt.show() 

 

ちなみに、普通に

>>> python

import matplotlib.pyplot as plt

import pylab

ds = dicom.read_file("IM0.dcm")

im = ds.pixel_array

plt.imshow(im) #ここが違う

plt.show()

普通に plt.imshow(im) とすると、なぜかカラー画像になっちゃう。

 

ひとまず、以上。

 

data を漬物(pickle)にする。

※ unpickle して NN に戻すところがうまくいきません。

 うまく言ったら update します。

 

 

ディープラーニングの前処理で、画像データは行列データに変換される。

自分の作成した CNN では、list になる。

 

どうも、この

画像データ → リスト化

部分に時間がかかっているので、この部分を速くしたい。

 

python のデータ保存形式に pickle というものがあるらしい。複数形は pickles, ピクルスすなわち漬物。このネーミングが面白い。

 

Anaconda には入っていた(というか、default で python に入っているっぽいけど)ので

ので、新たにインストールする必要はない。

まず

import pickle

 続いて

with open('保存したいファイル名', 'wb') as なんか適当な名前:

    pickle.dump(保存したいもの, なんか適当な名前)

みたいな形式。

 

ちなみにバージョンが4種類 (0-3) あるらしく、 python2.7 では version 3 は読み込めないらしい。Python 2.7 でも扱う場合には、version 2 までにとどめておいたほうが無難。

また、fix_imports=True を入れておくと、python2との互換性を保とうとするらしい。

 

なので、具体的には

with open('imagedata.pickle', 'wb') as f:

    pickle.dump(foo, f, protocol = 2, fix_imports=True) 

with open('imagelabel.pickle', 'wb') as f:

    pickle.dump(bar, f protocol = 2, fix_imports=True)

みたいに保存。

 

Python3 でしか使わないなら、Version3 で保存したほうが圧縮率が高い。

  Version3だと、データ容量は20分の1程度に減少。Version2のfix_imports=True だと、その15%増しくらいの容量でした。

 

読み込みは

with open('imagedata.pickle', 'rb') as f:

    pickle.load(f, fix_imports=True)

みたいな感じでしょうか。よくわかりません。

 

pickle 化してから再読込すると、作成した CNN が走らないので、目下この問題の修正中。

・・・っていうか、ネット上には多数の画像認識 CNN の記事が溢れてるけど、みんなデータ取り込みをどうしてるんだろうね。TensorFlow のみでは、まだ data augmentation に満足できないので(5度とか10度とか、微妙に回転させたい)、

 データを openCV に落として、

 また tensorflow variables に戻して、

みたいなことができるようになりたい。

でも tensorflow にそういう微妙な回転が実装されていないということは、回転させなくても診断能は変わらないのかな、謎。

 

12.1. pickle — Python オブジェクトの直列化 — Python 3.6.1 ドキュメント

11.1. pickle — Python オブジェクトの直列化 — Python 2.7.13 ドキュメント

pickleでオブジェクトをファイルに保存する - Qiita

tensorboard を開く。

bash

tensorboard --logdir=/tmp/tensorflow_log


 をタイプする。

コンソールに返信があれば

 

ブラウザで

http://localhost:0.0.0.0.6006

とタイプ。

localhost://0.0.0.0:6006 云々は、コンソールに返信があるので覚えておかなくて大丈夫。

 

tensorboard の終了は Ctrl + C。必ず終了すること!!

同時に2つの tensorboard は立ちあげられないみたい。なので、前の tensorboard を終了してないと、次に学習しても tensorboard が立ち上がらない。

 

いろいろ可視化するには、コードに仕込んでおかないといけないみたい。まだそこまではできていない。

CNNディープラーニング前処理 画像をDL用に処理する。

フォルダ内のすべてのファイル取得(python

import glob
glob.glob('*')

 

for FILENAME in glob.glob('*'):
    print(FILENAME)

 イマイチ違いがわかってない。

 2.は for loop を回してるので遅いのかな?

 

Bash

for dir in $(ls .);do echo $dir; done

 

再帰的にディレクトリ構造を得る

# -*- coding:utf-8 -*-

import os

def get_abspath_recursive(directory):

    for root, dirs, files in os.walk(directory):

        yield root

        for file in files:

            yield os.path.join(root, file)

 

for file in get_abspath_recursive('.'):

    print(file)

参考: http://qiita.com/suin/items/cdef17e447ceeff6e79d

 

 

画像の表示, python3

# -*- coding:utf-8 -*-

from PIL import Image

import matplotlib.pyplot as plt

im = Image.open("xxx.jpg")

plt.imshow(im)

plt.show() 

 

 

画像のリサイズ, python3

# -*- coding:utf-8 -*-

from PIL import Image

im = Image.open("xxx.jpg").resize(  (100.100) )

im.save("NEWFILENAME.jpg")

  ※トリミングではないので、画像が変形する。

 

 

 

あるフォルダ内のすべての ,jpg ファイルを、短辺で正方形に crop する。

 

 Cropされたファイルはカレントディレクトリに入る。(python3)

 

 

# -*- coding: utf-8 -*-

'''フォルダ内にある .jpg を短辺で正方形に crop
'''

import os
import cv2


def main():
    for file_name in os..listdir('.'):
        root, ext = os.path.splitext(file_name)

 

        if ext == '.jpg':
            img = cv2.imread(file_name)
            height, width, channels = img.shape

            if height == width:
                cv2.imwrite("cropped_" + file_name, img)
            elif height > width:
                Start = (height - width) // 2
                End   = Start + width
                clp     = img[Start:End, :]
                cv2.imwrite("cropped_" + file_name ,clp)
            else:
                Start = (width - height) // 2
                End   = Start + height
                clp    = img[:, Start:End]
                cv2.imwrite("cropped_" + file_name ,clp)

        else:

            pass

 
if __name__ == '__main__':
    main()

 参考: http://qiita.com/satoshicano/items/bba9594a1203e24e2a31

 

 

あるフォルダ内のすべての .jpg ファイルを、長辺で正方形に crop? する。

 Cropされたファイルはカレントディレクトリに入る。(python3)

 

# -*- coding: utf-8 -*-


'''フォルダ内にある .jpg を長辺で正方形に crop'''

 

import os
import cv2
import numpy as np

 

def main():

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

        if ext == '.jpg':

            img = cv2.imread(file_name)

            height, width, channels = img.shape

            tmp = img[:, :] 

 

            if height > width:

                size = height

                limit = width
            else:

                size = width

                limit = height

 

            start = int( (size - limit) / 2)

            fin = int( (size + limit) / 2)

 

            new_img = cv2.resize(np.zeros( (1, 1, 3), np.uint8), (size, size) )

            if size == height:

                new_img[:, start:fin] = tmp

                cv2.imwrite("squared_" + file_name ,new_img)

            else:

                new_img[start:fin, :] = tmp

                cv2.imwrite("squared_" + file_name ,new_img)

        else:

            pass

 

if __name__ == '__main__':

    main()

 

カレントディレクトリの、すべての .jpg ファイルを rotate させるスクリプト(python3)

# -*- coding: utf-8 -*-
'''
フォルダ内にある .png, .jpeg, .jpg を rotate して保存する。
'''

import os

from PIL import Image

 

def main():

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

 

        if ext == '.jpg':

            img = Image.open(file_name)

            for Degree in (-15, -12, -8, -4, -2, 0, 2, 4, 8, 12, 15):

# for Degree in (この中に、保存したい角度を入れる。)

                Rotate = img.rotate(Degree)

                Rotate.save("rot_" + str(Degree) + file_name)

 

 

        else:

            pass 

 

if __name__ == '__main__':

    main()

 

 カレントディレクトリのすべての .jpg ファイルを左右 flip するスクリプト

 

 # -*- coding: utf-8 -*-
'''
フォルダ内にある .jpg を flip して保存する。
'''

import os

from PIL import Image

 

def main():

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

 

        if ext == u'.jpg':
            img = Image.open(file_name)
            tmp = img.transpose(Image.FLIP_LEFT_RIGHT)
            tmp.save("flipped_" + file_name)

        else:

            pass

 

if __name__ == '__main__':

    main()

 

カレントディレクトリの全ての .jpg ファイルで、画像の彩度・明度・コントラストを変更して画像枚数を増やす。

# -*- coding: utf-8 -*-
'''カレントディレクトリの .jpg の彩度、明度、コントラストを変更する'''

import os
from PIL import Image
from PIL import ImageEnhance

def main():

#彩度:saturation を変更して保存する。

    for file_name in os.listdir('.'):
        root, ext = os.path.splitext(file_name)

        if ext == u'.jpg':

            img = ImageEnhance.Color(Image.open(file_name))

            for i in (0.5, 1.5):

                tmp = img.enhance(i)

                j = str(i)

                tmp.save("_Sat_" + j + file_name)

            else:

                pass

 

#明度: brightness を変更して保存する

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

        if ext == u'.jpg':

            img = ImageEnhance.Brightness(Image.open(file_name))

            for i in (0.5, 1.2):

                tmp = img.enhance(i)

                j = str(i)

                tmp.save("_Brt_" + j + file_name)

        else:

            pass

 

#コントラスト: contrast を変更して保存する

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

        if ext == u'.jpg':

            img = ImageEnhance.Contrast(Image.open(file_name))

            for i in (0.5, 1.2):

                tmp = img.enhance(i)

                j = str(i)

                tmp.save("_Cnt_" + j + file_name)

        else:

            pass

 

if __name__ == '__main__':
    main()

 

#参考: https://kazutoyo.jp/archives/74

 

 

Kindle を Ubuntu14 インストールできず、ついでに Ubuntu を破壊してしまった。

また しないようにメモ。

 

ディープラーニングを勉強するのに、Kindle 本を Ubuntu14 で読めると便利。

ググると、Wine というソフトを使うと、Kindleが使えるらしい。

 

MS OfficeScanSnap が使えるならば、Ubuntu に完全移行できるので、結構期待大)

 

1.ソフトウェアセンターから Wine インストー

 Kindle for PC インストールできない。

 ググる、Wine の設定を変更してみることに。

2.Wine XP → 8

 デフォルトで設定が「Win XPエミュ」みたいになっていたので、「8」に買えてみる。

 インストールできない。

3.Wine にはいくつかのバージョンがあるらしい。

 Wine 1.7, 1.8 など、異なるバージョンをインストールしてみる。「Win エミュレーター」の部分も 「7」「8」「8.1」「2008」「10」など試してみる。

  やはり Kindle for PC はインストールできない。

 

4.sudo apt-get --purge remove で Wine をアンインストー

 おっ、なんかいろんなアプリケーションがアンインストールされたな。

 良いのかな・・・こんなにアンインストールして。

 メインのシステムでは使わない方がいいのかも。

 

 『なんか「autoremove」を使うと、関連のなくなったアプリを削除できる』みたいな記載があるなぁ。やってみるか。 ← (やっちゃだめ)

 

5.sudo apt-get autoremove

 いろんなアプリが削除された! 使ってない LibreOffice ソフトとか!

 確かに普段使わないけど、なにげに困るぞ!

 ヤバいことになってきたので、復旧のために ~/Download を外付け HDD に backup しておこう。

 

6.再起動・・・起動しない!!

 Ubuntu が起動して、ログインのためのパスワード入力画面になる。

 パスワードを入力してもログインできない。

 正しいパスワードを入力しても、またパスワード入力画面になってしまう。

 

 壊れてしまった・・・

 

7.再インストール!!

 「ディスクをフォーマットしない」でインストールしたら、起動に必要なパッケージをインストールしてくれたらしく、無事起動するようになる。

 サルベージ仕切れなかったファイルを回収。

 

8.フォーマット付きで再インストー

 Ubuntu 14.04.5 EN バージョンだけど、インストールの作業する言語を「日本語」にすると、日本語入力ソフト(Anthy)もインストールしてくれる。Fcitx + Mozc に買えるけど。

 ~/ のフォルダ名も日本語になってしまうので、修正しないといけない。

 

今回勉強したこと:

 sudo apt-get autoremove :使わない方がよさそう。

 sudo apt-get --purge remove [アプリ名] :

予想外にたくさんのアプリに影響する。

 

そういえば、以前 Python 2.7 をアンインストールしたときに、パソコンが起動しなくなったことを思い出しました。

 

Python3 モジュールのインポート, パスを通す

 

前書き

ディープラーニングで欠かせない「モジュールのインポート」

 

import tensorflow as tf 

 

import numpy as np

import chainer

import chainer.functions as F

import chainer.links as L

from chainer import Variable,optimizers,Chain 

 

みたいなやつ。

分からなかったので勉強した。

 

 

モジュールとは

ざっくり言うと

関数やクラスを含んでいる「.py」ファイル 

 

または、

 

関数やクラスを含んだ「.py」ファイルのある、ディレクトリー

のこと

 

モジュールのインポートとは

 

ざっくり言うと

インポート元に含まれる、

  関数

  クラス

を取り込んで、使えるようにする

 こと。

 

試してみる。

すべてのクラスと関数をインポートする。

import chainer

のような

関数を呼び出す際、

chainer.(関数の名前)

のように、前に「モジュール名.」をくっつける。

 

別名によるインポート

import tensorflow as tf

のような。

 

関数を呼び出す際、

tf.(関数の名前)

で良い。

 

tensorflow.(関数の名前)

と長く書く必要がなく、タイピングの手間が省ける。

ただし、自分でオリジナルの省略形を使い始めてしまうと、収拾がつかなくなる(再利用しにくくなる)。広く使われている省略形のみにとどめるのが無難。

 

一部の関数やクラスだけをインポートする

from chainer import Variable,optimizers,Chain

のようなの。

 

この方法だと、それぞれの関数の前に

chainer.

をつけなくても Variable, optimizers, Chain 

が使えるようになるので、コードが書きやすくなる。

 

クラス/関数の名前の衝突(同じ名前を使ってしまったため、一部のクラス・関数が使えなくなる)に気をつける必要がある。

 

パッケージを使う

from chainer import Variable,optimizers,Chain

みたいな。

(このコードは、一部のクラス・関数のインポートであり、かつパッケージの利用でもある?)

 

実際には

chainer

 

フォルダーの下に、

Variable.py

optimizers.py

Chain.py

__init__.py

などが位置する 形、らしい。間違ってたらすみません。勉強中でして。

 

パッケージを利用する際には、

__init__.py

ファイルが必要とのこと(中身は空で良い)。

 

optimizers.setup()

optimizersMomentumSGD()

みたいに、ドットをつけて関数・クラスを引用する。

 

なぜパッケージを使うのか

複数のモジュールで、名前の衝突を防ぐことができる。

たとえば 2つのモジュール内に同じ関数が含まれていたとしても、関数の前にモジュールの名前がつくので(optimizers.setup()のように)、別の関数として認識できる。

 

 

モジュール検索パス

import sys

for _path_ in sys.path: 

    print(_path_)

 

モジュールを検索してくる場所が表示される。

よくある

パスを通す

っていうやつ。

sys.path

をエディターとかで書き直すと、変更できるらしい。

 

一番最初に「空の行」がでるのは、('.') すなわち current directory を示している。

 

一番最初に「ビルトインモジュール」を探すらしい。

見つからなかった場合、上からディレクトリーを検索して .py ファイル(やフォルダー)を探していき、もしモジュール(.py ファイルや、フォルダー)が見つかった場合、以降の ディレクトリは検索されない。

例えば、カレントディレクトリに「tensorflow」というモジュールを、自分で作って置いて置くとする。そこで tensorflow をインポートすると、自分の作った「tensorflow」モジュールがインポートされ、本来の tensorflow はインポートされない。

モジュールの名付けに注意が必要。

 

シンボリックリンクを含むディレクトリはモジュール検索パスに追加されない。

らしいので注意。

 

モジュールのある場所

モジュール置き場は自分で決めておけば良いと思うのだけど、

Anaconda on Windows の場合、

C:\Users\[User name]\Anaconda3\Lib\site-pakages\

に入っているみたい。

 

Ubuntu14.04 では 仮想環境を使っていて。

~\anaconda3\envs\py27\lib\python2.7\site-packages\
~\anaconda3\envs\py35\lib\python3.5\site-packages\
~\anaconda3\envs\py36\lib\python3.6\site-packages\

に入っていた。

 

 

ソース

 6. モジュール (module) — Python 3.6.1 ドキュメント

 初心者が悩む

if __name__ = "__main__":

 についても書いてある。

 

TensorFlow tutorial をちょこちょこ modify する。

Under construction です。

 

 

 

チュートリアルのダウンロード

git をインストール

sudo apt-get install git

git を使って、チュートリアルをクローン(画像認識系のみ)

git clone https://github.com/tensorflow/models/tutorials/image

カレントディレクトリに、「image」ディレクトリが作成され、その中にチュートリアルが入る。

 

せっかくなので、チュートリアルだけでなく、モデル一般も一気にダウンロードしたいところ。

git clone https://github.com/tensorflow/models/

カレントディレクトリに、「models」ディレクトリが作成される。チュートリアルは、models/tutorials/image 内に入る。

 

 

Modify

VRAM使用量の制限

下記コードを適当なところ(多分 import より下、ほんちゃんの Session よりも前。一番下に入れると、メモリー全部確保されてしまった!)に入れておく。

config = tf.ConfigProto(
gpu_options=tf.GPUOptions(
per_process_gpu_memory_fraction=0.5 # 最大値の50%まで
)
)
sess = sess = tf.Session(config=config)

 引用元

qiita.com

ソース

Using GPUs  |  TensorFlow

 

CPUonly で eval.py を実行する。

TensorFlow の CIFAR-10 のチュートリアルでは、training でも evaluation でも GPU を使用する。このため、GPU のメモリーがいっぱいだと、cifar10_eval.py が走らない。

このため、cifar10_eval.py は cpu only で実行したい。cpu only なら VRAM (GPU のメモリー) の使用量にかかわらず、走ってくれる。

qiita.com

CUDA_VISIBLE_DEVICE=-1 python cifar10_eval.py

# CUDA_VISIBLE_DEVICE=-1 とすると、GPU を使わずにコードを実行してくれる。その後に、普通に "python cifar10_eval.py" と続ければOK

参考

 

 

Python3 で ファイル・フォルダー名を列挙する。

環境は Win10, Python 3.5.2

 

普通に表示する。

import os

os.listdir('.')

 

# 最近の python 3.6 なら、

# 明示的に os.listdir('.')

# と書かなくて

# os.listdir()

# で OK !

 

これだと

'.bashrc.swp', '.swp', 'Anaconda3', 'AppData', 'Application Data', 'Contacts', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'Dropbox', 'Evernote', 'Favorites', 'Links', 'Local Settings', 'MNIST_data', 'Music', 'My Documents', 'OneDrive', 'Pictures', 'Recent', 'Roaming', 'Saved Games', 'Searches', 'SendTo', 'Start Menu', 'Videos'

 

のように、横に並んでしまう。

 

面倒ですが

files = os.listdir('.')

for x in files:

    print(x)

のようにすると、

.

.bashrc.swp

.swp

Anaconda3

AppData

pplication Data

Contacts

 

のように改行してくれる。

file か dir かも表記するには(bash における ls -p)

file = os.listdir('.')

for x in files:

    if os.path.isdir(x):

        print('dir:', x)

    else:

        print('file:', x)

 

file: .bashrc.swp

file: .swp

dir: Anaconda3

dir: AppData

dir: pplication Data

dir: Contacts

 

参考:

maku77.github.io

 

 

 

 

ついでに・・・


システムコマンド

$ Bash

>>> Python3

 

 

$ pwd

>>>import os
>>>os.path.abspath('.')

 

 

$ cd, ls

>>>import os
>>>os.chdir('Dropbox')
>>>os.listdir('.')

 

 

$ ls

>>>import os
>>>os.listdir('/Dropbox')

 

 

$ mv (move)

?

 

 

$ mv (rename)

>>>import os
>>>os.rename('foo.txt', 'bar.txt')

 

 

$ cp

>>>import shutil
>>>shutil.copy('foo.txt', 'bar.txt')

 

 

$ rm

>>>import os
>>>os.remove('foo.txt')

 

 

$ mkdir

>>>import os
>>>os.mkdir('folder')

 

 

$ rmdir

>>>import os
>>>os.rmdir('folder')

ディープラーニング向けパソコン自作(マザーボード編)

当ブログは(現状)アフィなしです。よろしくお願いします。

 

ディープラーニング向け自作には、いくつか押さえるべきポイントがあろうかと。

 

 マザーボードmini-ITXATX が良くて、 

 結論から言えば、

 

将来追加投資する気があるなら

 ATX:SLI対応 Z270マザーボード

  20万円コース!! (将来の投資10-15万円を想定)

 

追加投資はしたくないなら
 mini-ITXチップセット何でも良いがwifi付き

  ざっくり 10万円コース

 

(お大尽されるのでしたら、X99チップセットで 4-way SLI 対応のマザーボード!!)

   どーんと30万円コース!!

 

  マザーボードは、例えば ASRock の SuperCarrier !!

pc.watch.impress.co.jp

 

 で、まずマザーボードを決めるわけです。

 上に結論書いてるけど、ここからめっちゃ長い。

 

 マザーボードの大きさにはいろいろあるので、まずそれを決めないと先に進めない。マザーボードのサイズには、他にも micro-ATX とか extended-ATX とかる。

マザーボード - Wikipedia

 

 マザーボードの大きさが小さい方から

 

 mini-ITX < micro-ATX < ATX < extended-ATX

 

 DL 向け自作なら mITX か ATX のどっちかになると思われ。

(mATXも良いとは思うけど問題もあり)

 

 ポイントは、グラボを2枚以上挿したいかどうか。

 あと、パソコンのサイズ。

 

 

 パーツ的には

mini-ITX: RAM上限 32GB, グラボ最大1枚差し

micro-ATX: RAM上限 64GB, グラボ最大2枚差し

ATX: RAM上限128GB, グラボ最大4枚差し*1

extended-ATX: RAM上限128GB?, グラボ最大4枚差し

 

 ただしこれらは理論上。

 上記よりも限界が低い製品も多い。

 

 例えば私が購入した、ASUS TUF Z270 マザーボードATXサイズですが、RAMの上限は64GB、グラボ最大2枚差しです。

 

 

 DL の学習速度を決めるのは、グラボの性能。当然2枚以上挿した方が性能は良くなる(いろいろ制限あり)。しかし、グラボは高いし、実際に2枚(以上)挿すか分からない。

 ATX はグラボを2枚(以上)させる訳なので、拡張性は ATX のがいい。mITXは1枚しかさせないけど、なにしろパソコンをコンパクトに作れるのでありがたい。

 

 で、さておき迷ったら、ちっさい ITX 買うのが良いです。なにしろ「小さい」と「安い」は正義です。将来ATXに移行したくなったら買い換えないと行けないですが、マザボとケースは買い換えて3万円くらいでしょうか?

 確かに3万円は高いですが、グラボ2枚差し仕様と思ったら10万円とか飛んでいったりするので、それと比べれば安い。まぁ比べないか。

 

 で、パソコンのサイズ。Amazonなんかで「ITX ケース」 「ATX ケース」などで検索すると、いろいろ出てくる、出てくる。

 

 で、自分としてどのくらいの大きさを許容できるかが問題なわけです。

 

 また、パソコンのサイズと関係してくるのが「形」。

 パソコンの形にもいろいろあるんですが、

 

 

  キューブとか

kakaku.com

 

 

  タワーとか。

kakaku.com

 

 

 

 初心者はタワーが良いです。キューブ型は高さと奥行きは小さくても、厚みがあって圧迫感が出るし。中には制作・パーツ交換がめんどいのもある。あ、上で提示したキューブは、おしゃれで、パーツ交換も楽なやつです。念のため。

 タワーは部品へのアクセス良好で、幅も狭いので圧迫感も少ない。

 

 ぶっちゃけ上級者もタワーが良いんではと思いますが。まぁいいや。

 

 mITXのタワーというと

kakaku.com

 こんなの。

 これは結構評価高いみたいです。

 

 ケースいくつか買ってみて分かったのは、「安いのは塗装が悪い、板もまっすぐしてなくてねじれてる」と言うこと。ま、ケースとしては使えますけど。

 高いケースと安いケース比べて(と言っても10000円のケースと、4000円のケースの違いですが)、高いがしっかりしてました。実際組んでみて。

 4000円のはゆがんでるし、塗装はげるし。

 

 まぁ高い方が良いものですよね。

 じゃないと

 

kakaku.com

 こんな ITX のくせに3万円近くするケースが売れるわけない(これかっこいい!!欲しい!!! けど買えない。かっこいいなぁ)。

 

 まぁいいや。

 

 とにかく、mITXか、ATXか決めて、ケースを買う。

 

 micro-ATX をオススメしないのは、なぜか、ですが。

 「mITXに勝る利点が少なく、ケースサイズは結局ATXと同じくらいになる」からです。

 micro-ATX を買うなら、より拡張性に優れている(場合が多い)ATXのを買った方が良い。

 

 micro-ATX が mITX に勝っているのは、

  1.メモリーの最大搭載量が64GB(mITXは32GB)

  2.グラボ2枚差しが可能

 と言う点です。多分多くの場合は メモリー32GBで足りるでしょうから、メモリーはメリットが少ない印象。グラボ2枚差しはメリットなのですが、これがトラップでして、「マザーボードは2枚差しできるのが多いのに」「グラボ2枚差しに対応していないmATXケースが多い」からです。

 

 例えばおされなこのケース、私購入して、そして返品したんですけど(手数料自腹で払って)

kakaku.com

 良いケースなんです。質感も良いし。デザインも凝ってる。おしゃれ。

 しかし、背面の拡張スロットが4つしかありません。

 体積32760cm3

 

 一般にグラボはスロット2つ消費します。4つあれば、グラボ2枚分の4スロット? 十分? と思いきや。

 グラボ2枚差しに対応しているマザーボードを見てみると、大体、グラボ2枚の間に1スロット開けているデザインが多い。

 

 例えばこのボード

ASTRIX Z270 GAMING

 

 間に1スロットあるので、拡張スロットが5つないと、グラボ2枚差しできないです。で、拡張スロット5つとなると、PCケースもでかくなる。

 

kakaku.com

 

 例えばこれは、拡張スロットが5つある、 microATX 対応のケースです。拡張性が高く、水冷や簡易水冷、大きなCPUクーラーもつけられ、6面のうち2面がクリアなデザイン。デザイン性も良いです。

 HDD/SSD搭載数も多いしすばらしい。このケースの良いところは、上下左右につなげて、2つのケースを1つのケースみたいに設置できること、みたいです。たとえばしっかり水冷を組む場合、2つのケースに1つの水冷ユニットを組んで、それでCPU/GPUを全部冷やしちゃうとか、できそうです。

 電源を大きいの1つで、2台を同時に動かすとかもね。

 

 ただ、サイズ的には結構でかい。ケース1個で幅が32cmもあります。体積は 45500cm3。

 さっき例に挙げた、ATXのタワー型ですと、42500cm3

kakaku.com

 

 まぁ、このケースはタワー型の中でも、5インチベイをなくすことで小型化したモデルなので、小さめなのですけどね。

 でも、micro-ATX よりも大きな ATX ケースの方が、体積が小さいという、逆転現象になっています。

 

 5インチベイがあるケースですと

kakaku.com

 50300cm3。

 これだと、先ほどの micro-ATX ケースよりも大きいです。

 

 さておきさておき。

 

 ATX ケースでもタワー型は幅が狭くて取り回しが良く、圧迫感は少ないです。ケースを選べば体積の小さなものもありますしね。

 しかし、その小さなケースでも、拡張スロットは7本あります。組み合わせるマザーボードにもよりますが、マザーボードによってはグラボ3枚差しまで可能です。 ケースサイズはほぼ同じでも、拡張性は高いわけです。

 

 いずれにせよ、microATX はなかなか中途半端となってしまいます。

 mini ITX でしたら、先ほど上げたのが

kakaku.com

 

 34000cm3 ですし、もっと小さなケース

 

 

kakaku.com

 11500cm3 もあります。

 これなんかちっさくて、さっきの ATX ケースの1/4以下です!

 とはいえ、このちっさいケースですと、パーツ交換が大変・内部で電源ケーブルできつきつになってしまって、冷却も悪いはず。

 

 やはりタワー型か、せめて

kakaku.com

 

 18600cm3 一回り大きいやつ、こちらは風の通りは、上のよりは良いはず。しかし、Volumeも2倍くらいになってますけどね・・・

 

 

 

 で、マザーボード

 

 mITX 買うなら、wifi 付きが良いです! ケーブルと比べたら遅いけど、なんせ便利だから。大体デスクトップパソコン使おうとすると、ケーブルだらけでぐるぐるになってしまいます。一本でも少ない方が楽!

 

 で、ATXのボードを買うなら、「SLI」対応のがオススメ。SLIはグラボ2枚(以上)を同期させて、速度を2倍近く(以上)に引き上げるやつです。 2枚挿すのを 2-way SLIとか呼びます。

 SLIしなくても、グラフィックメモリーが増えるという利点はあり、SLIしなくても良いのですが。しかしせっかく2枚挿すなら SLI した方が。

 

 さて、タワー型のケースを買うにはいろいろ考える必要あります。ケース、いろいろありますからね。

 個人的には「静音型」のケースがオススメです、っていうか、「静音型」にすれば良かった、と後悔しています。意外とファンの音がうるさかったので。

 (これについては後で、CPUクーラーについて書きたいと)

 

 静音型とは、例えばさっき上げた

kakaku.com

 

 こういうのは、開口部が狭く・少なくなっている他、ケース内部に凹凸をつけて、音を吸収するようになっているそうです。

 

 あと、PCケースで恐ろしいのがムシ、特にG様の侵入。

 

 こういう記事もありました。

gigazine.net

 

 虫が侵入すると何より不潔だし、ショートなどで故障の心配もありますので。

 これを防ぐにはどうするのか分かりませんが、周囲にホウ酸団子とか置いとくとか、ですかね?

 

 あと、G様は明るい場所がお苦手でいらっしゃるので、クリアパネル式の

kakaku.com

 (これは先ほど上げた、やや小さめのATXタワー)

 

 なんかも良いかもしれません。

 

 話が前後しますが、マザーボードには「チップセット」とか言う、パソコンの部品が組み込まれてまして。これは、あまり悩む必要なく、

 

 「SLIするならZ270、しないならなんでもいい」

 

 なので基本的には、

 

 ATX:SLI対応の Z270 のマザーボード

 mini-ITXチップセットは何でも良いけど、wifi付き

 

 のが良いと思います。私は。

 

 高性能を目指すなら、ATXかeATXのボードで、X99チップセット、4-way SLI 対応のものになるのですが、グラボ(1080ti)4枚も買ったら、それだけで40万円ですしね。グラボ買うとしても、一般人は2枚まででしょう。

 ということで、ATX の 2-way SLI で良かろうと、思います(micro ATX でも良いんですけど、ケースがね・・・自分が良いと思うのがなかったので。ATX で良いんじゃないかと思います)。

 

 

 

 で、オススメはしないけど「面白い」のとして、NUC + 外付けGPUと言うのもアリ。

 

 NUCいうのはこういうやつです。

kakaku.com

 

 ざっくり言うと、めちゃ小さいパソコン。中にグラボが入らないので、グラボは Thunderbolt 3 で外付け。

 外付けグラボはまだ一般的ではないので、ケースだけでもめっちゃ高いんですけど

AKiTiO Node | Thunderbolt™ 3 eGXF expansion chassis for eGPUs | AKiTiO

 

 こういうのがあります。

 

 まぁ値段的にはメリットはないけど、とにかくコンパクトに作れる、と言うことだけメリットですかね。なんなら持ち運ぶ気にもなる。

 さすがにタワー型デスクトップとか持ち運ぶ気にはならない、SFFでも厳しい。でもNUCならアリかも。

 

 ないか。

 

 ないね。

 

 

 今後、Thunderbolt 3 付きのノートパソコン買って、買い換えの時が来たら、外付けグラボをくっつけて DL 用マシンにしても良いですが。

 その頃には事態も変わって、グラボでDLしてないかもしれないし。FPGAだっけ? Tensor Processing Unit だっけ? なんかそう言うのでやってるかもしれませんしね。

*1:チップセットの制限で、RAM上限64GBの商品も多いので注意。

日記 いろいろ一段落

 と言うわけで どういうわけか ブログしばらく非公開にしていましたが、気が向いて再び公開設定にしました。

 

 この間に DL用 コンピューターが届き、セットアップ。いろいろ気になったので部品交換をしたりして、思った以上にコストがかかってしまいました。

 いろいろパーツを組み替えて、

  i3-7100, 1070

  i3-7100, 1080ti

  i5-7600K, 1070

  i5-7600K, 1080ti

 で CNN-MNIST を試してみましたので、近いうちにデータをまとめます。

 

 結論から言えば、言われているとおり

  GPU が重要

  CPU は速度に影響なし

 でした。

 

 この速度は、値段におおむね比例する結果でしたが、消費電力(1070:150W、1080ti:250W)考えたら、1080tiの方が効率良いですね。1080ti の方が 2倍以上早かったので。

 1080ti は Founders なので、なんというか「poor fan」モデルです。CNN を学習させると、80度くらいまで温度上がってしまいます。しかしケース内に排熱しないのは良い点です。ケース外に排熱しますので、ケース内に熱がこもりません。消費電力はおおむね 180-250W あたりをうろうろするので、熱のために頭打ちにはならず、性能は出てるんだろうと思いますが。こんなで高温で、何日も動かして大丈夫か不安です。

 一方で、廃熱のために「わざと」高熱にしてるのかもしれずよく分かりません。

 熱を放出するには、当然、周囲との温度差が大きい方が、一定時間に大量に熱を捨てることができますから。「高熱で壊れるか心配」と書きましたが、「通常利用で壊れるようなものを売らないよね」とも考えられます。

 

 1070 はオリファンのヒートパイプモデルで、60度台までしか上がりません。「ヒートパイプってすごいなー」と思います(小学生並みの感想)。しかし廃熱はケース内なので、廃熱が良いケースでないとケース全体が熱を持ってしまいます。ま、べつにいいっちゃ良いんですけど。

 1080ti は 2台目を買おうと思いますが、ケースがかっこいい Founders にするか、冷却が効率的なオリファンにするかで悩んでおります。

 

 アメリカ Amazon をよく見ます・・・パソコン部品は日本より多いし、何より安いので。

 

 1080tiの値段は目間ぐるしく動きますね。

 アメリカでは、ゲーミング系の部品メーカーではEVGAが一番人気。ASUSが二番、MSIが三番人気のようで、同じ Founders の 1080ti でも、EVGAが最も上段に来ています。EVGAが最上段というのは、オリファンモデルが最も早くに出た こともあると思いますが(Amazon.com内で、オリファンモデルを一番最初に発売したのはEVGA:私の観測範囲内ですが。また、オリファンと Founders をひとまとめにしているのもうまい売り方です。Founders とオリファンモデルの売り上げが加算されて順位が上がり、順位が高いからこそよく売れる好循環という印象)。

 Foundersの値段は699ドルで横並びですが、面白いのはEVGAでオリファンモデルが出てきた当初、オリファンの方がFoundersより安い時期が一瞬ありました。EVGAのSC2という、銀色の2枚fanモデルです。今から思えば、これは「買い」でしたね。

 また、ZOTACと言うメーカーのFoundersは、なんと679ドル! 他はみんな699ドルなのに、一歩安くなっています! Amazonアルゴリズムで価格を自動操作していると言われますが、Zotacのはよっぽど売れていないのでしょうか・・・

 一番上の EVGA は、先日まで Founders が 699 ドルでしたが、今では700ドル超えています。人気が上がってきたのかな。

 なかなか興味が尽きません。

 

 アメリカ Amazon にはいろいろ面白い製品が売っています。例えば、GPU 用の後付けの ヒートパイプ付きオリファン(ARCTIC Accelero Xtreme III)。6000円程度。

 (日本の Amazonではめっちゃ高かったと思います。覚えてないですが)

 

 GPU の各社のモデル、ネット記事によると「オリジナルファン」「オリファン」とか言うのですよね。てっきり「fan」が重要なのだと思っていましたが。ファンも大事ですが、むしろ、ヒートパイプを用いたクーラー部分が冷却には重要みたいですね。上述の Arctic Accelero Xtreme III は後付けの  GPU クーラーで、ヒートパイプを使っています。

 各社の GPU オリファンモデルも、皆ヒートパイプを使っていますもんね。

 

 「GPUなんて2-3年持てば良い」と言って founders を買うのも良いと思うし、「冷えた方が性能が出るはず」と言ってオリファンを買うのもアリだし、悩ましいものです。

 簡易水冷モデル、あるいは本格水冷でも良いのですが、「複雑になるほど故障するパーツが増える」と思っているので、2の足を踏んでいます。水冷のモデルって、高くて重いですしね!

 

 さて、1ヶ月ほど前は「1080tiが出そう!!」だったか、「1080tiが出たけど買えない!!」的な状況でした。2週間ほど前は「1008ti Founders 売ってるけど高すぎる!! オリファン出てない!!」状況だったのが、最近はオリファンモデルも各社出そろい、水冷キットも出てきましたね。

 

 こうなると機能が乏しく感じられる TITAN X に対して、NVIDIA は TITAN Xp という、より強化したモデルを発表してきました。また、ローエンドとして GTX 1030 がもうすぐ発表されるとかいう噂もあります。

 TITAN Xp は性能的には魅力ですが、コスパ的には、自分的には「ない」ですね。多分、TITAN X (Pascal) よりお高いのでしょうから、15-20万円ほどでしょうか? それなら 1080ti 2本買って、SLI した方が性能が出るでしょうし。

 

 来月にサンフランシスコかどこかで開かれるイベントで、Nvidia の次期アーキテクチャ、Volta (GeForce GTX 20x シリーズと噂される)が発表されるそうです。行ってみたいけど、参加費(講演など聴けるようにすると)だけで10万円超え。

 残念ですが、行けないですね。ITmedia とかの、ネット記事待ちです。

 

 こういう値段を見ると「日本ってヤバいな」と思うのですが。だって日本のカンファレンスって、3-4日のものでも参加費1-2万円とかざらですからね。欧米では、1週間のカンファレンスなら普通10万くらい行きますよね。

 10万円のカンファレンスに行ったからって、知識が急につくとは思いませんが。でもそういうところで得られる最新情報に普段から触れているか・触れていないかって、大きいと思いますよ。