機械学習 & ディープラーニング入門(Python編)[Lesson 2]

機械学習 & ディープラーニング入門(Python編)[Lesson 2]

モジュール ― Python基礎文法入門

2019年2月4日

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は、プログラムの1行目に記載されることが多い、モジュールのインポートや、そのモジュールを含むライブラリのインストールについて説明する。

一色政彦 デジタルアドバンテージ 一色 政彦

 前回はPythonの「バージョン」について解説した。今回から、いよいよ文法の説明に入る。脚注や図、コードリストの番号は前回からの続き番号としている。

 なお、説明する順序は、前回掲載した図1-a(下に再掲)の1行目から順に、である。つまり、実際にライブラリ「TensorFlow」でディープラーニングのコードを書く流れに沿って、基礎文法が学んでいけるように目次を構成している。

図1-a【再掲】 TensorFlowの公式チュートリアルのサンプルコード(1)
図1-a【再掲】 TensorFlowの公式チュートリアルのサンプルコード(1)

 今回、本稿で説明するのは、図1-a【再掲】における赤枠内のコードのみとなる。

 本稿で示すサンプルコードの実行環境については、Lesson 1を一読してほしい。

 Lesson 1でも示したように、本連載のすべてのサンプルコードは、下記のリンク先で実行もしくは参照できる。

Google Colabで実行する
GitHubでソースコードを見る

Python言語の基礎文法

 まずは「モジュール」という概念について見ていこう。

モジュールのインポート

 まず、図1-a【再掲】の1行目のコードは、次のリスト1のようになっている。

Python
import tensorflow as tf
リスト1 モジュールをインポートするコード例

 コードの意味は少し後で説明するとして、まずはノートブックでこのコードを実行してみよう。なお、リスト1のコードの場合、実行しても、図3のように何も表示されないので注意してほしい。

 実行するには、リスト1のコードを、Google Colab(もしくはJupyter Notebook)で作成したノートブックのコードセルに記入し、AltEnterキーを押せばよい(このショートカットキーは、セルを実行して、新しいコードセルを現在のセルの直下に挿入するためのもの。新しいコードセルの挿入が不要な場合はShiftEnterキーを押せばよい)。ちなみに、今後の連載内のすべてのコードリストは、このように、ノートブックのコードセルで実行できるようにしているので、ぜひ手を動かしながら読み進めていってほしい。

コードセルの実行
図3 コードセルの実行

 それではコードの意味について説明していこう。

 1つ目の単語importは、インポート(導入)することを命令するための、Python言語の定義済みキーワードである。

 では、何をimportするかというと、モジュールである。モジュールModule)とは、直訳すると「機能的にまとまった基本単位」という意味になる。つまりモジュールとは、(関連性のある)機能の集まりのことである。

 よってimport tensorflowは、「tensorflowというモジュール(機能の集まり)をインポートする」という意味のコードになる。この2つの単語をまとめてimport文と呼ぶ。

 この2単語だけで、import文は完了できるのだが、その後、as tfというコード(詳細後述)がくっついており、このサンプルコードではimport tensorflow as tfがまとめてimport文となる。

 では、このas tfは何か?

 asは、英語なら「~として」などと訳すが、Python言語のimport文でもそれと同じような意味合いを持つ構文となっており、as tfで「tfという名前として」という意味のコードとなる。as tfのようにstatement)に付随する関連情報はclause)と呼ばれるので、1行目の文は「as節を伴うimport文」ということになる。

 まとめると、import tensorflow as tfというコードは、「tfという名前としてtensorflowモジュールをインポートする」という意味のコード(文)になる、というわけだ。

 なお、Pythonでは「1行に1文のみを記載する」という基本ルールがある。改行によって、その行の1文の終了を指示する仕様である。これはPython言語特有の最も基本的なルールの一つなので覚えておいてほしい。

【応用テクニック】1文を複数行にする方法

 「1行=1文」が基本だが、特に「長すぎる文を、複数行に分けて見やすくする」といった用途のために、「複数行=1文」で記述できる応用テクニックも存在する。せっかくなので、これについても併せて紹介しておこう。

 具体的には、改行の前に\を入れると、「次行へ文が継続している」と見なされる。例えばリストex1は、as tfの前で改行し、その改行の前に\を入れている。

Python
import tensorflow \
    as tf
