teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

d

2018/10/25 02:30

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -5,20 +5,51 @@
5
5
  os.path.abspath(PATH + "/model.json")
6
6
  ```
7
7
 
8
- ## 追記
8
+ ## モデル構造及び重みの保存方法
9
9
 
10
- モデルの保存、読み込みでれば、model.save() 及び load_model() を使うとよいと思います。
10
+ Keras にはモデル構造及び重みの保存方法は以下がます。
11
11
 
12
+
13
+ * 重み + モデル構造 (.h5)
14
+ model.save(): 保存
15
+ model = load_model(): 読み込み
16
+
17
+ * 重み (.h5)
18
+ model.save_weights(): 保存
19
+ model.load_weights(): 読み込み
20
+
21
+ * モデル構造 (.json)
22
+ json_string = model.to_json(): 保存
23
+ model = model_from_json(json_string): 読み込み
24
+
25
+ * モデル構造 (.yaml)
26
+ yaml_string = model.to_yaml()
27
+ model = model_from_yaml(yaml_string)
28
+
29
+ ## モデルの保存 (ModelCheckpoint で最良のモデルのみ保存する。)
30
+
12
31
  ```
32
+ import os
33
+ import time
34
+
13
35
  import numpy as np
36
+ from keras.callbacks import ModelCheckpoint
14
37
  from keras.datasets import mnist
15
38
  from keras.layers import Activation, BatchNormalization, Dense
16
- from keras.models import Sequential, load_model
39
+ from keras.models import Sequential
17
40
  from keras.utils.np_utils import to_categorical
18
41
 
19
42
  # MNIST データを取得する。
20
43
  (x_train, y_train), (x_test, y_test) = mnist.load_data()
21
44
 
45
+ # 1次元配列にする。 (28, 28) -> (784,) にする
46
+ x_train = x_train.reshape(len(x_train), -1)
47
+ x_test = x_test.reshape(len(x_test), -1)
48
+
49
+ # one-hot 表現に変換する。
50
+ y_train = to_categorical(y_train)
51
+ y_test = to_categorical(y_test)
52
+
22
53
  # モデルを作成する。
23
54
  model = Sequential()
24
55
  model.add(Dense(10, input_dim=784))
@@ -34,20 +65,70 @@
34
65
  loss='categorical_crossentropy',
35
66
  metrics=['accuracy'])
36
67
 
68
+ # 学習する。
37
- # モデルの入力に合わせて1次元配列にする。 (28, 28) -> (784,) する
69
+ save_path = os.path.join('models', time.strftime("%Y%m%d-%H%M%S")) # 保存するディレクトリ
38
- x_train = x_train.reshape(len(x_train), -1)
39
- x_test = x_test.reshape(len(x_test), -1)
70
+ os.makedirs(save_path, exist_ok=True)
71
+ model_checkpoint = ModelCheckpoint(
72
+ filepath=os.path.join(save_path, 'model_{epoch:02d}_{val_loss:.2f}.h5'),
73
+ monitor='val_loss',
74
+ save_best_only=True,
75
+ verbose=1)
40
76
 
