特定バージョンのtensorflowのインストールができないときの対処法

# はじめに
tensorflowで作成した深層学習モデルを学習させるときに，以下のようなエラーで学習ができず新たな仮想環境の構築を行なったのでまとめます．

```
Conv2DCustomBackpropInputOp only supports NHWC.
```

このエラーはおそらく**CPU環境においてtensorflow2系でモデルの定義で data_format = "channels_first" [^1]とする**と発生するもので，このエラーへの対処法は以下の二通りが考えられます．

1. データ形状とモデルのdata_formatを全てchannels_lastにする
1. tensorflowをダウングレードする

ここでは二つ目のtensorflowをダウングレードする方法について紹介します．
今回は**WindowsのPython3の環境でtensorflowのバージョン1.8.0へのダウングレード**を行います．
MacやLinuxでも似た流れで実行できると思います．

[^1]: channels_firstとは，tensorflowでのデータの形状を表します．channels_firstはデータの形状がNCHW(ミニバッチのデータ数，チャンネル，高さ，幅)の順に並んでいます．一方，channels_lastはNHWC(ミニバッチのデータ数，高さ，幅，チャンネル)の順に並んだデータ形状を指します．TensorFlowのデフォルトのデータ形状はchannels_lastです．



# 今回の流れ
今回の流れは以下の通りです．

 1. 現状の確認
 1. tensorflowのバージョン1.8.0に対応しているPython3系の調査
 1. 調査で判明したバージョンのPythonのインストール
 1. インストールしたPythonで仮想環境構築 (venv使用)
 1. tensorflowのバージョン1.8.0のインストール



# 現状の確認
とりあえずtensorflowのバージョン1.8.0のインストールを試みます．

```
$ pip install tensorflow==1.8.0
ERROR: could not find a version that satisfies the requirement tensorflow==1.8.0
(from versions: 2.5.0rc0, 2.5.0rc1, 2.5.0rc2, 2.5.0rc3, 2.5.0, 2.5.1, 2.5.2, 2.5.3, 2.6.0rc0, 2.6.0rc1,
2.6.0rc2, 2.6.0, 2.6.1, 2.6.2, 2.6.3, 2.7.0rc0, 2.7.0rc1, 2.7.0, 2.7.1, 2.8.0rc0, 2.8.0rc1, 2.8.0)
ERROR: no matching distribution found for tensorflow==1.8.0

$ python -V
Python 3.9.10
```

Python3.9においてtensorflowのバージョン1.8.0はインストールの候補になく，インストールすることができません．
そこでtensorflowのバージョン1.8.0に対応しているPythonを探すことから始めます．



# tensorflowのバージョン1.8.0に対応しているPython3系の調査

まず https://pypi.org/ にアクセスして，検索欄で "tensorflow" と検索します．
検索すると以下の画像のように様々なパッケージが出てくるので，tensorflowに該当するもの(下の画像では一番上の tensorflow 2.8.0)をクリックします．

![pypi_tensorflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453481/dcb2827e-4b69-8c6a-71a3-9a0a662e61b7.png)

tensorflowのページが開いたら，左側の"Release history"をクリックします．
そうすると下の画像のようにtensorflowの様々なバージョンが一覧になって出てくるので，バージョン1.8.0を探してクリックします．

![pypi_tensorflow_rh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453481/dbc9dded-93f1-e7b6-f2e1-f6f30479ab75.png)

tensorflowのバージョン1.8.0のダウンロードファイルは下の画像になっています．
ここで下の画像の赤枠で示した部分に注目すると，これがtensorflowのバージョン1.8.0に対応しているPythonのバージョンを表しています．
下の画像ではcp27からcp36まで，つまりPython2.7とPython3.3からPython3.6までが対応しており，これらのPythonを導入する必要があるとわかります．

![pypi_tensorflow_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453481/5c9898b2-699d-6f86-1790-6db28cbeb063.png)

もし既に導入しているPythonがPython2.7かPython3.3からPython3.6までの場合は[tensorflowのバージョン1.8.0のインストール](#-tensorflowのバージョン1.8.0のインストール)に進んでください．
現在のPythonのバージョンは以下のコマンドで確認できます．

```
$ python3 -V
```



# 対応するPythonのインストール
前の調査でtensroflow1.8.0を使うためにはPython3系ではPython3.3からPython3.6が必要であることが分かったので，Python3.6のインストールを行います．

まず https://www.python.org/downloads/windows/ にアクセスして，Python3.6を探します．
Windows向けのインストーラが用意されている中で最も新しいPython3.6が3.6.8だったので，下の画像の赤枠の "Download Windows x86-64 executable installer" をクリックしてインストールを行います．

![python_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453481/f1398d6e-fd5d-a467-097a-658c907fb056.png)

インストールの際にインストールを行う場所をメモしておいてください．
通常は以下の場所にインストールされると思います． (usernameは適宜変更してください．)

```
$ C:\Users\username\AppData\Local\Programs\Python\Python36
```



# インストールしたPythonで仮想環境構築
様々なパッケージをルート環境にインストールすると，パッケージの依存関係でパッケージが正常に動作しなくなることがあるので，仮想環境を作成して作業を行うのが良いと思います．
Pythonで仮想環境を構築する方法として，ここでは**venv**を用いて仮想環境構築を行います．

ここからの操作はWindowsの**コマンドプロンプト**で実行します．

venvはPython3.6では標準で使用可能な仮想環境作成コマンドで，以下のコマンドで仮想環境を構築することができます．
ここで作成する仮想環境名を myenv，仮想環境を構築するフォルダの絶対パスを C:\Users\username\myenv とします．
仮想環境名と絶対パスは適宜変更してください．

```
$ C:\Users\username\AppData\Local\Programs\Python\Python36\python -m venv C:\Users\username\myenv
```

これで仮想環境を構築できたので，以下のコマンドで仮想環境を実行します．

```
$ C:\Users\username\myenv\Scripts\activate
```

上記のコマンドを実行し，以下のように今いる絶対パスの前に (myenv) が付いていれば，仮想環境の実行ができています．

```
(myenv) C:\Users\username>
```

ここで念のために仮想環境内のPythonのバージョン確認を行います．
実行結果が以下のようになっていれば問題ありません．

```
(myenv) C:\Users\username> python -V
Python 3.6.8
```

仮想環境を終了するときは以下のコマンドで終了できます．

```
(myenv) C:\Users\username> deactivate
```



# tensorflowのバージョン1.8.0のインストール
tensorflowのバージョン1.8.0をインストールする場合は以下のコマンドでインストールできます．

```
(myenv) C:\Users\username> pip install tensorflow==1.8.0
```

tensorflowがバージョン1.8.0でインストールできているかは以下のコマンドで検証できます．

```
(myenv) C:\Users\username> python
>>> import tensorflow
>>> print(tensorflow.__version__)
1.8.0
```



# 最後に
ここではtensorflowのバージョン1.8.0のインストールに関して扱いましたが，他のバージョンについても同様の方法で環境構築が可能だと思います．



# 参考資料
- venvに関するPythonの資料 https://docs.python.org/ja/3/library/venv.html