tensorflowで学習の中断・再開

今回は「学習の中断・再開」です。学習データの保存と読込を行います。
tensorflow自体の導入方法は前回をご覧ください。

前回に引き続きmnistを使います。

基本的な機能だけの紹介になりますので、
詳細は公式リファレンスをご覧下さい。

mnistのこの部分を変更します。

中断・再開機能を追加するとこうなります。

作成されるファイルは以下になります。
my-model-xxx:xxxにはステップ数が入ります。
checkpoint:作成したモデルのファイル名が保存されています。checkpoint自体の名前を変更することもできますが、今回はデフォルトで行きます。

では、コードを順に見て行きましょう。

Saverクラスを作成します。max_to_keepは中断ファイルの作成数です。デフォルトは5で、古いものから削除されます。
学習の推移を見たい場合は、この数値を増やすよりステップ数の間隔を広げたほうが良いと思います。(そもそもtensorboard使ったほうがいい気も済ますが)

モデルの有無で分岐させます。

最後に保存されたモデルファイルを呼び出します。

checkpointファイルがない場合。

以上です。
実際はmodel、checkpoint用のディレクトリを作成した方がよいでしょう。
また、checkpointは作成されているけどmodelファイルがない、等の場合はエラーになりますがその辺りは割愛しています。

tensorflowのmnistの推論を詳しく見る

機械学習のhello worldたるmnist。
ただこれを動かしても
「0.9092」
などと言われるだけで「お、おう」という感想しかでませんでした。
もうちょっと視覚的に面白味を持たせてみようというのが今回の内容です。

具体的には
「学習後、データ個々に対する予想」
「学習データの保存と呼び出し」
の2つの機能を付け足して見ました。

mnist自体は色々なところで紹介されていますので省略します。
元になるコードは
こちらを使用します。
日本語の解説はこちらがオススメです。

まず「学習後データ個々に対する予想」からいきます。
以下の場所に

このコードを追加します。
test_index は0〜55000の間の任意の数値です。

表示はこんな感じと思います。

情報の詳細です。
・10個のリストは、個々の数値に対する予想です。指数表記で、1に近いほど自信があるということです。例では9.38659430e-01が最も大きく、約0.9386です。0から始まるので、これは「2」を予想していることになります。
・prediction、予想の意味です。上記をわかりやすく出力しました。argmaxで算出、学習により予想した数値そのものです。「2」ですね。
・answer、正解のラベルです。
・number image(gray_scale) は数値による画像データです。数値が1に近いほど白いドット、0に近いと黒いドットです。かなり見づらいので、邪魔な場合はコメントアウトか削除して下さい。
・test_indexが0だと「7」を予想し、test_indexが1だと「2」と予想したと思います。マイナスを指定すると後ろからのインデックスになります。

次回は「学習データの保存と呼び出し

python備忘録

言語名の由来は蛇ではなくモンティ・パイソン(テレビ番組)

文の終わりのセミコロンは不要

コメントは行頭に #

複数行は
”’
シングルコーテーション
3つで囲む
”’

インデントが{}の変わりになる
if true :
print(‘ifの中’)
print(‘ifの外’)

help()
ヘルプの起動

シグナルを送信する:キー入力等で命令を送ること
ctrl+c 終了
ctrl+z バックグラウンドに送る
psやfg等を使って戻る

関数
all(iterable)
全てtrueならtrue。and()と同じ。

any(iterable)
いずれかtrueならtrue。or()と同じ

bin(int)
整数を渡して2進数を返す

dict(object)
辞書型データの作成

map(int,[1,2])
[1,2]
第一引数は関数を指定
リスト(配列)等の第二引数を渡すと、すべての要素に対して第一引数の処理をしてくれる。foreachみたいな感じ。

oct(int)
整数を受け取って8進数を返す

open(filename[, mode=”r” [, bufsize]])
ファイルの読み込み
modeは読み込みが”r”、書き込みが”w”

reversed(seq)
要素を逆順に取り出すイテレータ (reverse iterator) を返します。 seq は __reversed__() メソッドを持つか、シーケンス型プロトコル (__len__() メソッド、および、 0 以上の整数を引数とする __getitem__() メソッド) をサポートするオブジェクトでなければなりません。

デバッグ用
repr(object)
str(object)
print(any)
pprint(any) オススメ!

tuple([iterable])
タプルの作成
tuple(‘abc’) は (‘a’, ‘b’, ‘c’) を返し、 tuple([1, 2, 3]) は (1, 2, 3) を返します。

定数
None
Nullのこと。noneではない
bool(None)
falseが返る

false
数値では0や0.0、Noneもfalseになる。

演算子
+ 文字列結合
a ** b aのb乗