リストex1 応用テクニック: 複数行の文を記述する例

 そのため、この2行のコードは、import tensorflow     as tfという1つの文と見なされている(ちなみに、左記のコードにある半角スペースの数は、リストex1にある半角スペースの数を忠実に再現している。そうした理由は下記の注意書きを参考にしてほしい)。

 注意点として、Pythonでは「インデント(=左端に作る余白)をそろえる」という基本ルールが非常に重要になるのだが(Lesson 8で解説)、リストex1のtensorflowasの間は「改行ではない」と見なされているため、そういったインデントのルールが適用されない。

 文内の単語間のスペースの数は、何個あっても問題にならないので、as tfの前に意図的に4個スペースを入れることで、tensorflowtfの単語の開始位置をそろえて見やすくしている。こういった、見やすさを意識したコードの書き方も行える。

 以上で1行目のコードが読めるようになったはずだ*2

  • *2 【アドバイス】ここまではそれほど難しくないので、大丈夫と思うが、読み進めるうちにプログラミングの専門用語を忘れて混乱しやすいので、例えば「モジュール」の意味など、1つ1つ着実に押さえて覚えながら、読み進めてほしい。

配布用プロジェクトとモジュール

 ところで、先ほどの構文解説では、さらっと「tensorflowモジュール」と当たり前のように書いたが、「そのモジュールが一体どこから来た何者なのか、よく分からない」と思った人も少なくないのではないだろうか。そこで次に、tensorflowモジュールの出自や中身について説明しておこう。

 このtensorflowモジュールは、Python言語に標準で含まれているものではない。ディープラーニング用のライブラリ「TensorFlow」は、PyPI(「パイ・ピー・アイ」と読む)というサイトのプロジェクトproject)という形でオープンに公開・配布されており、その配布物の中にtensorflowモジュールが含まれているのだ(図4)。

図4 配布用プロジェクトとモジュールの関係

 ちなみにPyPIとは「Python Package Index」のこと、つまり「Pythonパッケージ(=配布用プロジェクト)のインデックス(索引)」を意味している。「索引」と言えるほど、TensorFlowを含め、多数のオープンなライブラリがPyPIに登録されている。Python開発者なら、必ずお世話になっているサイトである。

 PyPIのプロジェクトは「パッケージ」とよく表現されるが、Python言語の仕様にも「パッケージ」という同名の機能があり、紛らわしい。誤解を避けるために、本連載では、PyPIのプロジェクトは「配布用プロジェクト」としか呼ばないようにする。本連載内で「パッケージ」と表記されている場合は、常にPython言語仕様の方を指すこととする。

 なお、Python言語仕様におけるパッケージPackage)とは、複数のモジュールをまとめたフォルダーのような機能である。具体的にどのようにまとめているかは、後述の「モジュールの利用と定義」で見ていくとして、実はtensorflowモジュールも、厳密には複数のモジュールをまとめた「パッケージ」である。というのも、パッケージは「モジュール」としてインポートできるので、先ほどはインポート後を指して「tensorflowモジュール」と表現した。細かく気にする必要はないが、「モジュール」と表記されている場合には、元々は「パッケージ」である可能性があると、知っておいてほしい。モジュールについて詳しくは本稿末尾のコラムも参照してほしい。

配布用プロジェクトのインストール

 さて、PyPIで配布されているプロジェクトをPythonプログラム内で使うには、それぞれ各自の環境にインストールしなくてはならない。

 ただし、ライブラリ「TensorFlow」がグーグル純正ということもあり、Google Colab(=本連載が想定する実行環境)には最初からインストール済みなので、今回は「インストールなし」で利用できる。

 通常のJupyter Notebookなど、TensorFlowが未インストールの環境であれば、コードセルに次のシェル(=OSのコマンドライン実行環境)コマンドを入力して、明示的にインストールする必要があるので注意してほしい。なお当然ながら、まずは「配布用プロジェクトのインストール」をしてから「モジュールのインポート」をするという順序になるため、リスト2のコードは、現実的には、リスト1よりも前に実行しておく必要がある点に注意してほしい。

Python
!pip install tensorflow
リスト2 配布用プロジェクト「tensorflow」をインストールするためのシェルコマンド

 このコードの意味について説明しよう。

 先頭にある!は、コードセル内のコードを、Pythonコードではなくシェルコマンド(=ターミナル/コマンドプロンプト用のコマンド)として実行するための、Jupyter Notebook系環境の特殊記法である。このようにGoogle ColabやJupyter Notebookでは、!で任意のシェルコマンドが実行できる。特にライブラリ(=配布用プロジェクト)インストールの目的でよく使う書き方なので覚えておいてほしい。

 次のpipコマンドは、PyPIの配布用プロジェクトに関連する操作を実現するためのものである。その次にあるinstallを付けると、PyPIの配布用プロジェクトのインストールを命令することになる。

 まとめると、pip install tensorflowで「PyPIの配布用プロジェクト『tensorflow』をインストールする」という意味のシェルコマンドとなる。

 以上で、図1-a【再掲】の1行目の文が、インストール済みの配布用プロジェクト「tensorflow」に含まれるtensorflowモジュールをtfという名前でインポートする、という意味だと、より正確に理解できた。「配布用プロジェクト『tensorflow』のインストール」と「tensorflowモジュールのインポート」によって、TensorFlowがPythonプログラム内で使えるようになった。

