20201227のTensorFlowに関する記事は2件です。

手書き文字を認識する。

こんにちはまさです。
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()

画像が表示されることを確認します。
image.png

先頭の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()

実際に表示された画像がこちら
image.png

データの前処理を行います。
ニューラルネットワークにデータを投入する前に、これらの値を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()

予想された画像
image.png

全ての手書き数字画像を正しく予測することができました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 vim

vimでjjを使いたいので、~/.vimrcの編集をします。

$ vim ~/.vimrc
~/.vimrc
set number
inoremap<silent> jj <ESC>

(1) Nouveauの無効化

まずは、Nouveauの無効化をします。
Nvidiaのグラフィックカードの時だと、Nouveauというドライバがデフォで設定されているのでNouveauをブラックリストに登録します。

ブラックリストの作成

$ sudo vim /etc/modprobe.d/blacklist-nouveau.conf
/etc/modprobe.d/blacklist-nouveau.conf
blacklist 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.pref
linux-kernel.pref
Package: 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 nouveau

gccや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-smi

3. 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 nvidia

4. 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を通す

~/.bashrc
export 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.0

GPUが使用可能か確認

このコマンドでは、認識している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設定はめんどくさいですね、、、。
今後やる人の参考になればと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む