Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は、プログラムの1行目に記載されることが多い、モジュールのインポートや、そのモジュールを含むライブラリのインストールについて説明する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「deepinsider.jp」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。
前回はPythonの「バージョン」について解説した。今回から、いよいよ文法の説明に入る。※脚注や図、コードリストの番号は前回からの続き番号としている。
なお、説明する順序は、前回掲載した図1-a(下に再掲)の1行目から順に、である。つまり、実際にライブラリ「TensorFlow」でディープラーニングのコードを書く流れに沿って、基礎文法が学んでいけるように目次を構成している。
今回、本稿で説明するのは、図1-a【再掲】における赤枠内のコードのみとなる。
本稿で示すサンプルコードの実行環境については、Lesson 1を一読してほしい。
Lesson 1でも示したように、本連載のすべてのサンプルコードは、下記のリンク先で実行もしくは参照できる。
まずは「モジュール」という概念について見ていこう。
まず、図1-a【再掲】の1行目のコードは、次のリスト1のようになっている。
import tensorflow as tf
コードの意味は少し後で説明するとして、まずはノートブックでこのコードを実行してみよう。なお、リスト1のコードの場合、実行しても、図3のように何も表示されないので注意してほしい。
実行するには、リスト1のコードを、Google Colab(もしくはJupyter Notebook)で作成したノートブックのコードセルに記入し、[Alt]+[Enter]キーを押せばよい(※このショートカットキーは、セルを実行して、新しいコードセルを現在のセルの直下に挿入するためのもの。新しいコードセルの挿入が不要な場合は[Shift]+[Enter]キーを押せばよい)。ちなみに、今後の連載内のすべてのコードリストは、このように、ノートブックのコードセルで実行できるようにしているので、ぜひ手を動かしながら読み進めていってほしい。
それではコードの意味について説明していこう。
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文」で記述できる応用テクニックも存在する。せっかくなので、これについても併せて紹介しておこう。
具体的には、改行の前に\を入れると、「次行へ文が継続している」と見なされる。例えばリストex1は、as tfの前で改行し、その改行の前に\を入れている。
import tensorflow \
as tf
そのため、この2行のコードは、import tensorflow as tfという1つの文と見なされている(※ちなみに、左記のコードにある半角スペースの数は、リストex1にある半角スペースの数を忠実に再現している。そうした理由は下記の注意書きを参考にしてほしい)。
注意点として、Pythonでは「インデント(=左端に作る余白)をそろえる」という基本ルールが非常に重要になるのだが(Lesson 8で解説)、リストex1のtensorflowとasの間は「改行ではない」と見なされているため、そういったインデントのルールが適用されない。
文内の単語間のスペースの数は、何個あっても問題にならないので、as tfの前に意図的に4個スペースを入れることで、tensorflowとtfの単語の開始位置をそろえて見やすくしている。こういった、見やすさを意識したコードの書き方も行える。
以上で1行目のコードが読めるようになったはずだ*2。
*2 【アドバイス】ここまではそれほど難しくないので、大丈夫と思うが、読み進めるうちにプログラミングの専門用語を忘れて混乱しやすいので、例えば「モジュール」の意味など、1つ1つ着実に押さえて覚えながら、読み進めてほしい。
ところで、先ほどの構文解説では、さらっと「tensorflowモジュール」と当たり前のように書いたが、「そのモジュールが一体どこから来た何者なのか、よく分からない」と思った人も少なくないのではないだろうか。そこで次に、tensorflowモジュールの出自や中身について説明しておこう。
このtensorflowモジュールは、Python言語に標準で含まれているものではない。ディープラーニング用のライブラリ「TensorFlow」は、PyPI(「パイ・ピー・アイ」と読む)というサイトのプロジェクト(project)という形でオープンに公開・配布されており、その配布物の中にtensorflowモジュールが含まれているのだ(図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よりも前に実行しておく必要がある点に注意してほしい。
!pip install 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のようになっている。
mnist = tf.keras.datasets.mnist
mnist = tf.keras.datasets.mnistというコードは、「左辺 = 右辺」という構文が使われている(※=の前後にある半角スペースはあってもなくてもよい)。この構文の意味についてはLesson 4で詳しく説明するが、今回は右辺のtf.keras.datasets.mnistというコードがどういう意味なのかを説明しよう。
気付いただろうか。先ほどtfという名前でモジュールをインポートしたが、tf.keras.datasets.mnistのtfは、そのインポート済みモジュールのことである。
tf.……と、tfの後に.が続いている。この、
<モジュール名>.
という構文は「<モジュール階層>の中の」を意味する。要するに、あるモジュール階層下のものを利用したい場合には、.で連結して利用対象を記述すればよいのである。例えばリスト3-1のようにtf.keras.datasets.mnistと記述した場合は、
という意味になる。ほとんどのライブラリの場合、このようにして階層構造(=ツリー形式の構造)の中をたどることでやっと、使いたいモジュールが利用できる。
ここで記載した「<モジュール階層>」は、見方を変えると、複数のモジュールをまとめたフォルダー(=モジュールのコレクション)のことである。そういったものをPythonではパッケージと呼ぶ、とすでに説明済みである。つまり、<モジュール階層>=「パッケージ」であることに注意してほしい。
ちなみに先ほどのリスト1では、ライブラリ「TensorFlow」の一番上位(=ルート)にあるtensorflowモジュールをtfという名前でインポートするコードを示した。このようなモジュール階層の最上位のモジュールではなく、そこから始まるモジュール階層の途中にあるモジュールをインポートすることも可能だ。例えばリスト3-2は、階層の途中にあるdatasetsモジュールをインポートして使っている。
from tensorflow.keras import datasets
mnist = datasets.mnist
このように、
from <モジュールの階層> import <インポートするモジュール名>
という構文を用いる。このfrom …… import ……文はよく使うので、import文の別バージョンとして確実に覚えておいてほしい。
さて、つまるところ、tf.keras.datasets.mnistという記述は、mnistモジュールを利用しているコードということになる。そのmnistモジュール自体は、図5に示すようにmnist.pyという名前のPythonファイル(拡張子は「.py」)として定義されている。
Pythonでは、モジュールを分類・整理・管理するためのモジュール階層構造は、そのままOSのディレクトリ(=フォルダーの階層)を用いて定義する仕様となっている。例えば図5の赤枠を見ると、「mnistモジュールの上位階層がどのように定義されているか」が視覚的に理解できるだろう。確かに、
というOSのフォルダー階層で定義されており、前述のtf.keras.datasets.mnistが意味する<モジュール階層>とまったく同じ階層構造になっている。
ここで注意が必要なのは、<モジュール階層>となるフォルダーには、それぞれ__init__.pyというPythonファイルが必要となることだ(図5の緑枠)。Python言語の仕様では、__init__.pyファイルが存在するフォルダーは<モジュール階層>として認識され、「モジュール」としてインポートすることも可能になる。例えばdatasetsフォルダー内には__init__.pyファイルがあるため、datasetsが<モジュール階層>として認識され、前掲のリスト3-2では「モジュール」としてインポートできている。
では、__init__.pyファイルの中身は何を記載すればよいのだろうか。このファイルには、基本的に初期化(=初期状態を動的に設定すること)のためのコード、例えば配下に存在する各種モジュールを利用できるようにするためのimport文などを書くが、初期化するものが何もなければカラ(空)でも構わない。機械学習でライブラリを活用する分には、自ら__init__.pyファイルを記載することは「ほぼない」と思われるので、とりあえずこれに関してはそういう機能があるとだけ知っておけばよい。
本稿では、似たような用語が多数登場して紛らわしい。説明が重複してしまうが、念のため、このコラムで整理しておこう。
なお、「パッケージ」(=<モジュール階層>)は、本文で説明済みのとおりfrom …… import ……文を使うことで、「モジュール」としてインポートすることが可能である。実は言語仕様上、すべてのパッケージは、「モジュール」でもある(※Python 3の公式ドキュメントによれば、「すべてのパッケージはモジュールだが、すべてのモジュールがパッケージとは限らないことを心に留めておくのが重要」と記載されている)。実際にリスト3-2では、tensorflow.kerasパッケージの中にあるdatasetsパッケージを「モジュール」としてインポートし、「datasetsモジュール」として利用している。
つまりモジュールには、「通常の(単一のファイルで定義された)モジュール」と「パッケージとして表現される広義のモジュール」の2種類がある、とここまでの説明で理解してもらっていると思う。念のため、一部説明がダブるが、通常のモジュールと、モジュールとして捉えたパッケージの中身の違いを示しておこう。
今回は「モジュール」について説明した。次回は、Pythonのコードを記述する際に参考になるヘルプドキュメント「APIリファレンス」と、参考説明などをコード内に記述するための「コメント」機能について紹介する。
Copyright© Digital Advantage Corp. All Rights Reserved.