ããŒãããäœãDeep Learningã(æè€ åº·æ¯ ãèããªã©ã€ãªãŒã»ãžã£ãã³å)ãèªãã§ããæã«ãåç §ãããµã€ãçãã¡ã¢ããŠãããŸããããã®ïŒïŒâ âãã®ïŒïŒ
Google Colab ããµã€ãã«äœ¿ããã®ã§ããã®æ¬ã®å 容ã TensorFlow ã§ãã£ãŠã¿ãããšã«ããŸãã
TensorFlow ã®åå¿è åããã¥ãŒããªã¢ã«
TensorFlow ã®ãµã€ããhttps://www.tensorflow.org/?hl=ja ã®åå¿è åããã¥ãŒããªã¢ã«ãã¯ãããŠã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ãããã®ãŸãŸåãããŠèŠãŸããã
ã»ããšã«ããã®ãŸã㟠Colab ã«ã³ããããã°åãã®ã§ãç¹ã«ã¡ã¢ããããšããããŸããã
ããããåãããšã確èªãããããã®ãã®ãªã®ã§ãå
容ã«ã€ããŠã®èª¬æã¯ãŸã£ãããããŸãããå¿
èŠãªèª¬æã¯ãµã€ãå
ã®ãã¡ãã¡ã«ããããã§ãããåå¿è
ã¯ãã¥ãŒããªã¢ã«ããã£ãããšãèªåãä»äœãããã®ããæ¬¡ã«äœãããã°ãããããããããè¿·åã«ãªã£ãŠããŸãããã§ãã
ãšèšããã
ãããããã®ãµã€ãã¯ãŸã£ããã®åå¿è åãã§ã¯ãªããpythonããã¥ãŒã©ã«ãããã«ã€ããŠããçšåºŠç¥ã£ãŠãã人ããGoogle Colab ã§TensorFlow ã䜿ããããã«ããããã®ãµã€ããªãã ãããšæããŸããå®éåé¡ããã¥ãŒã©ã«ãããã¯ãŒã¯ãã®ãã®ã«ã€ããŠã®è§£èª¬ãèŠåœãããªããã
ããããç¹ã§ã¯ãããŒãããäœãDeep Learningãã®ããã«ãé çªã«èª¬æãç©ã¿äžããŠããæžç±ã¯å¿ èŠãªãã ãšæããŸããã
ã§
ãã®ãã¥ãŒããªã¢ã«ã§å®è¡ããã¹ã¯ãªããããããŒãããäœãDeep Learningãã®å 容ãšç §ããåãããŠãkeras ããã³ TensorFlow ãäœãããŠãããã調ã¹ãŠããããšæããŸãã
ã¢ãã«ã®æ§ç¯
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
ããã§ã¯ãkeras ã®ã·ãŒã±ã³ã·ã£ã«ã¢ãã«ãæ§ç¯ããŠããŸãã
type(model)
tensorflow.python.keras.engine.sequential.Sequential
model.summary()
Model: "sequential"
Layer (type) ããããã Output Shape ããããã Param #
flatten (Flatten)ããããã (None, 784) ããããã 0
dense (Dense) ããããã (None, 128) ããããã100480
dense_1 (Dense) ããããã(None, 10) ããããã1290
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
å
¥åå±€ããã®output( , 784)ã¯
次ã®dense局㧠(784, 128)ãã®éã¿ãšãããç©ããã( , 128)ãoutputãã
ãããæ¬¡ã®dense-1å±€ã§(128, 10)ã®éã¿ãšãããç©ãã( , 10)ãoutputããŠããã
model.layers
[tensorflow.python.keras.layers.core.Flatten at 0x7faf1e9efac8,
tensorflow.python.keras.layers.core.Dense at 0x7faeea73b438,
tensorflow.python.keras.layers.core.Dense at 0x7faeea73b710]
ã¢ãžã¥ãŒã« tensorflow.python.keras.engine.sequential.py ã§å®çŸ©ããŠããSequentialã¯ã©ã¹ã§ã¢ãã«ãæ§ç¯ã
æåã®å±€ã¯å
¥åå±€ã§ãã(28Ã28ãã¯ã»ã«ã®ïŒ2次å
é
åããã28Ã28ïŒ784ãã¯ã»ã«ã®ã1次å
é
åã«å€æãããŠããã ãã®ããã§ãã
ãã¯ã»ã«ãïŒæ¬¡å åãããããšããããã¯ãŒã¯ã¯2ã€ã® tf.keras.layers.Dense å±€ãšãªããŸãããããã®å±€ã¯ãå¯çµåãããã¯å šçµåããããã¥ãŒãã³ã®å±€ãšãªããŸããæåã® Dense å±€ã«ã¯ã128åã®ããŒãïŒããã¯ãã¥ãŒãã³ïŒããããŸããæåŸã®å±€ã§ããã2çªãã®å±€ã¯ã10ããŒãã®softmaxå±€ã§ãããã®å±€ã¯ãåèšã1ã«ãªã10åã®ç¢ºçã®é åãè¿ããŸããããããã®ããŒãã¯ãä»èŠãŠããç»åã10åã®ã¯ã©ã¹ã®ã²ãšã€ã²ãšã€ã«å±ãã確çãåºåããŸãã
ãšèšãäºãªã®ã§ãæžç±ããŒãããäœãDeep Learningãã®P113 ãã説æãããŠãã 2 å±€ãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ã©ã¹ TwoLayerNet ã«çžåœããããã§ãã
ãã ãTwoLayerNet ã¯ã©ã¹ã®æŽ»æ§å颿°ã¯sigmoid颿°ã§ãããããã®keras ã®ã·ãŒã±ã³ã·ã£ã«ã¢ãã«ã§ã¯Relu颿°ãæå®ããŠããŸãã
Dense ãå¯éããã(âŠã§)å¯éããŠãå¯åºŠãé«ãããšããæå³ãããå šçµåå±€ã®ããšã®ããã§ãã
ããŒãããäœãDeep LearningãP205
飿¥ããå±€ã®ãã¹ãŠã®ãã¥ãŒãã³éã§çµåããããŸããããããå šçµåïŒfully-connectedïŒãšåŒã³ãç§ãã¡ã¯å šçµåå±€ãAffine ã¬ã€ã€ãšããååã§å®è£ ããŸããã
ã«çžåœããããã§ãã
denseã®ãã©ã¡ãŒã¿
units, åºåã®æ¬¡å
æ°
activation=None, 䜿çšããæŽ»æ§å颿°ïŒæªæå®ãªã掻æ§å颿°ã¯äœ¿çšããªãïŒ
use_bias=True, ãã€ã¢ã¹ã䜿çšãããã©ãã
kernel_initializer='glorot_uniform', éã¿ã®åæå€
bias_initializer='zeros', ãã€ã¢ã¹ã®åæå€
kernel_regularizer=None, éã¿è¡åã«é©çšãããæ£åå颿°
bias_regularizer=None, ãã€ã¢ã¹ã«é©çšãããæ£åå颿°
activity_regularizer=None, ã¬ã€ã€ãŒã®åºåïŒã¢ã¯ãã£ããŒã·ã§ã³ïŒã«é©çšãããæ£åå颿°
kernel_constraint=None, å¶çŽé¢æ°
bias_constraint=None, å¶çŽé¢æ°
**kwargs
掻æ§å颿°
softmax
elu
selu
softplus
softsign
relu
tanh
sigmoid
hard_sigmoid
linear
ååãããã¯ããŒãããäœãDeep Learningãã«èª¬æããã£ããã®ã§ããlinear ã¯P66ã®æç颿°ã®ããšã
éã¿ã®åæå€
glorot_uniform ããã©ã«ãå€
Glorot ã®äžæ§ååžïŒXavier ã®äžæ§ååžïŒã«ããåæåãè¿ããŸãïŒ
Keras Documentationãã
ãã㯠limit ã sqrt(6 / (fan_in + fan_out)) ãšãããšã [limit, -limit] ãç¯å²ãšããäžæ§ååžãšåãã§ãïŒ ããã§ fan_in ã¯å ¥åãŠãããæ°ïŒfant_out ã¯åºåãŠãããæ°ã§ãïŒ
glorot_normal
Glorot ã®æ£èŠååžïŒXavier ã®æ£èŠååžãšïŒã«ããåæåãè¿ããŸã
ããŒãããäœãDeep Learningãp182ã®ãXavier ã®åæå€ã
åå±€ã®ããŒãã®æ°ãn åã®å Žåã$\frac{1}{\sqrt n}$ ãæšæºåå·®ãšããã¬ãŠã¹ååž
he_normal
He ã®æ£èŠååžã«ããåæåãè¿ããŸã
ããŒãããäœãDeep Learningãp184ã®ãHe ã®åæå€ã
åå±€ã®ããŒãã®æ°ãn åã®å Žåã$\sqrt\frac{2}{n}$ ãæšæºåå·®ãšããã¬ãŠã¹ååž
random_normal
æ£èŠååžã«åŸã£ãŠéã¿ãåæåã
æååã§æå®ãããš mean=0.0, stddev=0.05, seed=None ã®èšå®(æšæºåå·®ã0.05ã®ã¬ãŠã¹ååž)ã§åæåããã
ãã©ã¡ãŒã¿ãèšå®ãããå Žåã¯ä»¥äžã®ããã«ã颿°ã§æå®ããã
keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)
ããŒãããäœãDeep LearningãP184
sigmoid 颿°ãtanh 颿°ã¯å·Šå³å¯Ÿç§°ã§äžå€®ä»è¿ãç·åœ¢é¢æ°ãšããŠèŠãªããã®ã§ã
ãXavier ã®åæå€ããé©ããŠããŸããäžæ¹ãReLU ãçšããå Žåã¯ãReLU ã«ç¹åã
ãåæå€ãçšããããšãæšå¥šãããŠããŸããããã¯ãKaiming He ããæšå¥šããåæ
å€ââãã®åããHe ã®åæå€ãã§ãã
model.compileã¡ãœããã§æå®ã§ãããã©ã¡ãŒã¿
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
ã¢ãã«ã®ã³ã³ãã€ã«ã§ã¯ããªããã£ãã€ã¶ã«adamãæå€±é¢æ°ã« sparse_categorical_crossentropy ãæå®ããŠããŸãã
optimizer='rmsprop',ãæé©åãããã©ã«ã㯠rmsprop
loss=None,ããæå€±é¢æ°ã
metrics=None,ãè©äŸ¡é¢æ°
loss_weights=None,
weighted_metrics=None,
run_eagerly=None,
**kwargs
æé©åãoptimizer
SGD
RMSprop
Adagrad
Adadelta
Adam
Adamax
Nadam
TFOptimizer
æå€±é¢æ°ãloss
mean_squared_error
mean_absolute_error
mean_absolute_percentage_error
mean_squared_logarithmic_error
squared_hinge
hinge
categorical_hinge
logcosh
categorical_crossentropy
sparse_categorical_crossentropy
binary_crossentropy
kullback_leibler_divergence
poisson
cosine_proximity
meanïœã¯ååž°åé¡ã§äœ¿ãæå€±é¢æ°
ïœcrossentropyã¯åé¡åé¡ã§äœ¿ãæå€±é¢æ°ã§ãããŒãããäœãDeep LearningãP89ã§èª¬æããŠããŸãã
æ£è§£ã©ãã«ãone-hot 衚çŸã®ãšãã¯categorical_crossentropyã䜿ãã
æŽæ°ã®ç®çå€ã®ãšãã¯sparse_categorical_crossentropyã䜿ãããã§ãã
binary_crossentropy äºå€äº€å·®ãšã³ããã㌠1åºåãšãïŒãã®åºå yâ[0,1]ã®å€ã1/2 ãã倧ãããåŠãã§ã¯ã©ã¹å€å®ãããã
è©äŸ¡é¢æ° metrics
compileã¡ãœããã«æžããŠããã³ã¡ã³ãã«ãããšã
éåžžã
metrics = ['accuracy']ã䜿çšããŸãã
ãšããããšã§ãããŸãã
æååãaccuracyããŸãã¯ãaccããæž¡ããšã
䜿çšããæå€±é¢æ°ãšã¢ãã«ã®åºå圢ç¶ã«åºã¥ããŠããããtf.keras.metrics.BinaryAccuracyã
tf.keras.metrics.CategoricalAccuracyãtf.keras.metrics.SparseCategoricalAccuracy
ã®ããããã«å€æããŸãã
ãšããããšã§ãã
ä»ã«ãmetrics = ['mae'] ãšããæå®ãã§ããããã§ãããããã¯ååž°åé¡çšã§å¹³å絶察誀差(Mean Absolute Error)ãæ±ãããã®ã®ããã§ãã
ãŸããããã«æå€±é¢æ°ã®ååãæå®ããŠããããã«åãããŠé©åãªè©äŸ¡é¢æ°ã«å€æããŠãããããã§ãã
ã§
æååãaccuracyãïœã ïœ
tf.keras.metrics.SparseCategoricalAccuracyã®ããããã«å€æããŸãã
ãšããããã«ãæ¬åœã¯é¢æ°ãã®ãã®ãæå®ãããšããã«ãæååèå¥åã§æå®ããã°å€æããŠãããããšããããšã«ãªã£ãŠããããã§ããããã¯æé©åãæå€±é¢æ°ã§ãåãã§ããæååã§æå®ããã°åãããããããééãããšãå°ãªããªããšæããŸããããã©ã¡ãŒã¿ãããã©ã«ãå€ã«ãªã£ãŠããŸããŸãã
ããšãã°ãoptimizer ã§ 'adam' ãæå®ããå Žåã¢ãžã¥ãŒã« tensorflow.python.keras.optimizer_v2.adam.py ã®ã¯ã©ã¹ Adam ãåŒã³åºããŠãŸããã以äžã®ãã©ã¡ãŒã¿ãããã©ã«ãã§èšå®ãããŠããŸãã
learning_rate=0.001,
beta_1=0.9,
beta_2=0.999,
ããŒãããäœãDeep LearningãP175
Adam ã¯3 ã€ã®ãã€ããŒãã©ã¡ãŒã¿ãèšå®ããŸããã²ãšã€ã¯ããããŸã§ã®åŠç¿ä¿æ°ïŒè«æã§ã¯Î±ãšããŠç»å ŽïŒãåŸã®2 ã€ã¯ãäžæ¬¡ã¢ãŒã¡ã³ãçšã®ä¿æ°Î²1 ãšäºæ¬¡ã¢ãŒã¡ã³ãçšã®ä¿æ°Î²2 ã§ããè«æã«ãããšãæšæºã®èšå®å€ã¯ãβ1 ã¯0.9ãβ2 ã¯0.999 ã§ããããã®èšå®å€ã§ããã°ãå€ãã®å ŽåããŸãããããã§ãã
ãšããããšãªã®ã§ãããã©å€ã§åé¡ãªãããã§ãããããã倿Žãããå Žåã¯é¢æ°ãçŽæ¥æå®ããªããšãããªããªããŸãã
model.compile(optimizer=keras.optimizers.Adam(0.001, 0.9, 0.999),
loss=keras.losses.SparseCategoricalCrossentropy(),
metrics=[keras.metrics.SparseCategoricalAccuracy()])
ã¢ãã«ã®èšç·Ž
model.fit(train_images, train_labels, epochs=5)
model.fit ã¡ãœããã§èšç·ŽïŒåŠç¿ïŒãããŸããèšç·ŽããŒã¿ã®ç»åãšã©ãã«ãæå®ããŠãŸãã
epochs ãšããã¯æ°ãïŒãšæå®ããŠããŸããïŒååŠç¿ãç¹°ãè¿ãããšããããšã§ãå®éã«å®è¡ãããšã以äžã®ããã«ïŒè¡ã®å®è¡çµæã衚瀺ãããŸãã
Epoch 1/5
1875/1875 [==============================] - 2s 1ms/step - loss: 1.5450 - accuracy: 0.6806
Epoch 2/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.7987 - accuracy: 0.8338
Epoch 3/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.5804 - accuracy: 0.8666
Epoch 4/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.4854 - accuracy: 0.8804
Epoch 5/5
1875/1875 [==============================] - 2s 1ms/step - loss: 0.4319 - accuracy: 0.8893
tensorflow.python.keras.callbacks.History at 0x7fd89467f550
fitã¡ãœããã®ãã©ã¡ãŒã¿ã«ã¯ã以äžã®ãã®ããããŸã
x=None,ãèšç·ŽããŒã¿ïŒç»åïŒ
y=None,ãèšç·ŽããŒã¿ïŒã©ãã«ïŒ
batch_size=None,ãããããµã€ãºãïŒåºŠã®ãããã§åŠçããããŒã¿æ°ãããã©ã«ãã¯32
epochs=1,ãåŠç¿ã®åæ°
verbose=1,ããã°åºåã®æå® 0:åºåããªã 1ã2:åºåãã
callbacks=None,
validation_split=0.,
validation_data=None,
shuffle=True,
class_weight=None,
sample_weight=None,
initial_epoch=0,
steps_per_epoch=None,
validation_steps=None,
validation_batch_size=None,
validation_freq=1,
max_queue_size=10,
workers=1,
use_multiprocessing=False
èšç·ŽããŒã¿ã60000ä»¶ãããããµã€ãºã®ããã©ã«ãã32ä»¶ãªã®ã§ã
iter_per_epoch ã€ãã¬ãŒã·ã§ã³æ° 㯠60000 ÷ 32 = 1875
1åã®ãšããã¯ã§ 1875åã®ãããåŠçïŒåŠç¿ïŒããããšãã¹ãŠã®èšç·ŽããŒã¿ãèŠããšããããšã«ãªããŸãã
ãããïŒåç¹°ãè¿ããŠããŸãã
æ£è§£çã®è©äŸ¡
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('\nTest accuracy:', test_acc)
313/313 - 0s - loss: 0.3390 - accuracy: 0.8781
Test accuracy: 0.8780999779701233
model.evaluateã¡ãœããã®ãã©ã¡ãŒã¿
x=None,ããã¹ãããŒã¿ïŒç»åïŒ
y=None,ããã¹ãããŒã¿ïŒã©ãã«ïŒ
batch_size=None,ãããããµã€ãºãããã©ã«ãã¯32
verbose=1,ããã°åºåã®æå® 0:åºåããªã 1ã2:åºåãã
sample_weight=None,
steps=None,
callbacks=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False,
return_dict=False
åŠç¿ããã¢ãã«ã§ããã¹ãããŒã¿ã®æå€±å€ãšæ£è§£çãè¿ã
TensorFlowã®ãµã€ãã§ã¯ããã©ã¡ãŒã¿ã«ã©ããããã®ãããããããããããªãã®ã§ããã¡ãã®ãµã€ããåèã«ããŸããã説æã¯ããŸã²ãšã€è¶³ããŸããããäœãæå®ã§ããããããããŸãã
âKeras Documentation ãKeras API ref
ããã®ïŒïŒâ âãã®ïŒïŒ
ã¡ã¢ã®ç®æ¬¡çã¯ãã¡ããããèªããªãçšèªé