モジュールの利用と定義

 次に、図1-a【再掲】の2行目のコードを見てみると、リスト3のようになっている。

Python
mnist = tf.keras.datasets.mnist
リスト3-1 モジュールを利用するコード例

 mnist = tf.keras.datasets.mnistというコードは、「左辺 = 右辺」という構文が使われている(=の前後にある半角スペースはあってもなくてもよい)。この構文の意味についてはLesson 4で詳しく説明するが、今回は右辺のtf.keras.datasets.mnistというコードがどういう意味なのかを説明しよう。

 気付いただろうか。先ほどtfという名前でモジュールをインポートしたが、tf.keras.datasets.mnisttfは、そのインポート済みモジュールのことである。

 tf.……と、tfの後に.が続いている。この、

<モジュール名>.

という構文は「<モジュール階層>の中の」を意味する。要するに、あるモジュール階層下のものを利用したい場合には、.で連結して利用対象を記述すればよいのである。例えばリスト3-1のようにtf.keras.datasets.mnistと記述した場合は、

  • tf.: 「tf<モジュール階層>の中の」
    • keras.: 「keras<モジュール階層>の中の」
      • datasets.: 「datasets<モジュール階層>の中の」
        • mnist: 「mnistモジュール」

という意味になる。ほとんどのライブラリの場合、このようにして階層構造(=ツリー形式の構造)の中をたどることでやっと、使いたいモジュールが利用できる。

 ここで記載した「<モジュール階層>」は、見方を変えると、複数のモジュールをまとめたフォルダー(=モジュールのコレクション)のことである。そういったものをPythonではパッケージと呼ぶ、とすでに説明済みである。つまり、<モジュール階層>=「パッケージ」であることに注意してほしい。

 ちなみに先ほどのリスト1では、ライブラリ「TensorFlow」の一番上位(=ルート)にあるtensorflowモジュールをtfという名前でインポートするコードを示した。このようなモジュール階層の最上位のモジュールではなく、そこから始まるモジュール階層の途中にあるモジュールをインポートすることも可能だ。例えばリスト3-2は、階層の途中にあるdatasetsモジュールをインポートして使っている。

Python
from tensorflow.keras import datasets
mnist = datasets.mnist
リスト3-2 モジュール階層の途中のモジュールをインポートするコード例

 このように、

from <モジュールの階層> import <インポートするモジュール名>

という構文を用いる。このfrom …… import ……文はよく使うので、import文の別バージョンとして確実に覚えておいてほしい。

 さて、つまるところ、tf.keras.datasets.mnistという記述は、mnistモジュールを利用しているコードということになる。そのmnistモジュール自体は、図5に示すようにmnist.pyという名前のPythonファイル(拡張子は「.py」)として定義されている。

モジュールと階層の定義
図5 モジュールと階層の定義

 Pythonでは、モジュールを分類・整理・管理するためのモジュール階層構造は、そのままOSのディレクトリ(=フォルダーの階層)を用いて定義する仕様となっている。例えば図5の赤枠を見ると、「mnistモジュールの上位階層がどのように定義されているか」が視覚的に理解できるだろう。確かに、

  • ルートフォルダー: tfモジュールに対応。図5では見えなくしているが、左上の吹き出しを参照
    • kerasフォルダー: keras<モジュール階層>に対応
      • datasetsフォルダー: datasets<モジュール階層>に対応

というOSのフォルダー階層で定義されており、前述のtf.keras.datasets.mnistが意味する<モジュール階層>とまったく同じ階層構造になっている。

 ここで注意が必要なのは、<モジュール階層>となるフォルダーには、それぞれ__init__.pyというPythonファイルが必要となることだ(図5の緑枠)。Python言語の仕様では、__init__.pyファイルが存在するフォルダーは<モジュール階層>として認識され、「モジュール」としてインポートすることも可能になる。例えばdatasetsフォルダー内には__init__.pyファイルがあるため、datasetsが<モジュール階層>として認識され、前掲のリスト3-2では「モジュール」としてインポートできている。

 では、__init__.pyファイルの中身は何を記載すればよいのだろうか。このファイルには、基本的に初期化(=初期状態を動的に設定すること)のためのコード、例えば配下に存在する各種モジュールを利用できるようにするためのimport文などを書くが、初期化するものが何もなければカラ(空)でも構わない。機械学習でライブラリを活用する分には、自ら__init__.pyファイルを記載することは「ほぼない」と思われるので、とりあえずこれに関してはそういう機能があるとだけ知っておけばよい。