ブール演算子
x or y
x and y
not x
!bool エクスクラメーションマークで真理値反転は使えない。比較演算子ではイコールと組み合わせて使える
|や&はビット演算になるので基本使わない

比較
<, <=, >, >=, == 等、いつもの
!= 等しくない
is 同一のオブジェクト
is not 同一のオブジェクトでない

数値
複素数型
complex、多分そうそう使わない

イテレータ型
container.__iter__()
iterator.__iter__()
どちらもイテレータを返す?

iterator.next()
コンテナ内の次の要素を返します。

シーケンス型
str unicode list tuple bytearray buffer xrange

リストは [a, b, c] のように要素をコンマで区切り角括弧で囲って生成します。
タプルは a, b, c のようにコンマ演算子で区切って生成します (角括弧の中には入れません)丸括弧で囲っても囲わなくてもかまいませんが、空のタプルは ()のよううに丸括弧で囲わなければなりません。要素が一つのタプルでは、例えば (d,) のように、要素の後ろにコンマをつけなければなりません。

辞書型
dict(one=1, two=2)
dict({‘one’: 1, ‘two’: 2})
dict(zip((‘one’, ‘two’), (1, 2)))
dict([[‘two’, 2], [‘one’, 1]])
以上は全て
{“one”: 1, “two”: 2}
が返る

文字列型について
string.replace(str, old, new[, maxreplace])(原文)
s 内の部分文字列 old を全て new に置換したものを返します。 maxreplace を指定した場合、最初に見つかった maxreplace 個分だけ置換します。

文字列置換
a = string.replace(“abc”, “a”, “”)
“bc”

datetime型
日付や時刻

collections
コンテナ型
collections.Counterはカウント系の作業で便利

正規表現re
import re
prog = re.compile(pattern)
result = prog.match(string)
progを使い回す

findall() はパターンにマッチする全てにマッチ
search() は最初の一個だけ

比較
diff
+とか-とかで差分表示
import difflib as dl
diff = dl.ndiff([“one”,”two”,”three”],[“ore”,”tree”,”emu”])
print ” “.join(diff)

math
数学関数
複素数は扱えない
cmath
複素数関数

ランダム色々
http://docs.python.jp/2/library/random.html

パス
import os
#カレントフォルダを取得
a = os.getcwd()
#ファイル名のみ取得
print(os.path.basename(path))

switch-case文は存在しません。

ifでtrueの時に記述なしはエラーになるので、passと書く
if value_1 == “Python”:
pass
elif value_1 == “python” and value_2 == “izm”:
print unicode(“2番目の条件式がTrue”)
elif value_1 == “IZM” or value_2 == “PYTHON”:
print unicode(“3番目の条件式がTrue”)

foreachはこう
for value in for_sample:
print value

range()でfor nextのように
for num in range(100):
print num
if num == 10:
break

# 複数行のコメントアウト例
”’か”””になる
”’
print “test 3”
print “test 4″
”’

import

from ファイル名 import クラス名など。*で全て
ファイルは同じフォルダに置くか、パスを通しておく
どちらでもない場合は、その場でパスを通す
import sys
sys.path.append(‘/path/to/dir’)

#import本体
#testmod.py
class testclass:
def __init__(self):
print “create testclass”
def testmethod(self,str):
print “call testmethod”
print str
#main.py
if __name__ == “__main__”:
import testmod
testclass1 = testmod.testclass()
testclass1.testmethod(“1”)

from testmod import testclass
testclass2 = testclass()
testclass2.testmethod(“2”)

linux(ubuntu)導入について備忘録

linuxのディストリビューション
ubuntu14.04の日本語版
安定版で多くのソフトがこのバージョンで動作している為

ショートカットの整理
office、amazonを削除

自動ロックを解除する
setting(歯車アイコン) brightness&lock

設定 ランゲージサポート
日本を上にする

設定 テキスト入力
左下の「+」マークで追加可能。mozcを選択
左下の「メニューバーに現在の入力ソースを表示」

pipインストール
ターミナル起動
curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python

左上アイコンからテキストエディタ起動

ターミナルとテキストエディタをショートカットに登録しておくと便利

chainer
事前に
libhdf5-serial-dev
h5utils
h5py
の順でインストール

覚えておきたいキーボードショートカット
結構windowsと同じものが多い。alt+F4など
ctrl+alt+T ターミナル起動。死ぬほど使う
ctrl+H 隠しファイルの表示/非表示切り替え
ctrl+W タブやウィンドウを閉じる。

イラストレーターのjavascriptマクロの注意点

山程ありますが、その内の一例をご紹介します。

activeDocument.layersで取得できるレイヤーは最上位のレイヤーだけ

