生成AIに聞いて、とても役に立った事をまとめました (2024年05月)

#   はじめに

普段の生活の中で、生成AIに聞いてみたら、とても役に立った瞬間を、まとめました。


#   よくあるデータセットの特徴を表にまとめたい

よくあるデータセットの特徴(白黒・カラー画像、画像サイズ)を、表にさっくりまとめて資料を作りたかったのですが、生成AIに聞いて、一発でほしかったものが得られました。とても役に立ちました。

##   生成AIへ質問＆結果

**▼私(人間)**
下記のデータセットで、白黒・カラー画像、画像サイズ、を一覧で表示すると？
'mnist', 'fashion-mnist', 'cifar10', 'cifar100', 'svhn', 'stl10', 'lsun-bed'

**▼Google Gemini(自動応答)**
データセット比較表

| データセット | 画像種類 | 画像サイズ | カテゴリ数 | 概要 |
|---|---|---|---|---|
| mnist | 白黒 | 28 x 28 ピクセル | 10 | 手書き数字 |
| fashion-mnist | カラー | 28 x 28 ピクセル | 10 | 服飾 |
| cifar10 | カラー | 32 x 32 ピクセル | 10 | 動物、乗り物、飛行機、果物など |
| cifar100 | カラー | 32 x 32 ピクセル | 100 | cifar10の拡張版、より多くのカテゴリと画像数 |
| svhn | カラー | 32 x 32 ピクセル | 10 | 数字を含む道路標識 |
| stl10 | カラー | 96 x 96 ピクセル | 10 | 動物、乗り物、飛行機、果物など |
| lsun-bed | カラー | 256 x 256 ピクセル | 1 | ベッドルーム |

**補足:**

* mnistとfashion-mnistは、元々は白黒画像のデータセットですが、カラーに変換して利用することもできます。
* stl10は、96 x 96 ピクセルの高解像度画像である点が特徴です。
* lsun-bedは、256 x 256 ピクセルの非常に高解像度画像である点が特徴です。

上記以外にも、多数のカラー画像データセットが存在します。具体的な用途や必要な画像の枚数、カテゴリなどを教えていただければ、より適切なデータセットを紹介できます。

:::note info
一発でほしかった表が得られました。とても役に立ちました。これを人手で一つ一つ調べて表を埋めていたら、かなりの単純作業になっただろうと思います。
:::

**▼私(人間)**
上記のサンプル画像を並べて表示すると？

**▼Google Gemini(自動応答)**
Unfortunately, I am unable to directly display images here. However, I can provide you with links to sample images from each dataset:

**mnist:**

[Image of mnist dataset sample image]

**fashion-mnist:**

[Image of fashion-mnist dataset sample image]

**cifar10:**

[Image of cifar10 dataset sample image]

**cifar100:**

[Image of cifar100 dataset sample image]

**svhn:**

[Image of svhn dataset sample image]

**stl10:**

[Image of stl10 dataset sample image]

**lsun-bed:**

[Image of lsun-bed dataset sample image]

Please let me know if you have any other questions.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/abbec75a-2899-8a42-dfa8-c298cc824d6a.png)

:::note info
サンプル画像は表示できないとのことですが、リンクとリンク先の画像を挿入して貰えているので、一発で視覚的に確認できました。
:::


#   Pythonのプログラムがうまくいかず沼状態を脱したい

Pythonのargparseで、type=boolを指定しているのに、どうしてもTrueしか得られず、沼にはまってしまって時間を費やしそうになっていましたが、生成AIに聞いたら、一発でほしかった解決策が得られました。とても役に立ちました。

##   生成AIへ質問＆結果

**▼私(人間)**
Python、下記で、コマンドラインでFalseを指定しても、Falseにならない。解決策は？
parser.add_argument('--mode', type=bool, default=True)

**▼ChatGPT(自動応答)**
`argparse`を使用してコマンドライン引数を解析する際、`type=bool`を直接使用することは、期待通りの動作をしないことがあります。これは、コマンドライン引数が常に文字列として解釈されるためです。`bool("False")`は常に`True`になるため、コマンドラインで`False`を指定しても効果がありません。

この問題を解決するには、以下の方法があります。

方法 1: カスタム関数を使用する

カスタム関数を使用して、文字列を適切にブール値に変換します。

```python
import argparse

def str2bool(v):
    if isinstance(v, bool):
        return v
    if v.lower() in ('yes', 'true', 't', 'y', '1'):
        return True
    elif v.lower() in ('no', 'false', 'f', 'n', '0'):
        return False
    else:
        raise argparse.ArgumentTypeError('Boolean value expected.')

parser = argparse.ArgumentParser(description="Example script.")
parser.add_argument('--mode', type=str2bool, nargs='?', const=True, default=True, help="Enable or disable mode")
args = parser.parse_args()

print(f"Mode is set to: {args.mode}")
```

