2019年8月27日 星期二

[ 文章收集 ] Docker 無法移除死掉的 Container 修復

Source From Here 
Question 
Docker 遇到 container 的狀態是 Dead,想要移除卻無法移除,該怎麼做? 
$ docker ps -a
CONTAINER ID STATUS
11667ef16239
 Dead

Docker 無法移除死掉的 Container 修復 
Docker 都是 mount storage 在 /var/lib/docker,所以可以直接在 /var/lib/docker/ 的 containers 、volumes 找到 container id,然後來做 umount 或 rm -fr 的動作。此篇文章有提到幾種解法:Docker - Cannot remove dead container,下述整理自此篇: 

方法1 
這個方法直接移除檔案系統上的 image/container 資料夾: 
# ls /var/lib/docker/
containers image network overlay2 plugins swarm tmp trust volumes

# ls /var/lib/docker/containers/
549d87f7c6543c31510ec3301772574377e11f1b59b4004d54a91891ec45c755

# ds -aq
549d87f7c654

// 刪除 container id=549d87f7c654 
# sudo rm -rf /var/lib/docker/containers/549d87f7c654.../

方法2 
遇到: 
Error response from daemon: Cannot destroy container elated_wozniak:
Driver devicemapper failed to remove root filesystem 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3: Device is Busy

找到 mount 的 location 後 umount 它 再移除. 

方法3 
$ docker rm $(docker ps --all -q -f status=dead) # 將 DEAD 的 container 移除

Docker 1.13 後,可以採用下述作法: 
$ docker system df # 秀出目前使用的空間
$ docker system prune # 移除所有未使用的資料

方法4 
此方法用在 /var/lib/docker 裡面找不到 container id,於是建立起來讓程式刪除 
# mkdir /var/lib/docker/devicemapper/mnt/656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3
# mkdir /var/lib/docker/devicemapper/mnt/656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3-init
# docker rm 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3

docker rm 若刪不到資料,可能是建立起來就自動被刪掉了

[ ML 文章收集 ] Ch9 - 使用 Scikit-Learn 調用 Keras 的模型

Source From Here 
Preface 
scikit-learn 是最受歡迎的 Python 的機器學習庫本章我們將使用 scikit-learn 調用 Keras 生成的模型. 本章將: 
* 使用 scikit-learn 封裝 Keras 的模型
* 使用 scikit-learn 對 Keras 的模型進行交叉驗證
* 使用 scikit-learn,利用網格搜索調整 Keras 模型的 Hyperparameter


Introduction 
Keras 在深度學習很受歡迎,但是只能做深度學習:Keras 是最小化的深度學習庫,目標在於快速搭建深度學習模型基於 SciPy 的 scikit-learn,數值運算效率很高,適用於普遍的機器學習任務,提供很多機器學習工具,包括但不限於: 
* 使用 K-Fold Cross validation
* Grid Search for hyperparameter

Keras 為 scikit-learn 了封裝 KerasClassifier
keras.wrappers.scikit_learn.KerasClassifier(build_fn=None, **sk_params): which implements the Scikit-Learn classifier interface,
keras.wrappers.scikit_learn.KerasRegressor(build_fn=None, **sk_params): which implements the Scikit-Learn regressor interface.


使用 Cross Validation 驗證深度學習模型 
Keras 的 KerasClassifier 與 KerasRegressor 兩個類接受 build_fn 參數,傳入函數用以建立模型; 接著我們加入 epochs=150 與 batch_size=10 這兩個參數:這兩個參數會傳入模型的 fit()。方法我們用 scikit-learn 的 StratifiedKFold 類進行 10-Fold Cross validation,測試模型在未知數據的性能,使用並 cross_val_score() 函數檢測模型,打印結果: 
train.py 
  1. #!/usr/bin/env python  
  2. # MLP for Pima Indians Dataset with 10-fold cross validation via sklearn  
  3. from keras.models import Sequential  
  4. from keras.layers import Dense  
  5. from keras.wrappers.scikit_learn import KerasClassifier  
  6. from sklearn.model_selection import StratifiedKFold  
  7. from sklearn.model_selection import cross_val_score  
  8. import numpy  
  9. import pandas  
  10. # Function to create model, required for KerasClassifier  
  11. def create_model():  
  12.     # create model  
  13.     model = Sequential()  
  14.     model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))  
  15.     model.add(Dense(8, init='uniform', activation='relu'))  
  16.     model.add(Dense(1, init='uniform', activation='sigmoid'))  
  17.     # Compile model  
  18.     model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])  
  19.     return model  
  20.   
  21. # fix random seed for reproducibility  
  22. seed = 7  
  23. numpy.random.seed(seed)  
  24.   
  25. # load pima indians dataset  
  26. dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")  
  27.   
  28. # split into input (X) and output (Y) variables  
  29. X = dataset[:,0:8]  
  30. Y = dataset[:,8]  
  31.   
  32. # create model  
  33. model = KerasClassifier(build_fn=create_model, epochs=150, batch_size=10)  
  34.   
  35. # evaluate using 10-fold cross validation  
  36. kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)  
  37. results = cross_val_score(model, X, Y, cv=kfold)  
  38. print(results.mean())  