【コラム】用語の整理: ライブラリ/配布用プロジェクト/モジュール/パッケージ

 本稿では、似たような用語が多数登場して紛らわしい。説明が重複してしまうが、念のため、このコラムで整理しておこう。

  • ライブラリ: 一般的な名称として呼ばれる単位での、機能の集まり。例えば「TensorFlow」という名称のライブラリがある
  • 配布用プロジェクト: PyPIで配布されている単位での、機能の集まり。別名:「Pythonパッケージ」。例えばライブラリ「TensorFlow」は、PyPIでは「tensorflow」という配布識別名のプロジェクトとして配布されている
  • モジュール: Python言語仕様においては、インポートできる単位での、機能の集まり。例えばtf.keras.datasetsという<モジュール階層>の中には、mnistというモジュールがある
  • パッケージ: Python言語仕様においては、複数のモジュールをまとめたフォルダーのような機能のこと。本稿では<モジュール階層>とも表現。ツリー形式で階層構造を構成できる。例えばtf.keras.datasetsの中では、「tf<モジュール階層>(ルートフォルダー)」-「keras<モジュール階層>(=kerasフォルダー)」-「datasets<モジュール階層>(datasetsフォルダー)」という3階層を構成している。

 なお、「パッケージ」(=<モジュール階層>)は、本文で説明済みのとおりfrom …… import ……文を使うことで、「モジュール」としてインポートすることが可能である。実は言語仕様上、すべてのパッケージは、「モジュール」でもある(Python 3の公式ドキュメントによれば、「すべてのパッケージはモジュールだが、すべてのモジュールがパッケージとは限らないことを心に留めておくのが重要」と記載されている)。実際にリスト3-2では、tensorflow.kerasパッケージの中にあるdatasetsパッケージを「モジュール」としてインポートし、「datasetsモジュール」として利用している。

 つまりモジュールには、「通常の(単一のファイルで定義された)モジュール」と「パッケージとして表現される広義のモジュール」の2種類がある、とここまでの説明で理解してもらっていると思う。念のため、一部説明がダブるが、通常のモジュールと、モジュールとして捉えたパッケージの中身の違いを示しておこう。

  • 通常のモジュール: <モジュール名>.pyファイルで定義されている。例えばmnistモジュール。インポートすると、mnist.pyファイルの中身が使えるようになる(リスト3-1)
  • モジュールとして捉えたパッケージ: <モジュール階層>\__init__.pyファイルで定義されている。例えばdatasetsモジュール。インポートすると、<ルートフォルダー>\keras\datasets\__init__.pyファイルの中身が使えるようになる(リスト3-2)

つづく

 今回は「モジュール」について説明した。次回は、Pythonのコードを記述する際に参考になるヘルプドキュメント「APIリファレンス」と、参考説明などをコード内に記述するための「コメント」機能について紹介する。

  • このエントリーをはてなブックマークに追加

※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載目次]を参照してください。

機械学習 & ディープラーニング入門(Python編)[Lesson 2]
1. ディープラーニングを始めるための、Python基礎文法入門

一般的にディープラーニングはPython言語で開発する。実際に開発でよく使うPython言語の基本文法を厳選し、それらを図解で解説していく連載の初回である今回は、Python言語のバージョンについて説明する。

2018年12月26日(水)
機械学習 & ディープラーニング入門(Python編)[Lesson 2]
2. 【現在、表示中】≫ モジュール ― Python基礎文法入門

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は、プログラムの1行目に記載されることが多い、モジュールのインポートや、そのモジュールを含むライブラリのインストールについて説明する。

2019年2月4日(月)
機械学習 & ディープラーニング入門(Python編)[Lesson 2]
3. コメント ― Python基礎文法入門、APIリファレンスの使い方

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は、コードの中で頻繁に使われるコメント機能を説明。さらに、コーディング作業で常用するAPIリファレンスの使い方について紹介する。

2019年2月7日(木)
機械学習 & ディープラーニング入門(Python編)[Lesson 2]
4. 変数、オブジェクト ― Python基礎文法入門

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は、プログラミングの基本中の基本である変数と、Pythonの世界を構成するオブジェクトについて説明する。

2019年2月13日(水)
機械学習 & ディープラーニング入門(Python編)[Lesson 2]
5. データ型(ブール/数値/文字列) ― Python基礎文法入門

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回と次回は、値やデータの型を説明。今回はその前編として、bool型/int型/float型/str型を取り上げる。

2019年2月14日(木)
Deep Insider の SNS :