Kerasで学習したモデルを保存する OR モデルを再利用する
Keras @TF backendで構築したモデルを再利用したい
ドキュメントにすべて書いてありますので堅い字面でも読める人は以下参照のこと. FAQ - Keras Documentation
モデルの保存
(略)
model.fit((略))
model.save('AAAA.h5')
これでモデルがAAAA.h5という名前で保存された.引用すると,ここで保存されているのは
- モデル構造
- 学習したモデルの重み
である.モデル構造だけ, モデルの重みだけ保存したい場合の方法もあるのでそういうニッチな希望はドキュメントを参考にしてください.
モデルの読み出し
from keras.models import load_model model = load_model('AAAA.h5')
これで読みだしている.ただしエラーが出てしまう人は,そもそもファイルが存在しない, h5pyをインストールしていないに注意してください.
h5pyがないと, 先ほど保存したAAAA.h5ファイルが読み出せません.
HDF5形式なので,やや特殊なファイル形式です. pip install h5py
でインストールしましょう.
読み出したモデルが本当に読み出せているか確認したい
そういうときは, model.summary()
でモデルの構造を見ることができます.
出力を見て, 構築したものと同じであればOKです.
入れ子になったリストを作る方法
目的
入れ子になったリストを作る
group = [[], [], [], ...., []]
このようなリストで, 且つ任意の数だけ入れ子にさせる
方法
group = [[] for i in range(n)] >> [[], [], [],..., []]
補足
入れ子はnestedとかネストした, とか呼ばれる. むしろ, 「入れ子のリストを作る」という言葉にたどり着かない可能性が高いですね.
インデキシングを狙って再掲, [[], [], [], ...]
これ
ファイルのサイズを確認後, 空を削除する
流れ
- API等でファイルを取得
- ファイルサイズを取得
- 空なら削除
ファイルサイズを取得
os.path.getsize(path)
pathでファイル名も含めたPATHを与える
ファイルを削除する
os.remove(path)
ファイル名を含めたPATHを与える
sklearn.manifold.tsneのメモリリークを回避するために(Anacondaのみ)
現象
大規模データでscikit-learnのmanifold.tsneを使うとメモリエラーを起こします。Pythonでメモリエラーか。
原因
mklのバグ、、、らしい。以前にscikit-learnにイシューが立っていたようだ。バージョンが上がった現在でも改善はされていない。このイシューはPython2系時点だった。今回はPython3系なのでやはりバージョンも関係ない。
Python crashes when calculating large t-SNE · Issue #4619 · scikit-learn/scikit-learn · GitHub
対策(翻訳)
Anacondaのみだが
conda install nomkl
これで解決できる。これでintel-mkl ライブラリを使わないためメモリリークを起こさないようだ。
非Anacondaの場合はラッパーを利用することになる。
GitHub - danielfrg/tsne: A python wrapper for Barnes-Hut tsne
自分はAnacondaだったのでこっちは試していない。念の為。
pandasで要素内に特定の文字列が含まれる行を抜き出したい
列Aに"美"が含まれる行を抜き出す
index | A | ... |
---|---|---|
0 | 太郎 | ... |
1 | 真由美 | ... |
2 | 和則 | ... |
3 | 和美 | ... |
4 | 哲也 | ... |
5 | 司 | ... |
というDataFrame(df)があったとする。 このとき、"美"という文字列を含む行だけ欲しいという場合にどうするか。
str.containsを使う
df[df["A"].str.contains("美")]
これで
index | A | ... |
---|---|---|
1 | 真由美 | ... |
3 | 和美 | ... |
が返ってくる。 詳細はドキュメントで確認して欲しい。
pandasで条件にあった値を持つ行を削除する場合
列Aにあるnという値を持つ行を削除したい
df | A | B | C |
---|---|---|---|
0 | k | n | n |
1 | n | n | n |
2 | n | k | k |
... | ... | ... | ... |
1000 | n | m | m |
... | ... | ... | ... |
この1行目2行目に該当する行を削除したい時にどうするか。
もちろんこの簡単な例ではdf.drop([1,2,1000])
でいける?
まさかそんな話ではない。
方針
- Aにnという値を持つ行を削除する
- Aにn以外の値を持つ行を抽出する
方針1
正直わからんかった。df.drop()
はindexの値をリストとして与えればうまく削除できる。
ただ, df[df.A == n]
で得られたDataFrameからindexのリストを取得することはどこを見ても書いてなかったしそもそもできないのかもしれない。
過去にindexの値を取得するスクリプトを書いた気がするがそれはまた別の機会に。
方針2
df[df.A != n]
これでよい。削除する削除するという頭だとどうしてもdf[df.A == n]
をdropすることばかりに頭がいくが, 逆に考えてn以外の値を持つ行を抽出する。そう考える。
.vimrcをGitで管理するのはいいけれども
.vimrcをGitで管理したいのだけれど
/home/xxx/以下にそのままGitを置くわけじゃあるまいし, どうやるんだろうと思っていたら見つけた.
シンボリックリンクを貼ればいけるわけね〜
mkdir ~/dotfiles mv ~/.vimrc ~/dotfiles/_vimrc ln -s ~/dotfiles/_vimrc ~/.vimrc