Notes. The dataset "pima-indians-diabetes.csv" can be downloaded here

每輪訓練會輸出一次結果,加上最終的平均性能: 
...
Epoch 146/150
692/692 [==============================] - 0s 67us/step - loss: 0.4750 - acc: 0.7717
Epoch 147/150
692/692 [==============================] - 0s 66us/step - loss: 0.4763 - acc: 0.7803
Epoch 148/150
692/692 [==============================] - 0s 66us/step - loss: 0.4776 - acc: 0.7688
Epoch 149/150
692/692 [==============================] - 0s 66us/step - loss: 0.4773 - acc: 0.7673
Epoch 150/150
692/692 [==============================] - 0s 66us/step - loss: 0.4774 - acc: 0.7702
76/76 [==============================] - 0s 2ms/step
0.7408578287970505

比起手工測試,使用 scikit-learn 容易的多。 

使用 GridSearch 調整深度學習模型的參數 
使用 scikit-learn 封裝 Keras 的模型十分簡單, 進一步想:我們可以給 fit() 方法傳入參數,KerasClassifier 的 build_fn 方法也可以傳入參數可以利用這點進一步調整模型。我們可以用 GridSearch 測試不同參數的性能:create_model() 函數可以傳入optimizer:init 參數,雖然都有默認值, 但我們可以用不同的優化算法和初始權優化網絡. 具體來說, 我們希望搜索: 
* 優化算法:搜索權重的方法
* 初始權重:初始化不同的網絡
* 訓練次數:對模型訓練的次數
* 批次大小:每次訓練的數據量

所有的參數組成一個字典,傳入 scikit-learn 的 GridSearchCV 類GridSearchCV 類 會對每組參數(2×3×3×3)進行訓練,進行 3-Fold Cross validation. 這樣做的計算量巨大! 耗時巨長如果模型小還可以取一部分數據試試看,因為這裡的 數據集 與 網絡 都不大(1000 個 數據內,9個參數)所以可以在可接受時間下輸出最好的參數和模型,以及平均值: 
train_gs.py 
  1. #!/usr/bin/env python  
  2. # MLP for Pima Indians Dataset with grid search via sklearn  
  3. from keras.models import Sequential  
  4. from keras.layers import Dense  
  5. from keras.wrappers.scikit_learn import KerasClassifier  
  6. from sklearn.model_selection import GridSearchCV  
  7. import numpy  
  8. import pandas  
  9.   
  10. # Function to create model, required for KerasClassifier  
  11. def create_model(optimizer='rmsprop', init='glorot_uniform'):  
  12.     # create model  
  13.     model = Sequential()  
  14.     model.add(Dense(12, input_dim=8, init=init, activation='relu'))  
  15.     model.add(Dense(8, init=init, activation='relu'))  
  16.     model.add(Dense(1, init=init, activation='sigmoid'))  
  17.   
  18.     # Compile model  
  19.     model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])  
  20.     return model  
  21.   
  22. # fix random seed for reproducibility  
  23. seed = 7  
  24. numpy.random.seed(seed)  
  25.   
  26. # load pima indians dataset  
  27. dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")  
  28.   
  29. # split into input (X) and output (Y) variables  
  30. X = dataset[:,0:8]  
  31. Y = dataset[:,8]  
  32.   
  33. # create model  
  34. model = KerasClassifier(build_fn=create_model)  
  35.   
  36. # grid search epochs, batch size and optimizer  
  37. optimizers = ['rmsprop''adam']  
  38. init = ['glorot_uniform''normal''uniform']  
  39. epochs = numpy.array([50100150])  
  40. batches = numpy.array([51020])  
  41. param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init)  
  42. grid = GridSearchCV(estimator=model, param_grid=param_grid)  
  43. grid_result = grid.fit(X, Y)  
  44.   
  45. # summarize results  
  46. print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))  
  47.   
  48. best_model = grid.best_estimator_  
  49. print('Best model={}'.format(best_model.__class__))  
用 CPU 差不多要 5分鐘,結果如下我們發現使用均勻分佈初始化。RMSPro 優化算法,150 epochs,batch size 為 5 時效果最好,正確率約 75%: 

Supplement 
Keras Doc - Wrappers for the Scikit-Learn API 
Ch10 - 多類花朵分類 (iris dataset) 
ML CheatSheet - Optimizer

[ Py DS ] Ch5 - Machine Learning (Part2)

Source From  Here   Introducing Scikit-Learn   There are several Python libraries that provide solid implementations of a range of machin...