41
- # one-hot 表現に変換する。
77
+ model.fit(x_train, y_train, epochs=10, batch_size=128,
42
- y_train_onehot = to_categorical(y_train)
78
+ validation_data=(x_test, y_test),
79
+ callbacks=[model_checkpoint])
80
+ ```
43
81
 
44
- model.fit(x_train, y_train_onehot,
82
+ 以下のように models ディレクトリ以下に現在の時刻でフォルダが作成され、その下に重みファイルが保存されます。
45
- batch_size=128,
46
- epochs=10,
47
- validation_split=0.1)
48
83
 
84
+ ```
85
+ models
86
+ `-- 20181025-022510
87
+ |-- model_01_0.55.h5
88
+ |-- model_02_0.35.h5
89
+ |-- model_03_0.30.h5
49
- model.save('model.h5')
90
+ |-- model_04_0.27.h5
91
+ |-- model_05_0.25.h5
92
+ |-- model_06_0.24.h5
93
+ |-- model_07_0.22.h5
94
+ |-- model_09_0.22.h5
95
+ `-- model_10_0.22.h5
96
+ ```
50
97
 
98
+ ### 読み込むとき
99
+
100
+ モデル構造は、save_json(), load_from_json() を使ってもいいですが、モデルがわかっているのであれば、それを構築して、model.load_weights() で重みだけ読み込めばよいです。
101
+
102
+ ```
103
+ # 一番新しいモデルのパスを取得する。
104
+ import glob
105
+ model_paths = glob.glob(os.path.join(save_path, 'model_*.h5'))
106
+ last_model_path = sorted(model_paths, reverse=True)[0]
107
+ print('loading weights...', last_model_path)
108
+
109
+ # モデルを作成する。
110
+ model = Sequential()
111
+ model.add(Dense(10, input_dim=784))
112
+ model.add(BatchNormalization())
51
- model = load_model('model.h5')
113
+ model.add(Activation('relu'))
52
- model.summary()
114
+ model.add(Dense(10))
115
+ model.add(BatchNormalization())
116
+ model.add(Activation('relu'))
117
+ model.add(Dense(10))
118
+ model.add(BatchNormalization())
119
+ model.add(Activation('softmax'))
120
+ model.compile(optimizer='adam',
121
+ loss='categorical_crossentropy',
122
+ metrics=['accuracy'])
123
+
124
+ # 重みを読み込む。
125
+ model.load_weights(last_model_path)
126
+ loss, acc = model.evaluate(x_train, y_train)
127
+ print('Loss: {}, Accuracy: {}'.format(loss, acc))
128
+ ```
129
+
130
+ ```
131
+ loading weights... models/20181025-022510/model_10_0.22.h5
132
+ 60000/60000 [==============================] - 1s 23us/step
133
+ Loss: 0.18432119323263566, Accuracy: 94.75%
53
134
  ```

1

d

2018/10/25 02:30

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -3,4 +3,51 @@
3
3
  ```python
4
4
  import os
5
5
  os.path.abspath(PATH + "/model.json")
6
+ ```
7
+
8
+ ## 追記
9
+
10
+ モデルの保存、読み込みであれば、model.save() 及び load_model() を使うとよいと思います。
11
+
12
+ ```
13
+ import numpy as np
14
+ from keras.datasets import mnist
15
+ from keras.layers import Activation, BatchNormalization, Dense
16
+ from keras.models import Sequential, load_model
17
+ from keras.utils.np_utils import to_categorical
18
+
19
+ # MNIST データを取得する。
20
+ (x_train, y_train), (x_test, y_test) = mnist.load_data()
21
+
22
+ # モデルを作成する。
23
+ model = Sequential()
24
+ model.add(Dense(10, input_dim=784))
25
+ model.add(BatchNormalization())
26
+ model.add(Activation('relu'))
27
+ model.add(Dense(10))
28
+ model.add(BatchNormalization())
29
+ model.add(Activation('relu'))
30
+ model.add(Dense(10))
31
+ model.add(BatchNormalization())
32
+ model.add(Activation('softmax'))
33
+ model.compile(optimizer='adam',
34
+ loss='categorical_crossentropy',
35
+ metrics=['accuracy'])
36
+
37
+ # モデルの入力に合わせて1次元配列にする。 (28, 28) -> (784,) にする
38
+ x_train = x_train.reshape(len(x_train), -1)
39
+ x_test = x_test.reshape(len(x_test), -1)
40
+
41
+ # one-hot 表現に変換する。
42
+ y_train_onehot = to_categorical(y_train)
43
+
44
+ model.fit(x_train, y_train_onehot,
45
+ batch_size=128,
46
+ epochs=10,
47
+ validation_split=0.1)
48
+
49
+ model.save('model.h5')
50
+
51
+ model = load_model('model.h5')
52
+ model.summary()
6
53
  ```