サブレイヤーはactiveDocument.layersで取得できません。全てを取得したい場合は再帰処理でlayersのlayersの…と見ていくしか無さそうです。
一番上のレイヤーのサブレイヤーはこんな感じで取得できます。
app.activeDocument.layers[0].layers[0].name

テキストはテキストフレーム

activeDocument.textFramesで全てのテキストを配列で取得できます。Fが大文字になります。
(レイヤーもこれで取得できれば楽なんですが、いい方法はないでしょうか…)
contentsプロパティで内容を取得、変更できます。
alert(activeDocument.textFrames[0].contents); //文字列が表示されます。
activeDocument.textFrames[0].contents = “abcde”; //文字列を”abcde”にします。

可視状態やロックの取得、設定

レイヤーはvisibleプロパティで設定します。
また、親の表示/非表示には影響されません。
activeDocument.layers[0].visible; //trueかfalseが返ります。
activeDocument.layers[0].visible = true; //代入すれば設定できます。

テキストフレームの可視状態ははhiddenで設定します。visibleプロパティでは設定できません。
activeDocument.textFrames[0].hidden = false; //visibleとは逆で、falseで見られるようになります。

ロックはlockedで設定します。trueでロック、falseで解除です。
可視状態でなければロックの設定も解除もできません。親が非表示となっている場合も操作できません。
ロックしていてもjavascriptでオブジェクトの操作は可能です。

activeDocument.textFrames[0].locked = false;
activeDocument.textFrames[0].contents = “abcde”;

テキストフレーム・レイヤーをすべて表示させる場合、カッコ悪いですが以下のようにしています。

エラー処理

必ずしておいたほうがいいです。
ただエラーメッセージはかなりアバウトです。親レイヤーに原因がある場合も多々あります。しっかり確認しましょう。
メッセージは英文で返ってきますが、そんなに難しくはありません。
大体この2パターンです。
modified:変更できない(ロックか可視状態が原因)
outofboundsは配列のインデックスが最大値を超えているか下回っています。

イラストレーターのjavascriptマクロでテキストを全てアウトライン化

createOutline()を使います。
元々のテキストは消えるので、必要な場合はコピーなどをとっておきましょう。
また、色々なエラーが考えられるのでそこは実装せずに手作業にしています。

イラストレーターのjavascriptマクロのサンプル

最上位レイヤーを削除する場合はこのような感じです。
deleteitemsに任意のレイヤー名を追加して下さい。

注意点
forで回す場合は、レイヤーインデックスの最大から初めて、ループ変数はデクリメントにする。
削除した場合にインデックスがずれるため。
また、インデックスが最大の時に削除する場合、breakで抜けておかないとエラーになる。

イラストレーターでjavascriptを使う時のデバッグ方法など

まず、イラストレーターを開いて下さい。
既存のファイルを開くか、ctrl+Nで新規作成します。

で、jsファイルを任意の場所に作成します。デスクトップで良いでしょう。名前はtest.jsとでもしましょう。
test.jsの内容は

とします。コンソールに1を出力するという内容です。

こうすれば、デバッガが自動的に立ち上がり、コンソールに1を出力します。
ちなみにデバッガの名前は「ExtendScript Toolkit」です。単体で立ち上げる事もできますが、
こちらのほうが早いでしょう。

ちなみにこの時点ではまだ、jsファイルともイラストレーターとも連携していませんので注意して下さい。
まず、立ち上がったデバッガからjsファイルを開きます。

1

そして、イラストレーターと連携させます。
左上のコンボボックスでイラストレーターを選択、その左の鎖が緑色になっていれば成功しています。

2

念のためコンソールに「app」と入力しエンターを押すと
結果 : [Application Adobe Illustrator]
と返ってきます。
もし、
結果 : [object Application]
と返ってきた場合は設定が完了していない可能性があります。

これでデバッガの準備完了です。

ブレークポイントは緑の四角のところをクリックして下さい。
一度クリックでブレークポイント有効化、
もう一度クリックで無効化、
もう一度クリックすると削除されます。
F9でも変更できます。
青い四角のところをクリックすると行を指定してジャンプになります。ちょっと狭いですね。

3

後はF5で再生、shift+F5で強制終了、ステップインはF11です。

URLバーのURLを変更する方法

URLバーのURLを変更する方法。
history.replaceState()で可能です。
注意点として、アンドロイドの一部では対応していないようです。ガラケーも危険な気がしますので、
この方法でURLを変更してブックマークなどを勧める場合は注意して下さい。
また、別ドメインに変更することはセキュリティ上不可能です。

例として、URLの一部をランダムな文字列に変更するjsをご紹介します。

0.1秒に一回ランダム表示。いい感じに気持ち悪くなりました。役には立たないと思います。