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

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

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

883閲覧

0以外の数値にするとエラーが出てしまいます

KR13

総合スコア2

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2021/12/28 17:52

編集2021/12/29 08:53

前提・実現したいこと

convLSTMを用いた画像予測を行っています。

%matplotlib inline
i=0
fig, axes = plt.subplots(1, 2, figsize=(12,6))
axes[0].imshow((y_test[i]+1)/2)
axes[1].imshow((model.predict(x_test[[i]]).reshape(100,180,3)+1)/2)

i=0のところを0以外の数値にするとエラーが出ます。

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

IndexError: index 20 is out of bounds for axis 0 with size 1

該当のソースコード

import numpy as np import matplotlib.pyplot as plt import pandas as pd import seaborn as sns from sklearn.model_selection import train_test_split import glob from PIL import Image from tqdm import tqdm import zipfile import io # 縮小後の画像サイズ height = 100 width = 180 # 読み込んだ画像を入れる配列 imgs=np.empty((0, height, width, 3)) # zipファイルを読み込んでnumpy配列にする zip_f = zipfile.ZipFile('drive/My Drive/Colab Notebooks/convLSTM/wide.zip') for name in tqdm(zip_f.namelist()): with zip_f.open(name) as file: path = io.BytesIO(file.read()) #解凍 img = Image.open(path) img = img.resize((width, height)) img_np = np.array(img).reshape(1, height, width, 3) imgs = np.append(imgs, img_np, axis=0) # 時系列で学習できる形式に整える n_seq = 5 n_sample = imgs.shape[0] - n_seq x = np.zeros((n_sample, n_seq, height, width, 3)) y = np.zeros((n_sample, height, width, 3)) for i in range(n_sample): x[i] = imgs[i:i+n_seq] y[i] = imgs[i+n_seq] x, y = (x-128)/128, (y-128)/128 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.1, shuffle = False) from keras import layers from keras.layers.core import Activation from tensorflow.keras.models import Model inputs = layers.Input(shape=(5, height, width, 3)) x0 = layers.ConvLSTM2D(filters=16, kernel_size=(3,3), padding="same", return_sequences=True, data_format="channels_last")(inputs) x0 = layers.BatchNormalization(momentum=0.6)(x0) x0 = layers.ConvLSTM2D(filters=16, kernel_size=(3,3), padding="same", return_sequences=True, data_format="channels_last")(x0) x0 = layers.BatchNormalization(momentum=0.8)(x0) x0 = layers.ConvLSTM2D(filters=3, kernel_size=(3,3), padding="same", return_sequences=False, data_format="channels_last")(x0) out = Activation('tanh')(x0) model = Model(inputs=inputs, outputs=out) model.summary() model.compile(optimizer='rmsprop', loss='mae', metrics=['mse']) call_backs=[EarlyStopping(monitor="val_loss",patience=5)] model.fit(x_train, y_train, batch_size=16, epochs=100, verbose=2, validation_split=0.2, shuffle=True, callbacks=call_backs) # 描画 %matplotlib inline i=10 fig, axes = plt.subplots(1, 2, figsize=(12,6)) axes[0].imshow((y_test[i]+1)/2) axes[1].imshow((model.predict(x_test[[i]]).reshape(100,180,3)+1)/2)

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

何を変えればいいのかわかりません よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/12/28 22:09

> IndexError: index 20 is out of bounds for axis 0 with size 1 少なくともエラーは、「1つしかないものの20番目」を指定しているために「んなもんねーよ」と怒っているエラーです。 これだけでは何もわかりませんので、ちゃんと走るコードと、そのコードのどこで(何行目か、もしくはどの関数のところで)エラーが起きたかを掲載ください。データを開示できない場合、同じエラーが起こせる最小限のダミーデータを提供ください。
退会済みユーザー

退会済みユーザー

2021/12/29 22:32

print(x_test.shape)の結果を教えてもらえますか?
KR13

2021/12/30 04:43

(1, 5, 100, 180, 3)でした。
guest

回答1

0

ベストアンサー

x_testは(i番目, n_seq番目, 画像のheight , 画像のwidth, RGBの3ch)という内訳になっているものと思います。

ですので、
x_test[数字]とした場合、カッコの中の一番左側の中身のi番目が参照されます。

x_testの中身が(1, 5, 100, 180, 3)だった場合、
x_test[0]であればi番目の要素数は1しかないため(5, 100, 180, 3)が参照されます。
x_test[1]であればi番目の要素数は1しかないためIndexError: index 1 is out of bounds for axis 0 with size 1となるはずです。

もう気付いたと思いますが、n_seq番目を参照させたい場合には、n_seq番目を指定するカッコをつけないといけません。
具体的には、
x_test[0][0]とすると、i番目が0n_seq番目が0(100, 180, 3)が返ってきます。


やりたいことを実装するコードの抜粋(多分)

Python3

1i_max = len(x_test[0]) 2for i in range(i_max): 3 print(x_test[0][i].shape)

検証用コード

Python3

1import numpy as np 2 3# ダミーの変数を生成 4test_x = np.zeros((1,5,100,180,3)) 5 6print(test_x.shape) 7# (1, 5, 100, 180, 3) 8 9print(test_x[0].shape) 10# (5, 100, 180, 3) 11 12print(test_x[0][0].shape) 13# (100, 180, 3) 14 15print(test_x[1].shape) 16# IndexError: index 1 is out of bounds for axis 0 with size 1 17

投稿2021/12/30 07:28

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KR13

2021/12/30 07:48

なぜできないのか分かりました!無事解決できました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問