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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

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

Python

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

Q&A

解決済

1回答

2426閲覧

CNN Kerasを使っての画像認識 複数入力

退会済みユーザー

退会済みユーザー

総合スコア0

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

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

Python

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

0グッド

0クリップ

投稿2020/11/22 09:36

前提・実現したいこと

現在、画像のみを用いて位置推定をしようとしており、
入力で2枚の画像(自分の前後)を使うことで、推定しやすくなるのではないかと思い、
行っているのですが、以下のようなエラーがでてしまいどのようにすればよいかわかりません。
教えていただきたいです。

他にもおかしなところがありましたら、教えていただけると幸いです。

*classesのクラスは適当に変えています。

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

ValueError: Layer reshape_1 was called with an input that isn't a symbolic tensor. Received type: <class 'builtin_function_or_method'>. Full input: [<built-in function input>]. All inputs to the layer should be tensors.

該当のソースコード

from keras import backend as K from keras.datasets import mnist from keras.layers import Activation, Add, BatchNormalization, Dense, Dropout, Input, Concatenate, Flatten, Reshape from keras.models import Model from keras.utils.np_utils import to_categorical import matplotlib.pyplot as plt import numpy as np import glob from PIL import Image from keras.utils import np_utils from sklearn.model_selection import train_test_split from keras.preprocessing.image import load_img, img_to_array classes = [ "犬","猫","兎" ] X = [] Y = [] for index, classlabel in enumerate(classes): dir = "./" + classlabel files = glob.glob(dir + "/*.jpg") for i, file in enumerate(files): image = Image.open(file) image = image.convert("RGB") image = image.resize((64, 64)) data = np.asarray(image) X.append(data) Y.append(index) X = np.array(X) Y = np.array(Y) X = X.astype('float32')/255.0 Y = np_utils.to_categorical(Y, len(classes)) x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.10) # 各画像からランダムに2枚切り抜く。 x_train1_img = load_img('1.jpg', target_size=(64,64)) x_train1 = img_to_array(x_train1_img) x_train2_img = load_img('2.jpg', target_size=(64,64)) x_train2 = img_to_array(x_train2_img) # (N, 2, 28, 28) -> (N, 2, 400) にする x_train1 = x_train.reshape(len(x_train1), 2, -1) x_train2 = x_train.reshape(len(x_train2), 2, -1) x_test = x_test.reshape(len(x_test), 2, -1) # one-hot 表現に変換する。 y_train = to_categorical(y_train) y_test = to_categorical(y_test) # モデルを作成する。 input1 = Input(shape=(1,)) hidden1 = Reshape((64, 64, 1), input_shape = (64, 64))(input) input2 = Input(shape=(1,)) hidden2 = Reshape((64, 64, 1), input_shape = (64, 64))(input) # 入力1から結合前まで x = Dense(1, activation="relu")(hidden1) x = Model(inputs=hidden1, outputs=x) # 入力2から結合前まで y = Dense(1, activation="relu")(hidden2) y = Model(inputs=hidden2, outputs=y) # 結合 combined = Concatenate([x.output, y.output],axis=-1) # 密結合 z = Dense(32, activation="relu")(combined) z = Dense(3, activation="softmax")(z) # モデル定義とコンパイル model = Model(inputs=[input1, input2], outputs=z) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc']) model.summary() # 学習する。 history = model.fit([x_train1, x_train2], y_train, epochs=40)

試したこと

上のエラーに対して調べましたが、うまくいきませんでした。

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

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

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

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

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

toast-uz

2020/11/22 11:45

input1とinput2を結合させる、というのは、何かサンプルを元に実装されているのでしょうか?
toast-uz

2020/11/23 01:24

ありがとうございます。確認してみます。
guest

回答1

0

ベストアンサー

きちんと学習精度が出るのかは分かりませんが、エラー無く動くコードを示します。
質問者様のコードで疑問な部分は主に以下です。その点を修正しました。

  • 前処理でなぜか2枚だけの画像に限定している。
  • モデル作成部分で、質問者様が参照したサイトは入力次元が全く異なっている。それを質問者様の状況に当てはめきれていない。ちなみに質問者様は画像を前提としているため、CNN層を入れておきました。

いろいろコードを調べる際に、Kerasでの「マージモデル」の例を参照しました。それによると、画像とテキストなど、全く異なる学習結果をマージしているパターンが基本であるように思います。質問者様のような、等価な画像と画像をマージするのは、最初に1枚に画像を合成して通常のモデルで学習するのと、本質的には変わらないのでは、と考えます。

Python

