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

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

ただいまの
回答率

90.33%

  • Python

    9232questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    7420questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Keras

    289questions

ValueError: Input 0 is incompatible with layer flatten_2: expected min_ndim=3, found ndim=2

受付中

回答 0

投稿

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

FALLOT

score 8

ValueError: Input 0 is incompatible with layer flatten_2: expected min_ndim=3, found ndim=2

画像分類をしようとすると上記のようなエラーが出ました.

CNNをはじめて実装したので,原因がよくわかっていません.

わかる方.宜しくお願い致します.

#https://qiita.com/hiroeorz@github/items/ecb39ed4042ebdc0a957

from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers import Activation, Dense, Dropout, Flatten, MaxPooling2D
from keras.utils.np_utils import to_categorical
from keras.optimizers import Adagrad
from keras.optimizers import Adam
from keras.models import load_model
from keras.callbacks import EarlyStopping, ModelCheckpoint, CSVLogger
import numpy as np
from PIL import Image
import os
import time
import csv


start_time = time.time()
print("開始時刻: " + str(start_time))

# 学習用のデータを作る.
image_list = []
label_list = []

#ハイパーパラメータ
#画像サイズ
x = 120
y = 120
A = x*y #入力のノード数
#エポック数
B = 500
#バッチサイズ
BATCH_SIZE = 32
#学習率
LR = 0.00001
#出力ノード数
output =9


# ./data/train 以下のa,b,cのディレクトリ以下の画像を読み込む。
for dir in os.listdir("data/train"):
    if dir == ".DS_Store":
        continue

    dir1 = "data/train/" + dir 
    label = 0

    if dir == "a":    # 左下に最大応力:ラベル0
        label = 0
    elif dir == "b": # 右下に最大応力:ラベル1
        label = 1
    elif dir == "c": # 右下に最大応力:ラベル1
        label = 2
    elif dir == "d": # 右下に最大応力:ラベル1
        label = 3
    elif dir == "e": # 右下に最大応力:ラベル1
        label = 4
    elif dir == "f": # 右下に最大応力:ラベル1
        label = 5
    elif dir == "g": # 右下に最大応力:ラベル1
        label = 6
    elif dir == "h": # 右下に最大応力:ラベル1
        label = 7
    elif dir == "i": # 右下に最大応力:ラベル1
        label = 8


    for file in os.listdir(dir1):
        if file != ".DS_Store":
            label_list.append(label) #わからない
            filepath = dir1 + "/" + file
            image = np.array(Image.open(filepath).resize((x, y)))
            print(image.shape)
            print(filepath)
            image =np.reshape(image, A)
            print(image.shape)
            print('\n')
            image_list.append(image / 255.)


# kerasに渡すためにnumpy配列に変換。
image_list = np.array(image_list)




# ラベルの配列を1と0からなるラベル配列に変更
# 0 -> [1,0], 1 -> [0,1] という感じ。
Y = to_categorical(label_list) #わからない

print("入力データの確認")
print(image_list.shape)
#np.savetxt("check/input_data_pixel.csv",image_list,delimiter=",")
#print("ラベルデータの確認")   
print(image_list.shape)
#np.savetxt("check/label_data.csv",Y,delimiter=",")
#CNNの入力は4次元テンソルなので4次元テンソルに変換
image_list =np.expand_dims(image_list, axis=-1)


# モデルを生成してニューラルネットを構築
model = Sequential()

model.add(Conv2D(32,kernel_size=3,input_shape=(x,y,1),kernel_initializer='random_normal',bias_initializer='zeros')) #畳み込み層#32:カーネル数 3×3:カーネルサイズ
model.add(Activation('relu'))
model.add(Conv2D(32,kernel_size=3,kernel_initializer='random_normal',bias_initializer='zeros'))#畳み込み層
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))#プーリング層
model.add(Dropout(0.25))

model.add(Conv2D(64,kernel_size=3,kernel_initializer='random_normal',bias_initializer='zeros'))#畳み込み層
model.add(Activation('relu'))
model.add(Conv2D(64,kernel_size=3,kernel_initializer='random_normal',bias_initializer='zeros'))#畳み込み層
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))#プーリング層
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(100)) #全結合層
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(10)) #全結合層
model.add(Activation('relu'))
model.add(Dropout(0.0))


model.add(Dense(output))
model.add(Activation("softmax"))

# オプティマイザ(最適化)にAdamを使用
opt = Adam(lr=LR)
# モデルをコンパイル
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) #わからない
#CSVに各エポックの学習結果の保存
csv_logger = CSVLogger('result/training.csv')
# 学習を実行。20%はテストに使用。
history = model.fit(image_list, Y, nb_epoch=B,verbose=1,callbacks=[csv_logger], batch_size=BATCH_SIZE, validation_split=0.3) 



# テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。
total = 0.
ok_count = 0.
#最終の学習結果の表示
loss, accuracy = model.evaluate(image_list, Y)
print("\nloss:{} accuracy:{}".format(loss, accuracy))
#最終の学習結果を書き込む
fp = open("result/RESULT.txt","w")
fp.write("\nloss:{} accuracy:{}".format(loss, accuracy))
fp.close()
#正解率の書き込み
f = open("result/ANSWER.txt","w")

for dir in os.listdir("data/train"):
    if dir == ".DS_Store":
        continue

    dir1 = "data/test/" + dir 
    label = 0

    if dir == "a":    # 左下に最大応力:ラベル0
        label = 0
    elif dir == "b": # 右下に最大応力:ラベル1
        label = 1
    elif dir == "c": # 右下に最大応力:ラベル1
        label = 2
    elif dir == "d": # 右下に最大応力:ラベル1
        label = 3
    elif dir == "e": # 右下に最大応力:ラベル1
        label = 4
    elif dir == "f": # 右下に最大応力:ラベル1
        label = 5
    elif dir == "g": # 右下に最大応力:ラベル1
        label = 6
    elif dir == "h": # 右下に最大応力:ラベル1
        label = 7
    elif dir == "i": # 右下に最大応力:ラベル1
        label = 8


    for file in os.listdir(dir1):
        if file != ".DS_Store":
            label_list.append(label)
            filepath = dir1 + "/" + file
            image = np.array(Image.open(filepath).resize((x, y)))
            print(filepath)
            image =np.reshape(image, A)
            result = model.predict_classes(np.array([image / 255.]))
            print("label:", label, "result:", result[0])
            L = label
            R = result[0]
            f.write(filepath)
            f.write("\nlabel:{} result:{}\n".format(L, R) )
            total += 1.

            if label == result[0]:
                ok_count += 1.




print("正答率: ", ok_count / total * 100, "%")
SEIKAI =ok_count / total * 100
f.write("\n正答率:{}".format(SEIKAI))

end_time = time.time()
print("終了時刻: ",end_time)
print ("かかった時間: ", (end_time - start_time))

ttime = end_time - start_time
fa = open("result/TIME.txt","w")
fa.write("\nかかった時間:{} ".format(ttime))
fa.close()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

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

  • Python

    9232questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    7420questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Keras

    289questions