66284


Dockerを使って3種類の花の判別プログラム(.py)を作成しています。  
プログラムを実行して8回のトレーニングを行いましたが、なぜかトレーニングうまくできませんでした。  
これが学習の結果です。

[![](https://i.stack.imgur.com/I5IUR.png)](https://i.stack.imgur.com/I5IUR.png)

lossもaccも一定の数値のままででした。

試しに、Dockerを使わずにそのままPythonプログラムを実行してみました。

[![](https://i.stack.imgur.com/dYS5X.png)](https://i.stack.imgur.com/dYS5X.png)

トレーニングがうまく機能しました。

つまり、Dockerで機械学習を行うとなぜがトレーニングがうまくいかない現象が起きてしまいます。

私の予想では、DockerのメモリやCPUの設定が機械学習と合わなかったのではないかと考えました。Dockerで使用できるメモリやCPUを何らかの方法で増やせばいいのかと思っています。

どなたか解決方法やアドバイスをいただきたいです。

## 仕様スペック

・windows10  
・Docker Toolbox  
・Python3.7.3

## ソースコード

[code]

    import sys
    import os
    import numpy as np
    import pandas as pd
    import gc
    from keras.models import Sequential
    from keras.layers import Convolution2D, MaxPooling2D
    from keras.layers import Activation, Dropout, Flatten, Dense
    from keras.utils import np_utils
    
    from mutagen.mp3 import MP3 as mp3
    import pygame
    import time
    
    import matplotlib.pyplot as plt
    
    from keras.backend import tensorflow_backend as backend
    
    from keras.callbacks import EarlyStopping
    from keras.optimizers import Adam
    import cv2
    #
    # モデルを生成
    #
    class TrainModel :
      def __init__(self):
        input_dir = './Gazo'
        self.nb_classes = len([name for name in os.listdir(input_dir) if name != ".DS_Store"])
        x_train, x_test, y_train, y_test = np.load("./Gakushu.npy")
        # データを正規化する
        self.x_train = x_train.astype("float") / 256
        self.x_test = x_test.astype("float") / 256
        self.y_train = np_utils.to_categorical(y_train, self.nb_classes)
        self.y_test = np_utils.to_categorical(y_test, self.nb_classes)
    
      def train(self, input=None) :
        model = Sequential()
        # K=32, M=3, H=3
        if input == None :
          model.add(Convolution2D(32, 3, 3, border_mode='same', input_shape=self.x_train.shape[1:]))
        else :
          model.add(Convolution2D(32, 3, 3, border_mode='same', input_shape=input))
    
        # K=64, M=3, H=3（調整）
        model.add(Activation('relu'))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Dropout(0.25))
        model.add(Convolution2D(64, 3, 3, border_mode='same'))
        model.add(Activation('relu'))
        # K=64, M=3, H=3（調整）
        model.add(Convolution2D(64, 3, 3))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Dropout(0.25))
        model.add(Flatten())
        model.add(Dense(512))
        # biases  nb_classes
        model.add(Activation('relu'))
        model.add(Dropout(0.5))
        model.add(Dense(self.nb_classes))
        model.add(Activation('softmax'))
    
        model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
        if input == None :
          # 学習してモデルを保存
          #model.fit(self.x_train, self.y_train, batch_size=32, nb_epoch=10)
          fit = model.fit(self.x_train, self.y_train, batch_size=32, nb_epoch=8, validation_data=(self.x_test,self.y_test))
          fig, (axL, axR) = plt.subplots(ncols=2, figsize=(10,4))
    
          axL.plot(fit.history['val_loss'],label="loss for validation")
          axL.set_title('model loss')
          axL.set_xlabel('epoch')
          axL.set_ylabel('loss')
          axL.legend(loc='upper right')
    
          #axR.plot(fit.history['acc'],label="loss for training")
          axR.plot(fit.history['val_acc'],label="acc for validation")
          axR.set_title('model accuracy')
          axR.set_xlabel('epoch')
          axR.set_ylabel('accuracy')
          axR.legend(loc='upper right')
    
          fig.savefig('./Wao.png') #グラフの画像が保存される
          plt.close()
    
          hdf5_file = "./AImodel.hdf5"
          model.save_weights(hdf5_file)
    
          # modelのテスト
          score = model.evaluate(self.x_test, self.y_test, verbose = 0)
          print('loss=', score[0])
          print('accuracy=', score[1])
          img = cv2.imread('./Wao.png')
          cv2.imshow('精度と損失', img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
        return model
    
    if __name__ == "__main__":
      args = sys.argv
      train = TrainModel()
      train.train()
      gc.collect()
    
[/code]

## Dockerfile

[code]

    FROM python:3.7.3
    WORKDIR /app
    COPY T_test.py /app/
    RUN apt-get update && apt-get install -y vim && apt-get install -y curl
    RUN pip install icrawler==0.6.2 Keras==2.2.4 numpy==1.16.2 opencv-python==4.1.1.26 pandas==0.25.1 Pillow==6.1.0 pygame==1.9.6 scikit-learn==0.21.3 tensorflow==1.13.1 mutagen==1.42.0 matplotlib==3.1.1
    EXPOSE 4226
    
[/code]


CC BY-SA 4.0
2020-05-04T04:58:22.897
66271
2020-05-04T12:09:10.927
2020-05-04T12:09:10.927
37702
37702
question
python docker 機械学習 深層学習
Dockerを使った機械学習のトレーニング精度を良くしたい


Docker Desktop
を使用している場合、タスクトレイのアイコンを右クリックして「Settings」を開き、「Advanced」でCPUやメモリの割当量を調整することができます。


CC BY-SA 4.0
2020-05-04T11:05:23.963
66284
2020-05-04T11:05:23.963
3060
66271
answer