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

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

ただいまの
回答率

89.22%

numpy.reshapeの変換エラーについて

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 189

ponpon0987

score 17

前提・実現したいこと

3種類の画像を識別を判別し,精度を算出するプログラムを作成しております。
実行したところreshape()の形状変換でエラーが発生しました。
修正すべきところを教えていただきたいです。

また、
im_rows=150
im_cols=150
と設定しているのにも関わらず、(32, 32, 3)にreshapeしようとしているのかもわかりませんので教えていただきたいです。
どうぞよろしくお願いいたします。

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

line 89, in <module>
    x=x.reshape(-1,im_rows,im_cols,im_color)
ValueError: cannot reshape array of size 40500000 into shape (32,32,3)

エラーが起きるソースコード

import keras
from keras.models import  Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D
from keras.optimizers import  RMSprop

import cnn_model
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img


import pandas as pd
import seaborn as sns
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt

#cnnのモデルを定義する

def def_model(in_shape,nb_classes):
    model=Sequential()
    model.add(Conv2D(32,kernel_size=(3,3),activation="relu",input_shape=in_shape))
    model.add(Conv2D(32,(3,3),activation="relu"))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64,(3,3),activation="relu"))
    model.add(Conv2D(64,(3,3),activation="relu",name="relu_conv2"))
   #最後の畳み込み層の名称を後ほど使うので定義しておく。
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(512,activation="relu"))
    model.add(Dropout(0.5))
    model.add(Dense(nb_classes,activation="softmax"))

    return model

#コンパイル済みのcnnのモデルを返す

def get_model(in_shape,nb_classes):
    model=def_model(in_shape,nb_classes)
    model.compile(
        loss="categorical_crossentropy",
        optimizer=RMSprop(),
        metrics=["accuracy"])
    return model

datagen = ImageDataGenerator(
        rotation_range=45,
        vertical_flip=True,
        horizontal_flip=True,
    fill_mode='nearest')

def images_gen(x_list,y_list):
    x_list_add=[]
    y_list_add=[]
    for x ,y in zip(x_list,y_list):#xは(3, 150, 150)で受け取る
        x = x.reshape((1,) + x.shape)  #(1, 3, 150, 150)に変換する

        batch_list=[]
        i = 0
        for batch in datagen.flow(x, batch_size=1):
            batch=batch.astype(np.uint8)#データ型を揃える!!
            batch=batch.reshape((150, 150, 3))
            x_list_add.append(batch)
            y_list_add.append(y)
            i += 1
            if i > 9:#1枚から10枚作る
                break             
    x_np_add=np.array(x_list_add)
    y_np_add=np.array(y_list_add)


    return x_np_add,y_np_add


#入力と出力を指定
im_rows=150
im_cols=150
im_color=3
in_shape=(im_rows,im_cols,im_color)
nb_classes=3

#写真データを読み込み
photos=np.load("./photos_hanbetu.npz")
x=photos["x"]
y=photos["y"]

#読み込んだデータを三次元配列に変換
x=x.reshape(-1,im_rows,im_cols,im_color)

#学習用とテスト用に分ける
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.8)

#ここで水増しする!!
x_train_add,y_train_add=images_gen(x_train,y_train)
x_train_add=x_train_add.astype("float32")/255
x_test=x_test.astype("float32")/255

#ラベルデータをone-hotベクトルに直す
y_train_add=keras.utils.np_utils.to_categorical(y_train_add.astype("int32"),nb_classes)
y_test=keras.utils.np_utils.to_categorical(y_test.astype("int32"),nb_classes)

#cnnモデルを取得
model=cnn_model.get_model(in_shape,nb_classes)

#モデルを評価


def print_cmx(y_true, y_pred):
    labels = sorted(list(set(y_true)))
    cmx_data = confusion_matrix(y_true, y_pred, labels=labels)
    labels= ["a","b","c"]#ラベルを付け加える
    df_cmx = pd.DataFrame(cmx_data, index=labels, columns=labels)

    plt.figure(figsize = (10,7))
    sns.heatmap(df_cmx, annot=True)
    plt.xlabel("Predict-labels")
    plt.ylabel("True-labels")

    plt.show()

predict_classes = model.predict_classes(x_test, batch_size=32)
true_classes = np.argmax(y_test,1)
print_cmx(true_classes,predict_classes)

画像データとラベルデータを保存するファイル

import os,glob,random
import cv2
import numpy as np

outfile="./photos_hanbetu.npz"#保存ファイル名
max_photo=200
photo_size=150
x=[]#画像データ
y=[]#ラベルデータ

def main():
    #各画像のフォルダーを読む
    glob_files("./a",0)
    glob_files("./b",1)
    glob_files("./c",2)

    #ファイルへ保存
    np.savez(outfile,x=x,y=y)#xとyがnumpyのリストとして与えられる
    print("保存しました:"+outfile,len(x))

#path以下の画像を読み込む
def glob_files(path,label):
    files=glob.glob(path+"/*.jpg")
    random.shuffle(files)
    #各ファイルを処理
    num=0
    #print(files)
    for f in files:
        if num >=max_photo:break
        num+=1
        #画像ファイルを読む
        img=cv2.imread(f)
        print(img.shape)
        img=cv2.resize(img, (photo_size,photo_size ))
        img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
        img=np.asarray(img)
        print(x)
        x.append(img)
        y.append(label)

    print(num)

if __name__=="__main__":
    main()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • tetsu316

    2019/12/12 12:13

    reshapeする前のxのshapeが知りたいです。

    キャンセル

まだ回答がついていません

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

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