質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

ValueError: num must be 1 <= num <= 121, not 122 の解決

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 4,364

score 85

 前提・実現したいこと

以下のページのソースを利用して
https://recruit.gmo.jp/engineer/jisedai/blog/deep-learning-keras/

tensorflow kerasで、下のソースを実行中に、以下のエラーが出ます。
Matplotlibでのsubplotを利用したグラフ作成のところかと思いますが、
解決法をご教示頂けますと助かります。

 発生している問題・エラーメッセージ

ValueError                                Traceback (most recent call last)
<ipython-input-8-849bb41a5d35> in <module>()
8 for ind, val in enumerate(test_wrong):
9     plt.subplots_adjust(left=0, right=1, top=1, bottom=0)
---> 10     plt.subplot(11, 11, ind + 1)
11 #     plt.subplot(11, 11, ind)
12     im = 1 - val[0][0]

~\AppData\Local\conda\conda\envs\tensorflow-gpu\lib\site-packages\matplotlib\pyplot.py in subplot(*args, kwargs) 1070  1071     fig = gcf() -> 1072     a = fig.add_subplot(*args, kwargs)
1073     bbox = a.bbox
1074     byebye = []

~\AppData\Local\conda\conda\envs\tensorflow-gpu\lib\site-packages\matplotlib\figure.py in add_subplot(self, *args, kwargs) 1237                     self._axstack.remove(ax) 1238  -> 1239             a = subplot_class_factory(projection_class)(self, *args, kwargs)
1240         self._axstack.add(key, a)
1241         self.sca(a)

~\AppData\Local\conda\conda\envs\tensorflow-gpu\lib\site-packages\matplotlib\axes\_subplots.py in init(self, fig, *args, **kwargs)
65                     raise ValueError(
66                         ("num must be 1 <= num <= {maxn}, not {num}"
---> 67                         ).format(maxn=rows*cols, num=num))
68                 self._subplotspec = GridSpec(
69                         rows, cols, figure=self.figure)[int(num) - 1]

ValueError: num must be 1 <= num <= 121, not 122

 該当のソースコード

import os
import sys
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Kerasで必要なものをimport
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.utils import np_utils

# データを用意&加工
size_img = 28
n_label = 10

(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(-1, 1, size_img, size_img).astype('float32') / 255.
X_test = X_test.reshape(-1, 1, size_img, size_img).astype('float32') / 255.
Y_train = np_utils.to_categorical(y_train, n_label)
Y_test = np_utils.to_categorical(y_test, n_label)
# 試しに、どんなインプットイメージが見てみる
%matplotlib inline
import matplotlib.cm as cm

i = 7
plt.imshow(X_train[i, 0], interpolation='nearest', cmap=cm.binary)
print("label : ", Y_train[i,:])
# CNNモデルの構築
# 単純なconv1層 x full connect1層モデル
n_filter = 16
size_filter = 5
size_pool = 2
n_hidden = 100

model = Sequential()
model.add(Convolution2D(n_filter, size_filter, size_filter,
                        border_mode='same', input_shape = (1, size_img, size_img)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(size_pool, size_pool)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(n_hidden))
model.add(Dropout(0.2))
model.add(Dense(n_label))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
# 学習
model.fit(X_train, Y_train, batch_size=50, nb_epoch=10,
          verbose=1, validation_split=0.1)
vs = model.evaluate(X_test, Y_test)
print("\nTest classification rate %0.05f" % vs[1])
# ~99%と高い正解率
# 正誤表
print('Cross tabulation')
y_pred = model.predict_classes(X_test)
pd.crosstab(y_pred, y_test)
# そこで実際に、間違いの数字を見る。
# 青ラベル:実際の数字;赤ラベル:間違えて予測した数字
test_wrong = [im for im in zip(X_test, y_pred, y_test)
              if im[1] != im[2]]
print(len(test_wrong))

plt.figure(figsize=(15, 15))
for ind, val in enumerate(test_wrong):
    plt.subplots_adjust(left=0, right=1, top=1, bottom=0)
    plt.subplot(11, 11, ind + 1)
#     plt.subplot(11, 11, ind)
    im = 1 - val[0][0]
    plt.axis("off")
    plt.imshow(im, cmap='gray')
    plt.text(8, 0, val[1], fontsize=14, color='red')
    plt.text(0, 0, val[2], fontsize=14, color='blue')
#     break

 試したこと

ここに問題に対して試したことを記載してください。

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

plt.subplot(11, 11, ind + 1)の第3引数が大きすぎるからだと思います.

公式ドキュメントによると「第3引数は1から第1引数×第2引数まで」つまり121が最大値です.
(https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplot.html)
エラーメッセージからもそう見受けられます.

len(test_wrong)が121を超えているようならば第1引数,第2引数の値を大きくしてみてください.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/10 03:55

    解決できました.どうもありがとうございました.

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る