{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# keras_example" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2017-02-16T23:42:25.092005", "start_time": "2017-02-16T23:42:21.640674" }, "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] } ], "source": [ "import keras" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2017-02-16T23:42:25.749071", "start_time": "2017-02-16T23:42:25.744776" }, "collapsed": true }, "outputs": [], "source": [ "import tensorflow" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2017-02-16T22:00:11.254108", "start_time": "2017-02-16T22:00:11.243204" } }, "source": [ "## 参考\n", "- https://keras.io/ja/\n", "- https://keras.io/\n", "\n", "## モジュール性\n", "- モデルとは、できるだけ制約を少なく接続可能\n", "- 完全構成可能な独立したモジュールのシーケンスまたはグラフとして理解されています。\n", "\n", "### ニューラルネットワーク\n", "すべて新しいモデルを作成するために組み合わせられる独立したモジュールです。\n", "\n", "- 層\n", "- 損失関数\n", "- 最適化\n", "- 初期化\n", "- 活性化関数\n", "- 正規化\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SequentialモデルでKerasに触れてみよう\n", "- Sequential (系列) モデルは層を積み重ねたもの。\n", "- Sequential モデルはコンストラクタに層のインスタンスのリストを与えることで作れる\n", "- 単純に .add() メソッドを用いて層を追加できる。\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2017-02-16T23:44:04.147270", "start_time": "2017-02-16T23:44:04.000495" }, "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from keras.models import Sequential\n", "from keras.layers import Dense, Activation\n", "\n", "model = Sequential([\n", " Dense(32, input_dim=784),\n", " Activation('relu'),\n", "])\n", "model.add(Dense(10))\n", "model.add(Activation('softmax'))\n", "model" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2017-02-16T22:11:29.609997", "start_time": "2017-02-16T22:11:29.604076" } }, "source": [ "## モデルの可視化\n", "- https://keras.io/ja/visualization/" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2017-02-16T23:44:44.202370", "start_time": "2017-02-16T23:44:42.352855" }, "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pydot-ng==1.0.0\r\n" ] } ], "source": [ "!pip freeze | grep pydot" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2017-02-17T00:06:23.758964", "start_time": "2017-02-17T00:06:23.600309" }, "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "image/png": "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\nTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "G\n", "\n", "\n", "4623639888\n", "\n", "dense_input_1: InputLayer\n", "\n", "\n", "4623639496\n", "\n", "dense_1: Dense\n", "\n", "\n", "4623639888->4623639496\n", "\n", "\n", "\n", "\n", "4623639720\n", "\n", "activation_1: Activation\n", "\n", "\n", "4623639496->4623639720\n", "\n", "\n", "\n", "\n", "4623793904\n", "\n", "dense_2: Dense\n", "\n", "\n", "4623639720->4623793904\n", "\n", "\n", "\n", "\n", "4623794016\n", "\n", "activation_2: Activation\n", "\n", "\n", "4623793904->4623794016\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import Image, display, SVG\n", "from keras.utils.visualize_util import plot\n", "from keras.utils.visualize_util import model_to_dot\n", "\n", "# plot using model_to_dot\n", "plot(model, to_file='model.png')\n", "display(Image(\"model.png\"))\n", "\n", "SVG(model_to_dot(model).create(prog='dot', format='svg'))\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2017-02-17T03:55:35.349305", "start_time": "2017-02-17T03:55:35.240166" }, "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "____________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "====================================================================================================\n", "dense_1 (Dense) (None, 32) 25120 dense_input_1[0][0] \n", "____________________________________________________________________________________________________\n", "activation_1 (Activation) (None, 32) 0 dense_1[0][0] \n", "____________________________________________________________________________________________________\n", "dense_2 (Dense) (None, 10) 330 activation_1[0][0] \n", "____________________________________________________________________________________________________\n", "activation_2 (Activation) (None, 10) 0 dense_2[0][0] \n", "====================================================================================================\n", "Total params: 25,450\n", "Trainable params: 25,450\n", "Non-trainable params: 0\n", "____________________________________________________________________________________________________\n" ] } ], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "ExecuteTime": { "end_time": "2017-02-17T04:13:38.221721", "start_time": "2017-02-17T04:13:38.074444" }, "collapsed": false }, "outputs": [], "source": [ "Sequential.from_config(model.get_config()).set_weights(model.get_weights())\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "ExecuteTime": { "end_time": "2017-02-17T04:02:49.457618", "start_time": "2017-02-17T04:02:49.430038" }, "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import yaml\n", "import io\n", "import json\n", "json.loads(model.to_json()) == yaml.load(io.StringIO(model.to_yaml()))" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "ExecuteTime": { "end_time": "2017-02-17T04:16:02.024473", "start_time": "2017-02-17T04:16:02.020095" }, "collapsed": false }, "outputs": [], "source": [ "from keras.models import model_from_json, model_from_yaml, model_from_config\n" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "ExecuteTime": { "end_time": "2017-02-17T04:17:20.430812", "start_time": "2017-02-17T04:17:20.381318" }, "collapsed": true }, "outputs": [], "source": [ "model.save_weights(\"model_weights_hdf5\")" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "ExecuteTime": { "end_time": "2017-02-17T04:42:43.636133", "start_time": "2017-02-17T04:42:43.505532" }, "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-rw-r--r-- 1 knt staff 107K 2 17 04:17 model_weights_hdf5\r\n" ] } ], "source": [ "!ls -lh *hdf*" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "ExecuteTime": { "end_time": "2017-02-17T04:51:36.456814", "start_time": "2017-02-17T04:51:36.420552" }, "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " /\n", "activation_1 /activation_1\n", "activation_2 /activation_2\n", "dense_1 /dense_1\n", "dense_2 /dense_2\n", "----------\n", "activation_1\n", "activation_2\n", "dense_1\n", "dense_1/dense_1_W:0\n", "dense_1/dense_1_b:0\n", "dense_2\n", "dense_2/dense_2_W:0\n", "dense_2/dense_2_b:0\n", "----------\n", "['layer_names']\n", "[b'dense_1' b'activation_1' b'dense_2' b'activation_2']\n", "----------\n", "[]\n", "\n", "default\n", "[, ]\n", "----------\n", "[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n" ] } ], "source": [ "# https://github.com/h5py/h5py\n", "import h5py\n", "with h5py.File(\"model_weights_hdf5\", \"r\") as h5:\n", " print(type(h5), h5.name)\n", " for k, v in h5.items():\n", " print(k, v, type(v), v.name)\n", " print(\"-\"*10)\n", "\n", " h5.visit(print)\n", " print(\"-\"*10)\n", "\n", " print(list(h5.attrs))\n", " print(h5.attrs[\"layer_names\"])\n", " #h5.attrs[\"new_attr\"] = \"values\"\n", " #print(list(h5.attrs), h5.attrs[\"new_attr\"])\n", " print(\"-\"*10)\n", "\n", " print(list(h5[\"/activation_1\"].values()))\n", " print(h5.get(\"/dense_1\"))\n", " print(h5.get(\"/dense_3\", \"default\"))\n", " print(list(h5[\"/dense_1\"].values()))\n", " print(\"-\"*10)\n", " print(h5[\"/dense_1/dense_1_b:0\"].value)\n", " " ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "ExecuteTime": { "end_time": "2017-02-17T22:22:47.569857", "start_time": "2017-02-17T22:22:47.566111" }, "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 130, "metadata": { "ExecuteTime": { "end_time": "2017-02-18T11:32:30.682163", "start_time": "2017-02-18T11:32:30.580596" }, "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " /mydataset (100,)\n", "[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24\n", " 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49\n", " 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74\n", " 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99] \n", "[0 1]\n", "----------\n", " /group\n", "----------\n", " /group/another_dataset 1.0\n", "----------\n", " /group/sub_group\n", "----------\n", " /group\n", " \n", " \n", "----------\n", "group\n", "group/another_dataset\n", "group/sub_group\n", "group/sub_group/v1_ndarray\n", "group/sub_group/v2_float\n", "group/sub_group/v3_int\n", "mydataset\n", "----------\n" ] } ], "source": [ "with h5py.File(\"file.hdf5\", \"w\") as f:\n", " dset = f.create_dataset(\"mydataset\", shape=(100,), dtype='i', data=np.arange(100))\n", " print(type(dset), dset, dset.name, dset.shape)\n", " print(dset.value, type(dset.value))\n", " print(dset[0:2])\n", " print(\"-\"*10)\n", "\n", " group = f.create_group(\"group\")\n", " print(type(group), group, group.name)\n", " print(\"-\"*10)\n", "\n", " dset2 = group.create_dataset(\"another_dataset\", data=np.arange(6).reshape(2, 3), dtype=\"f\")\n", " dset2\n", " print(type(dset2), dset2, dset2.name, dset2[0, 1])\n", " print(\"-\"*10)\n", "\n", " sub_group = group.create_group(\"sub_group\")\n", " sub_group[\"v1_ndarray\"] = np.array([1.0])\n", " sub_group[\"v2_float\"] = 2.0\n", " sub_group[\"v3_int\"] = 3\n", " print(type(sub_group), sub_group, sub_group.name)\n", " print(\"-\"*10)\n", "\n", " soft_link = h5py.SoftLink(\"/group\")\n", " external_link = h5py.ExternalLink(\"model_weights_hdf5\", \"/dense_1/dense_1_b:0\")\n", " print(type(soft_link), soft_link, soft_link.path)\n", " print(type(external_link), external_link, external_link.path, external_link.filename)\n", " print(\"-\"*10)\n", "\n", " sub_group[\"alias_group\"] = soft_link\n", " sub_group['ext_link'] = external_link\n", " print(type(sub_group[\"alias_group\"]), sub_group[\"alias_group\"])\n", " print(type(sub_group[\"ext_link\"]), sub_group[\"ext_link\"])\n", " print(\"-\"*10)\n", "\n", " f.visit(print)\n", " print(\"-\"*10)\n" ] }, { "cell_type": "code", "execution_count": 132, "metadata": { "ExecuteTime": { "end_time": "2017-02-18T11:40:50.315964", "start_time": "2017-02-18T11:40:48.877353" }, "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse
111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse
\n", "
" ], "text/plain": [ " survived pclass sex age sibsp parch fare embarked class \\\n", "0 0 3 male 22.0 1 0 7.2500 S Third \n", "1 1 1 female 38.0 1 0 71.2833 C First \n", "\n", " who adult_male deck embark_town alive alone \n", "0 man True NaN Southampton no False \n", "1 woman False C Cherbourg yes False " ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "import seaborn as sns\n", "from IPython.display import display\n", "\n", "titanic = sns.load_dataset(\"titanic\")\n", "titanic.head(2)\n" ] }, { "cell_type": "code", "execution_count": 160, "metadata": { "ExecuteTime": { "end_time": "2017-02-18T12:32:52.877115", "start_time": "2017-02-18T12:32:51.538534" }, "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "File path: titanic_head_export.h5\n", "Empty\n", "----------\n", "\n", "File path: titanic_head_export.h5\n", "/key frame_table (typ->appendable,nrows->10,ncols->15,indexers->[index]) \n", "/key/meta/values_block_0/meta series_table (typ->appendable,nrows->3,ncols->1,indexers->[index],dc->[values])\n", "/key/meta/values_block_1/meta series_table (typ->appendable,nrows->7,ncols->1,indexers->[index],dc->[values])\n", "----------\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/knt/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/tables/path.py:118: NaturalNameWarning: object name is a Python keyword: 'class'; you will not be able to use natural naming to access this object; using ``getattr()`` will still work, though\n", " % (name, _warnInfo), NaturalNameWarning)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "File path: titanic_head_export.h5\n", "/key2/sub frame_table (typ->appendable,nrows->10,ncols->15,indexers->[index],dc->[survived,pclass,sex,age,sibsp,parch,fare,embarked,class,who,adult_male,deck,embark_town,alive,alone])\n", "/key2/sub/meta/class/meta series_table (typ->appendable,nrows->3,ncols->1,indexers->[index],dc->[values]) \n", "/key2/sub/meta/deck/meta series_table (typ->appendable,nrows->7,ncols->1,indexers->[index],dc->[values]) \n", "----------\n" ] }, { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
88602male27.00013.0SSecondmanTrueNaNSouthamptonnoTrue
88711female19.00030.0SFirstwomanFalseBSouthamptonyesTrue
\n", "
" ], "text/plain": [ " survived pclass sex age sibsp parch fare embarked class \\\n", "886 0 2 male 27.0 0 0 13.0 S Second \n", "887 1 1 female 19.0 0 0 30.0 S First \n", "\n", " who adult_male deck embark_town alive alone \n", "886 man True NaN Southampton no True \n", "887 woman False B Southampton yes True " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
88911male26.00030.00CFirstmanTrueCCherbourgyesTrue
89003male32.0007.75QThirdmanTrueNaNQueenstownnoTrue
\n", "
" ], "text/plain": [ " survived pclass sex age sibsp parch fare embarked class who \\\n", "889 1 1 male 26.0 0 0 30.00 C First man \n", "890 0 3 male 32.0 0 0 7.75 Q Third man \n", "\n", " adult_male deck embark_town alive alone \n", "889 True C Cherbourg yes True \n", "890 True NaN Queenstown no True " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# http://pandas.pydata.org/pandas-docs/stable/io.html#hdf5-pytables\n", "# http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_hdf.html\n", "with pd.HDFStore('titanic_head_export.h5', mode=\"w\") as store_export:\n", " print(store_export)\n", " print(\"-\"*10)\n", "\n", " store_export.append('key', titanic.head())\n", " store_export.append('key', titanic.tail(), data_columns=titanic.columns)\n", " print(store_export)\n", " print(\"-\"*10)\n", " \n", " store_export.remove('key')\n", " store_export.put('key2/sub', titanic.tail(), data_columns=titanic.columns, format=\"table\")\n", " store_export.append('key2/sub', titanic.tail())\n", " print(store_export)\n", " print(\"-\"*10)\n", "\n", " display(store_export[\"key2/sub\"].head(2))\n", " display(store_export.select(\"key2/sub\").tail(2))\n", " " ] }, { "cell_type": "code", "execution_count": 144, "metadata": { "ExecuteTime": { "end_time": "2017-02-18T11:57:00.442740", "start_time": "2017-02-18T11:57:00.205823" }, "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
survivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse
111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse
213female26.0007.9250SThirdwomanFalseNaNSouthamptonyesTrue
311female35.01053.1000SFirstwomanFalseCSouthamptonyesFalse
403male35.0008.0500SThirdmanTrueNaNSouthamptonnoTrue
\n", "
" ], "text/plain": [ " survived pclass sex age sibsp parch fare embarked class \\\n", "0 0 3 male 22.0 1 0 7.2500 S Third \n", "1 1 1 female 38.0 1 0 71.2833 C First \n", "2 1 3 female 26.0 0 0 7.9250 S Third \n", "3 1 1 female 35.0 1 0 53.1000 S First \n", "4 0 3 male 35.0 0 0 8.0500 S Third \n", "\n", " who adult_male deck embark_town alive alone \n", "0 man True NaN Southampton no False \n", "1 woman False C Cherbourg yes False \n", "2 woman False NaN Southampton yes True \n", "3 woman False C Southampton yes False \n", "4 man True NaN Southampton no True " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "key_hdf\n", "key_hdf/_i_table\n", "key_hdf/_i_table/index\n", "key_hdf/_i_table/index/abounds\n", "key_hdf/_i_table/index/bounds\n", "key_hdf/_i_table/index/indices\n", "key_hdf/_i_table/index/indicesLR\n", "key_hdf/_i_table/index/mbounds\n", "key_hdf/_i_table/index/mranges\n", "key_hdf/_i_table/index/ranges\n", "key_hdf/_i_table/index/sorted\n", "key_hdf/_i_table/index/sortedLR\n", "key_hdf/_i_table/index/zbounds\n", "key_hdf/meta\n", "key_hdf/meta/values_block_0\n", "key_hdf/meta/values_block_0/meta\n", "key_hdf/meta/values_block_0/meta/_i_table\n", "key_hdf/meta/values_block_0/meta/_i_table/index\n", "key_hdf/meta/values_block_0/meta/_i_table/index/abounds\n", "key_hdf/meta/values_block_0/meta/_i_table/index/bounds\n", "key_hdf/meta/values_block_0/meta/_i_table/index/indices\n", "key_hdf/meta/values_block_0/meta/_i_table/index/indicesLR\n", "key_hdf/meta/values_block_0/meta/_i_table/index/mbounds\n", "key_hdf/meta/values_block_0/meta/_i_table/index/mranges\n", "key_hdf/meta/values_block_0/meta/_i_table/index/ranges\n", "key_hdf/meta/values_block_0/meta/_i_table/index/sorted\n", "key_hdf/meta/values_block_0/meta/_i_table/index/sortedLR\n", "key_hdf/meta/values_block_0/meta/_i_table/index/zbounds\n", "key_hdf/meta/values_block_0/meta/_i_table/values\n", "key_hdf/meta/values_block_0/meta/_i_table/values/abounds\n", "key_hdf/meta/values_block_0/meta/_i_table/values/bounds\n", "key_hdf/meta/values_block_0/meta/_i_table/values/indices\n", "key_hdf/meta/values_block_0/meta/_i_table/values/indicesLR\n", "key_hdf/meta/values_block_0/meta/_i_table/values/mbounds\n", "key_hdf/meta/values_block_0/meta/_i_table/values/mranges\n", "key_hdf/meta/values_block_0/meta/_i_table/values/ranges\n", "key_hdf/meta/values_block_0/meta/_i_table/values/sorted\n", "key_hdf/meta/values_block_0/meta/_i_table/values/sortedLR\n", "key_hdf/meta/values_block_0/meta/_i_table/values/zbounds\n", "key_hdf/meta/values_block_0/meta/table\n", "key_hdf/meta/values_block_1\n", "key_hdf/meta/values_block_1/meta\n", "key_hdf/meta/values_block_1/meta/_i_table\n", "key_hdf/meta/values_block_1/meta/_i_table/index\n", "key_hdf/meta/values_block_1/meta/_i_table/index/abounds\n", "key_hdf/meta/values_block_1/meta/_i_table/index/bounds\n", "key_hdf/meta/values_block_1/meta/_i_table/index/indices\n", "key_hdf/meta/values_block_1/meta/_i_table/index/indicesLR\n", "key_hdf/meta/values_block_1/meta/_i_table/index/mbounds\n", "key_hdf/meta/values_block_1/meta/_i_table/index/mranges\n", "key_hdf/meta/values_block_1/meta/_i_table/index/ranges\n", "key_hdf/meta/values_block_1/meta/_i_table/index/sorted\n", "key_hdf/meta/values_block_1/meta/_i_table/index/sortedLR\n", "key_hdf/meta/values_block_1/meta/_i_table/index/zbounds\n", "key_hdf/meta/values_block_1/meta/_i_table/values\n", "key_hdf/meta/values_block_1/meta/_i_table/values/abounds\n", "key_hdf/meta/values_block_1/meta/_i_table/values/bounds\n", "key_hdf/meta/values_block_1/meta/_i_table/values/indices\n", "key_hdf/meta/values_block_1/meta/_i_table/values/indicesLR\n", "key_hdf/meta/values_block_1/meta/_i_table/values/mbounds\n", "key_hdf/meta/values_block_1/meta/_i_table/values/mranges\n", "key_hdf/meta/values_block_1/meta/_i_table/values/ranges\n", "key_hdf/meta/values_block_1/meta/_i_table/values/sorted\n", "key_hdf/meta/values_block_1/meta/_i_table/values/sortedLR\n", "key_hdf/meta/values_block_1/meta/_i_table/values/zbounds\n", "key_hdf/meta/values_block_1/meta/table\n", "key_hdf/table\n" ] } ], "source": [ "titanic.head().to_hdf(\"titanic_head.hdf5\", \"key_hdf\", mode=\"w\", format=\"table\")\n", "titanic_df = pd.read_hdf(\"titanic_head.hdf5\")\n", "display(titanic_df)\n", "\n", "with h5py.File(\"titanic_head.hdf5\", mode=\"r\") as titanic_hdf:\n", " titanic_hdf.visit(print)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 入力の形を指定する\n", "- 最初の層では入力の形を指定しなければならない (それ以降の層では必要ない) 。 指定する方法は複数ある:\n", "- 最初の層にinput_shape引数を与える。これは形を表すタプル (タプルの要素は整数かNoneでNoneはどんなサイズでも良いことを表す。) input_shapeにbatchサイズは含まれない。\n", "- 代わりにbatch_input_shape引数を与える。ここではbatchサイズが含まれる。これは固定長のbatchサイズを指定するときに便利である (例えば stateful RNN) 。\n", "- Denseなどの一部の2Dの層では入力の形をinput_dimで指定でき、一部の3Dの層ではinput_dimとinput_lengthで指定できる。\n", "- したがって、次の3つのコードは等価である。\n" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2017-02-16T21:57:03.115413", "start_time": "2017-02-16T21:57:03.028379" } }, "source": [ "\n", "\n", "\n", "```python\n", "model = Sequential()\n", "\n", "model.add(Dense(32, input_shape=(784,)))\n", "model.add(Dense(32, batch_input_shape=(None, 784)))\n", "model.add(Dense(32, input_dim=784))\n", "\n", "# 2nd\n", "# note that batch dimension is \"None\" here,\n", "# so the model will be able to process batches of any size.\n", "\n", "# 次の3つのコードも等価である。\n", "model.add(LSTM(32, input_shape=(10, 64)))\n", "model.add(LSTM(32, batch_input_shape=(None, 10, 64)))\n", "model.add(LSTM(32, input_length=10, input_dim=64))\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Compile\n", "### 最適化 optimize\n", "最適化アルゴリズムの利用方法\n", "\n", "https://keras.io/ja/optimizers/\n", "\n", "### 目的関数\n", "- https://keras.io/ja/objectives/\n", "- https://github.com/fchollet/keras/blob/master/keras/objectives.py\n", "\n", "#### complileのloss\n", "- regression ?\n", " - mean_squared_error / mse\n", " - mean_absolute_error / mae\n", " - mean_absolute_percentage_error / mape\n", " - mean_squared_logarithmic_error / msle\n", "- squared_hinge\n", "- hinge\n", "- binary_crossentropy\n", " - logloss\n", "- categorical_crossentropy\n", " - multi-class-loglossとしても知られています\n", " - Note: この目的関数を使うには,ラベルがバイナリ配列であり,その形状が(nb_samples, nb_classes)であることが必要です.\n", "- sparse_categorical_crossentropy\n", " - categorical_crossentropyと同じですが,スパースラベルを取る点で違います\n", " - Note: ラベルの次元と出力の次元が同じである必要があります\n", " - 例えば,ラベル形状を拡張するために,np.expand_dims(y, -1)を用いて新しく次元を追加する必要があるかもしれません.\n", "- kullback_leibler_divergence\n", " - kld\n", " - 予測した確率分布Qから真の確率分布Pへの情報ゲイン.2つの分布の異なりの度合いを得る.\n", "- poisson\n", " - (予測 - 正解 * log(予測))の平均\n", "- cosine_proximity\n", " - 予測と正解間のコサイン近似の負の平均.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" }, "toc": { "toc_cell": false, "toc_number_sections": true, "toc_threshold": 6, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }