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

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

新規登録して質問してみよう
ただいま回答率
85.35%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

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

Python

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

Q&A

解決済

1回答

880閲覧

深層学習でのエラーについて

yy-_.15

総合スコア17

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

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

Python

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

0グッド

0クリップ

投稿2020/11/08 13:23

編集2020/11/08 15:45

深層学習で2つの画像を見分けるというものを実装しているのですが

import imageio import numpy as np from PIL import Image X = [] y = [] for i in range(1, 61): filepath = f"/Users/K/Downloads/hifu_photos/normal/normal-{i:03d}.png" img = Image.open(filepath) img = img.convert("RGBA") img.save(f"/Users/K/Downloads/hifu_photos/normal/normal-{i:03d}.png") filepath = f"/Users/K/Downloads/hifu_photos/melano/melano-{i:03d}.png" img = Image.open(filepath) img = img.convert("RGBA") ## RGBAカラーに変換 img.save(f"/Users/K/Downloads/hifu_photos/melano/melano-{i:03d}.png") p1 = imageio.imread(f"/Users/K/Downloads/hifu_photos/melano/melano-{i:03d}.png").reshape(150,150,4) X = np.append(X, p1) y = np.append(y, np.array([0], dtype = np.uint8)).reshape(-1,1) p2 =imageio.imread(f"/Users/K/Downloads/hifu_photos/normal/normal-{i:03d}.png").reshape(150,150,4) X = np.append(X, p2) y = np.append(y, np.array([1], dtype = np.uint8)).reshape(-1,1) X_train = X[:48] y_train = y[:48] X_test = X[48:] y_test = y[48:] print(X_train.shape) rom keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras.optimizers import Adam import time model = Sequential() model.add(Conv2D(16, (3, 3), input_shape=(150, 150, 4), activation='relu')) model.add(Conv2D(32, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # (A) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # (B) model.add(Dropout(0.25)) # (C) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.25)) # (D) model.add(Dense(2, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy']) startTime = time.time() history = model.fit(X_train, y_train, batch_size=1000, epochs=20,verbose=1, validation_data=(X_test, y_test)) loss, accuracy = model.evaluate(X_test, y_test) print("loss:{} accuracy:{}".format(loss, accuracy)) print("Computation time:{0:.3f} sec".format(time.time() - startTime))

のようにコードを書くと

---> 26 history = model.fit(X_train, y_train, batch_size=1000, epochs=20,verbose=1, validation_data=(X_test, y_test)) ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=2. Full shape received: [None, 1]

のようにエラーが出てしまいます。どこかおかしい場所はありますでしょうか。。。

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

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

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

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

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

toast-uz

2020/11/08 13:30

コードを提示してどこでエラーが発生しているのかを示してください。これだけの情報だと、英語を日本語に翻訳するくらいしか、できません。
yy-_.15

2020/11/08 13:51

申し訳ありません。 コードを加筆いたしました。
toast-uz

2020/11/08 15:29

今入れた修正は戻した方が良いです。戻した前提で回答しています。
yy-_.15

2020/11/08 15:49

修正を戻させていただいた上でコードを変更させていただきました。 そうすると今度はNoneが出て次元が2になっている?のかもしれません。。
toast-uz

2020/11/08 16:03

最初の質問文やコードは上書きしないで、変更点は追記下さい。回答の理由が、他の方に分からなくなります。
yy-_.15

2020/11/08 16:05

申し訳ございません。 初心者で使い方をよく分かっておりませんでした。 今後、追記をしていくように致します。
toast-uz

2020/11/08 16:09

print(X_train.shape)は何と出ていますか?
yy-_.15

2020/11/08 16:13

(48,) このように出ております。
yy-_.15

2020/11/08 16:27

print(p1.shape)は (150, 150, 4) ときちんと出ております。
toast-uz

2020/11/08 23:12

画像は入れていませんが、実際に同サイズのndarrayを入れて動作確認し、動くようにしましたので、新しい回答を参照ください。
guest

回答1

0

ベストアンサー

エラーの意味は、model.fitにおけるx_trainの形式が違うということです。
またこの部分のエラーを取る、y_trainの形式も違うというエラーが新たに出ます。クラス分類なので、正解データは、1,0といったスカラー値ではなく、[1,0],[0,1]といった各要素が各クラスのウエイト1になるようなOne-hotベクトル形式にすべきです。

まず、モデル定義のところの修正が必要です。

Python

1model = Sequential() 2model.add(Conv2D(16, (3, 3), 3 input_shape=(150, 150, 3), activation='relu'))

以下のように修正して、RBGAの4次元に対応させます。

Python

1model = Sequential() 2model.add(Conv2D(16, (3, 3), 3 input_shape=(150, 150, 4), activation='relu'))

また、前処理において、yの形式を変更しましょう。さらに、上記の他に、forループでXが毎回上書きされているという間違いもあります。

Python

1for i in range(1, 61): 2 3(中略) 4 5 p1 = imageio.imread(f"/Users/K/Downloads/hifu_photos/melano/melano-{i:03d}.png").reshape(150,150,4) 6 X = p1 7 y = np.append(y, np.array([0], dtype = np.uint8)).reshape(-1,1) 8 9 10 p2 =imageio.imread(f"/Users/K/Downloads/hifu_photos/normal/normal-{i:03d}.png").reshape(150,150,4) 11 X = p2 12 y = np.append(y, np.array([1], dtype = np.uint8)).reshape(-1,1)

以下のように修正して、Xを追記しき、Xのshapeが(120, 150, 150, 4)になるようにします。最初の次元が60回ループ(×2画像)させた積み重ね方向です。また、yもOne-hotベクトル形式を積み重ねることで、shapeが(120, 2)になるのが正しいです。

Python

1X = np.empty((0,150,150,4)) 2y = np.empty((0,2)) 3for i in range(1, 61): 4 5(中略) 6 7 p1 = imageio.imread(f"/Users/K/Downloads/hifu_photos/melano/melano-{i:03d}.png").reshape(150,150,4) 8 p2 =imageio.imread(f"/Users/K/Downloads/hifu_photos/normal/normal-{i:03d}.png").reshape(150,150,4) 9 X = np.vstack([X, np.stack([p1, p2])]) 10 y = np.vstack([y, [[1, 0], [0, 1]]])

できあがったモデルで予測をした場合、結果はベクトル形式ででてきます。各要素が、対応するクラスの予測可能性に相当します。

投稿2020/11/08 15:27

編集2020/11/08 23:10
toast-uz

総合スコア3266

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

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

yy-_.15

2020/11/08 15:47

ご回答ありがとうございます。 上記のように書き換えてみたのですが、まだエラーの方が 上記のように出てきてしまいます。 他におかしい場所があるのでしょうか
yy-_.15

2020/11/09 01:15

すごい! できました!ありがとうございます!! コードの意味は自分で調べ、またわからない場合は質問させていただくかもしれません。。 よろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問