- 投稿日:2020-12-27T17:54:50+09:00
手書き文字を認識する。
こんにちはまさです。
Qiita初投稿ですよろしくお願いします。
画像認識の定番mnistを使っての画像認識をしてみました。↓以下の記事を参考に手書き画像の分類をしました。
はじめてのニューラルネットワーク:分類問題の初歩
https://www.tensorflow.org/tutorials/keras/classification?hl=jaまずTensorflow、numpy、matplotlibをインポートします。
import tensorflow as tf from tensorflow import keras import numpy as np import matplotlib.pyplot as plt from tensorflow.keras.datasets import mnistデータセットにはクラス名が保存されていないため、クラス名を保存しておきます。
class_names = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']画像手書き画像のmnistをロードします。
(train_images,train_labels),(test_images,test_labels)= mnist.load_data()画像が正しくインポートされているかを確認します。
plt.figure() plt.imshow(train_images[0],plt.cm.binary) plt.colorbar() plt.show()先頭の25個分の画像を5*5で表示させてみます。
plt.figure(figsize=(10,10)) for i in range(25): plt.subplot(5,5,i+1) plt.imshow(train_images[i],cmap=plt.cm.binary) plt.xlabel(class_names[train_labels[i]]) plt.show()データの前処理を行います。
ニューラルネットワークにデータを投入する前に、これらの値を0から1までの範囲にスケールするため、画素の値を255で割ります。train_images = train_images / 255.0 test_images = test_images / 255.0モデルの構築をします。今回のニューラルネットワークは2層で構築します。
model=keras.Sequential([ keras.layers.Flatten(input_shape=(28,28)), keras.layers.Dense(128,activation='relu'), keras.layers.Dense(10,activation='softmax') ])モデルをコンパイルします。
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])モデルを学習させます。
model.fit(train_images,train_labels,epochs=5)モデルを評価します。
test_loss,test_acc=model.evaluate(test_images,test_labels,verbose=2) print('¥nTest accuracy:',test_acc)モデルを予測します。
predictions = model.predict(test_images)10チャンネル全てグラフ化する。そのために定義します。
def plot_image(i, predictions_array, true_label, img): predictions_array, true_label, img = predictions_array[i], true_label[i], img[i] plt.grid(False) plt.xticks([]) plt.yticks([]) plt.imshow(img, cmap=plt.cm.binary) predicted_label = np.argmax(predictions_array) if predicted_label == true_label: color = 'blue' else: color = 'red' plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label], 100*np.max(predictions_array), class_names[true_label]), color=color) def plot_value_array(i, predictions_array, true_label): predictions_array, true_label = predictions_array[i], true_label[i] plt.grid(False) plt.xticks([]) plt.yticks([]) thisplot = plt.bar(range(10), predictions_array, color="#777777") plt.ylim([0, 1]) predicted_label = np.argmax(predictions_array) thisplot[predicted_label].set_color('red') thisplot[true_label].set_color('blue')予測の中のいくつかの画像を、予測値とともに表示する。正しい予測は青で表示します。数字は予測したラベルのパーセント(100分率)を示します。
# X個のテスト画像、予測されたラベル、正解ラベルを表示します。 # 正しい予測は青で、間違った予測は赤で表示しています。 num_rows = 5 num_cols = 3 num_images = num_rows*num_cols plt.figure(figsize=(2*2*num_cols, 2*num_rows)) for i in range(num_images): plt.subplot(num_rows, 2*num_cols, 2*i+1) plot_image(i, predictions, test_labels, test_images) plt.subplot(num_rows, 2*num_cols, 2*i+2) plot_value_array(i, predictions, test_labels) plt.show()全ての手書き数字画像を正しく予測することができました。
- 投稿日:2020-12-27T11:16:13+09:00
Ubuntu 18.04.5 LTSでNVIDIA-driver(GeForce RTX 2070 SUPER), cuda 10.0, cudnn 7.4.2の設定(tensorflow-gpu:2.0.0版)
はじめに
今回tensorflowでGPUを使えるようにセットアップしたのでメモとして残しておきます。まあまあ手こずりました。。。困っている方の参考になれば幸いです。
環境
- ubuntu : 18.04.5 LTS
- Graphics: GeForce RTX 2070 SUPER
- nvidia-driver: 455.45.01
- cuda: 10.0
- cudnn: 7.4.2
- tensorflow-gpu : 2.0.0
手順
最初は、ドライバのインストールをしてcuda, cudnnのインストールを進めていく方向でした。nvidiaのドライバをインストールしてからcuda(10.0 or 10.1)をインストールするとドライバが認識しなくなる問題に当たりました。今回cudaを10.0か10.1にした理由は、tensorflowでgpuを動かしたく、ビルド確認済みの最新が10.0か10.1あたりだったからです。
ですので、cudaをインストールしてnvidia-driverをインストールする順番です。しかし、またここで上手くいかず、、、。この順番でnvidia-driverをインストールしてから再起動するとマウスとキーボードが使えなくて。。
結局私が行ったことは、
➀ nvidia-driverインストール
➁ 一旦nvidia-driverを消す
➂ cudaのインストール
➃ nvidia-driverを再度インストール
➄ cudnnのインストールとなります。絶対簡単な方法がありそうですが今回はこれでとりあえずできました。
1. NVIDIA-driverをインストールする前に
vimのインストール(個人的にvimを使いたいので)
$ sudo apt upgrade $ sudo apt update $ sudo apt install vimvimでjjを使いたいので、~/.vimrcの編集をします。
$ vim ~/.vimrc~/.vimrcset number inoremap<silent> jj <ESC>(1) Nouveauの無効化
まずは、Nouveauの無効化をします。
Nvidiaのグラフィックカードの時だと、Nouveauというドライバがデフォで設定されているのでNouveauをブラックリストに登録します。ブラックリストの作成
$ sudo vim /etc/modprobe.d/blacklist-nouveau.conf/etc/modprobe.d/blacklist-nouveau.confblacklist nouveau options nouveau modeset=0以下のコマンドを実行し、nouveauが無効化になっていることを確認
ディスプレイの解像度が落ちていればOK
$ sudo update-initramfs -u $ sudo reboot(2)カーネルの固定
nvidiaのドライバーをカーネルのバージョンを固定しないでいると、アップグレードとかしたときにドライバとの依存関係が崩れることがあるようです。なので、カーネルの固定をします。
aptitudeのインストール
$ sudo apt install aptitudeカーネルバージョンの確認
$ aptitude show linux-generic上記で確認した内容を以下のファイルに書き込む(versionのところだけ書き換え)
$ cd /etc/apt/preferences.d $ sudo vim linux-kernel.preflinux-kernel.prefPackage: linux-generic Pin: version 4.15.0.128.115 Pin-Priority: 1001 Package: linux-headers-generic Pin: version 4.15.0.128.115 Pin-Priority: 1001 Package: linux-image-generic Pin: version 4.15.0.128.115 Pin-Priority: 1001カーネルの固定は以上です。
2. NDIVIAドライバのインストール
nouveauが無効化されているか確認
$ lsmod | grep -i nouveaugccやmakeなど開発に必要なツールをまとめてインストール
$ sudo apt install build-essentialリポジトリの追加
$ sudo add-apt-repository ppa:graphics-drivers/ppa $ sudo apt updateインストール可能なデバイスが表示
$ ubuntu-drivers devicesインストールしたいドライバを選択し、インストール
$ sudo apt install nvidia-driver-455 $ sudo rebootドライバがインストールされたか確認
$ nvidia-smi3. NVIDIAドライバの削除
インストールされているnvidiaドライバの確認。(全て消します)
$ dpkg -l | grep nvidia-*削除
$ sudo apt-get --purge remove nvidia-* $ sudo apt-get --purge remove libnvidia-* $ sudo apt-get --purge remove libnvidia-compute-455:i386 $ sudo apt-get --purge remove libnvidia-fbc1-455:i386以下のコマンドで何も表示されなければokayです
$ dpkg -l | grep nvidia4. CUDAのインストール
こちらからCUDAをインストールしてください。tensorflowの場合はversionが厳しいのでしっかりと対応表で確認してください。
$ sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb $ sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub $ sudo apt-get update $ sudo apt-get install cuda~/.bashrcにPATHを通す
~/.bashrcexport PATH="/usr/local/cuda-10.0/bin:$PATH" export LD_LIBRARY_PATH="/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH"$ source ~/.bashrc*CUDAをインストールした際にNVIDIAドライバがインストールされてしまうので削除します。(この場合だと410がインストールされていました)
$ sudo apt-get --purge remove nvidia-* $ sudo apt-get --purge remove libnvidia-* $ sudo apt-get --purge remove libnvidia-compute--410:i386 $ sudo apt-get --purge remove libnvidia-fbc1-410:i386以下のコマンドで何も表示されなければ大丈夫です
$ dpkg -l | grep nvidia*5.NVIDIAドライバのインストール
やっとここでnvidiaのドライバをインストールします
$ sudo apt install nvidia-driver-455 $ sudo rebootドライバとCUDAの確認
$ nvidia-smi $ nvcc -V
nvidia-smi
でCUDAのところが11.1
のように表示されますが、nvcc -V
で表示されるバージョンが実際のバージョンなんで気をつけてください。(とてもややこしくてここでもつまずきました、、、)6. cudnnのインストール
cudnnのインストールには、登録が必要です。
CUDAのバージョンに適したcudnnをダウンロードしてください。
cudnnのインストールはこちらから$ sudo dpkg -i libcudnn7_7.4.2.24-1+cuda10.0_amd64.deb $ sudo dpkg -i libcudnn7-dev_7.4.2.24-1+cuda10.0_amd64.deb $ sudo dpkg -i libcudnn7-doc_7.4.2.24-1+cuda10.0_amd64.deb $ tar xvf cudnn-10.0-linux-x64-v7.4.2.24.tgz $ sudo cp -a cuda/include/cudnn.h /usr/local/cuda/include/ $ sudo cp -a cuda/lib64/libcudnn* /usr/local/cuda/lib64/ $ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn* $ sudo reboot確認
$ cp -r /usr/src/cudnn_samples_v7/ $HOME $ cd $HOME/cudnn_samples_v7/mnistCUDNN $ make clean && make $ ./mnistCUDNN
Test passed!
と表示されればOK+α
Tensorflowのインストール
pipでインストールできます
$ pip install tensorflow-gpu==2.0.0GPUが使用可能か確認
このコマンドでは、認識しているCPU,GPUが表示されます
from tensorflow.python.client import device_lib device_lib.list_local_devices()以下のコマンドで、TRUEが表示されればokayです
import tensorflow as tf tf.test.is_gpu_available()DockerによるGPU設定
Dockerを用いてGPUを設定する方法があるようです。まだ試したことはありませんが、、こっちの方が楽にできそう。
終わりに
やっぱりtensorflowのGPU設定はめんどくさいですね、、、。
今後やる人の参考になればと思います。