1from keras import backend as K 2from keras.datasets import mnist 3from keras.layers import Activation, Input, Dense, Dropout, Concatenate, Flatten, Conv2D, MaxPool2D 4from keras.models import Model, Sequential 5from keras.utils.np_utils import to_categorical 6import matplotlib.pyplot as plt 7import numpy as np 8import glob 9from PIL import Image 10from keras.utils import np_utils 11from sklearn.model_selection import train_test_split 12from keras.preprocessing.image import load_img, img_to_array 13 14classes = [ 15 "犬","猫","兎" 16 ] 17 18X = [] 19Y = [] 20for index, classlabel in enumerate(classes): 21 dir = "./images/" + classlabel 22 files = glob.glob(dir + "/*.jpeg") 23 for i, file in enumerate(files): 24 image = Image.open(file) 25 image = image.convert("RGB") 26 image = image.resize((64, 64)) 27 data = np.asarray(image) 28 X.append(data) 29 Y.append(index) 30 31X = np.array(X) 32Y = np.array(Y) 33X = X.astype('float32')/255.0 34 35# ★★ ここからの前処理を修正 36 37# カテゴリー数 38num_classes = Y.max() - Y.min() + 1 39 40# 画像Xを、x1, x2 に分割して、正解ラベルyを新たに定義する 41split_size = len(X) // 2 42x1, x2, y1, y2 = train_test_split(X, Y, test_size=split_size, train_size=split_size) 43 44# yをy1とy2から作る、ここでは平均値としておく 犬と兎の平均は猫? 45y = (y1 + y2) // 2 46 47x_train1, x_test1, x_train2, x_test2, y_train, y_test = train_test_split(x1, x2, y, test_size=0.30) 48# ★★ ここまで修正 49 50# one-hot 表現に変換する。 51y_train = to_categorical(y_train, num_classes) 52y_test = to_categorical(y_test, num_classes) 53 54# ★★ ここからのモデルを画像用に修正 55# モデルを作成する。 56model1 = Sequential([ 57 Conv2D(64,3,input_shape=(64,64,3)), 58 Activation('relu'), 59 Conv2D(64,3), 60 Activation('relu'), 61 MaxPool2D(pool_size=(2,2)), 62 Flatten(), 63 Dense(1024), 64 Activation('relu') 65]) 66 67model2 = Sequential([ 68 Conv2D(64,3,input_shape=(64,64,3)), 69 Activation('relu'), 70 Conv2D(64,3), 71 Activation('relu'), 72 MaxPool2D(pool_size=(2,2)), 73 Flatten(), 74 Dense(1024), 75 Activation('relu') 76]) 77 78concatenated = Concatenate(axis=-1)([model1.output, model2.output]) 79 80# 密結合 81out = Dense(num_classes, activation='softmax')(concatenated) 82model = Model([model1.input, model2.input], out) 83 84# ★★ ここまで修正 85 86# モデルコンパイル 87model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc']) 88model.summary() 89 90# 学習する。 91history = model.fit([x_train1, x_train2], y_train, epochs=40)

投稿2020/11/23 10:40

toast-uz

総合スコア3266

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

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

退会済みユーザー

退会済みユーザー

2020/11/24 01:59

ありがとうございます。動かすことができました。 幾つかお聞きしたいことがあるのですが、 これは、1枚の画像データを2つに分割しているということでしょうか? そして分割した画像をそれぞれ畳み込みした後、concatenateで結合しているということなのでしょうか? そもそもの話になるのですが、このようなコードは、学習用画像に2枚の画像を使っているのでしょうか?それともテスト用画像に2枚の画像を使っているのでしょうか?
toast-uz

2020/11/24 22:34

いいえ。model1とmodel2に別の画像を入力しています。「画像Xを、x1, x2 に分割して」というのは、「配列Xを配列x1、x2に分割して」という意味です。要素としての画像は分割していません。 concatinaeはmodel1とmodel2の出力を横並びにつなげています。なので、最初から2枚の画像を横につなげたものと、本質的には変わらないのでは、とお伝えしています。こういうマージモデルが有効に機能するには、model1とmodel2の入力を変えるか、モデルを変えるか、といったことをする必要があると思います。 このコードはテストまでは実装していませんが、学習用にもテスト用にも2枚の画像を使います。機械学習一般の前提として、学習用・テスト用の入力は同じである必要があります。
toast-uz

2020/11/24 22:39

おそらく質問者様の状況は、画像「だけ」で位置を求めるものではなく、GPSや屋内センシングなど、他の手段を併用しているのではないでしょうか。すると、位置という正解ラベルに対して、画像系とセンサー系の2系統の入力をマージして学習するのが効果がある可能性があります。そういう使い方であればマージモデルが合うかもしれません。
退会済みユーザー

退会済みユーザー

2020/11/25 01:50 編集

丁寧に回答していただきありがとうございます。 何度も聞いてしまい申し訳ないのですが、 これは、3クラスの中から適当に画像1枚を2つに分けている(x1,x2は同じ配列)ということなのでしょうか? その場合、自分の選んだ任意の画像(例:1.jpgと2.jpg)という画像を使えるのでしょうか? 一応お答えすると、本当に画像のみを使って位置推定をしています。 センサー系は一切使っておりません。
toast-uz

2020/11/25 03:38

> 3クラスの中から適当に画像1枚を2つに分けている(x1,x2は同じ配列)ということなのでしょうか? いいえ。3クラスの画像合計N枚を、N // 2 枚ずつに分割しています。抽出はランダムです。1枚の画像を画像として分割することはしていません。 > 自分の選んだ任意の画像(例:1.jpgと2.jpg)という画像を使えるのでしょうか? 分割のやり方は自由に変えて良いです。ただし、同じ枚数かつ多数枚の画像が必要です。訓練データですので1枚ずつ(1.jpgと2.jpg)ではダメです。 > センサー系は一切使っておりません。 なかなかチャレンジャブルですね。
退会済みユーザー

退会済みユーザー

2020/11/25 09:40 編集

何度も詳しく回答して頂きありがとうございます。 分割方法として、 x1=["猫1.jpg","犬1.jpg"] x2=["猫2.jpg","犬2.jpg"] などのように指定すればよいのでしょうか?
toast-uz

2020/11/25 10:52 編集

それが100枚〜数百枚ずつあるイメージです。でもって、x1とx2の各要素のペアに対応する位置が正解ラベルyとして必要です。"猫1.jpg"と"猫2.jpg"のペアに対して、"公園"とか座標とか、位置を表して最終的に推論したい答えが必要です。
退会済みユーザー

退会済みユーザー

2020/11/26 00:53

ありがとうございます。 頑張ってやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問