方法 2: `store_true` および `store_false` を使用する

`--mode`を指定すると`True`に、`--no-mode`を指定すると`False`に設定する方法です。

```python
import argparse

parser = argparse.ArgumentParser(description="Example script.")
parser.add_argument('--mode', action='store_true', default=True, help="Enable mode")
parser.add_argument('--no-mode', action='store_false', dest='mode', help="Disable mode")
args = parser.parse_args()

print(f"Mode is set to: {args.mode}")
```

この方法では、以下のようにコマンドライン引数を指定します：

- モードを有効にする場合： `--mode`
- モードを無効にする場合： `--no-mode`

まとめ

`type=bool`を使用すると期待通りに動作しないことがあるため、カスタム関数を使用して文字列をブール値に変換するか、`store_true`および`store_false`アクションを使用してブール値を設定する方法をお勧めします。

例えば、以下のように使います：

```bash
# カスタム関数を使用する方法
python script.py --mode false

# store_true および store_false を使用する方法
python script.py --no-mode
```

これにより、コマンドライン引数で`False`を指定した場合に正しくブール値として解釈されるようになります。

:::note info
「方法 1: カスタム関数を使用する」の方で、完璧な解決策が得られました。これにより修正した、実際のコードも、一発で動作しました。
:::


#   配列を操作するコードの具体的な出力が何になるか見たい

配列を操作するコードなどは、ちょっとしたコードなのに、読み解くのにいちいち骨が折れることがよくあります。コードを読み解くよりも、サンプルデータ例を見れば一発で理解できます。

配列を操作するコードの具体的な出力が何になるかを、生成AIに聞いたら、一発でほしかった出力例が得られました。とても役に立ちました。

##   生成AIへ質問＆結果

生成AIに聞くために、元コードのパラメータ変数には、具体的な数値を入れてから、生成AIに質問しています。

**▼私(人間)**
下記のコードで、temp_yの出力は何？
```
temp = np.zeros((3, 1))
for i in range(3):
    temp[i, 0] = i

temp_y = np.zeros((3*2, 1))
for i in range(3):
    temp_y[i * 3: (i + 1) * 3] = temp
```

**▼ChatGPT-4o(自動応答)**
このコードは、NumPyを使用して行列を操作し、各要素に値を代入しています。以下はコードの詳細とその出力です。

1. `np.zeros((3, 1))`：3行1列のゼロ行列を作成します。この時点での行列は以下のようになります。
   ```
   [[0.],
    [0.],
    [0.]]
   ```

2. `for i in range(3): temp[i, 0] = i`：`i` が 0 から 2 までのループを回し、`temp` の各行の0列目に `i` の値を代入します。

具体的なステップは以下の通りです。
- `i = 0` のとき： `temp[0, 0] = 0` → 行列は変わりません。
- `i = 1` のとき： `temp[1, 0] = 1` → 行列は次のようになります。
  ```
  [[0.],
   [1.],
   [0.]]
  ```
- `i = 2` のとき： `temp[2, 0] = 2` → 行列は次のようになります。
  ```
  [[0.],
   [1.],
   [2.]]
  ```

3. `np.zeros((3*2, 1))`：6行1列のゼロ行列を作成します。この時点での行列は以下のようになります。
   ```
   [[0.],
    [0.],
    [0.],
    [0.],
    [0.],
    [0.]]
   ```

4. `for i in range(3): temp_y[i * 3: (i + 1) * 3] = temp`：`i` が 0 から 2 までのループを回し、`temp_y` の部分行列に `temp` の値を代入します。

具体的なステップは以下の通りです。

- `i = 0` のとき： `temp_y[0 * 3 : 1 * 3] = temp` → `temp_y[0:3]` に `temp` の値を代入します。
  ```
  [[0.],
   [1.],
   [2.],
   [0.],
   [0.],
   [0.]]
  ```

- `i = 1` のとき： `temp_y[1 * 3 : 2 * 3] = temp` → `temp_y[3:6]` に `temp` の値を代入します。
  ```
  [[0.],
   [1.],
   [2.],
   [0.],
   [1.],
   [2.]]
  ```

- `i = 2` のとき： `temp_y[2 * 3 : 3 * 3] = temp` → `temp_y[6:9]` に `temp` の値を代入しようとしますが、`temp_y` は6行しかないため、このステップは実行されません。

したがって、最終的な出力は次のようになります。
```
[[0.],
 [1.],
 [2.],
 [0.],
 [1.],
 [2.]]
```

これが変数 `temp_y` の値です。

:::note info
配列を操作するコードの具体的な出力が何になるかを、生成AIに聞いたら、一発でほしかった出力例が得られました。とても役に立ちました。
また、生成AIの回答は、実際に正しい出力になっていました。
:::