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

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

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

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Python 3.x

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

Q&A

0回答

598閲覧

CNN構築におけるmodel.fitエラー

k.s08

総合スコア0

Keras

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Python 3.x

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

0グッド

0クリップ

投稿2022/12/23 08:46

編集2022/12/23 08:49

前提

3入力1出力のCNNを構築しています。
今回はmodel.fitの段階でエラーが生じたため質問させていただきます。

実現したいこと

構築したCNNで正常に学習させたい

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

Traceback (most recent call last):
File "C:\dl\data\3input.py", line 128, in <module>
hist = model.fit([train_generator1,train_generator2,train_generator3],
File "C:\Users\sherl\AppData\Local\Programs\Python\Python310\lib\site-packages\keras\utils\traceback_utils.py", line 70, in error_handler
raise e.with_traceback(filtered_tb) from None
File "C:\Users\sherl\AppData\Local\Programs\Python\Python310\lib\site-packages\keras\engine\data_adapter.py", line 1083, in select_data_adapter
raise ValueError(
ValueError: Failed to find data adapter that can handle input: (<class 'list'> containing values of types {"<class 'keras.preprocessing.image.DirectoryIterator'>"}), <class 'NoneType'>

該当のソースコード

from keras.layers import Input, Dense, concatenate
from keras.models import Model
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator
from PIL import Image
import keras
import glob
import numpy as np
import os

num_classes = 3
batch_size = 16
epochs = 100
data_dir = './comp'
filename = '3inputs'

inputs1 = Input(shape=(256,256,3))
inputs2 = Input(shape=(256,256,3))
inputs3 = Input(shape=(256,256,3))

X = []
Y = []

#for Dimple
for f in glob.glob('/comp/D/*.jpg'):
fname = os.path.split(f)[1]
file_path = '/comp/D/'+ fname
im = np.assary(Image.open(file_path))
X.append(im)
label = [0]
Y.append(label)

#for QC
for f in glob.glob('/comp/QC/*.jpg'):
fname = os.path.split(f)[1]
file_path = '/comp/QC/'+ fname
im = np.assary(Image.open(file_path))
X.append(im)
label = [1]
Y.append(label)

#for IG
for f in glob.glob('/comp/IG/*.jpg'):
fname = os.path.split(f)[1]
file_path = '/comp/IG/'+ fname
im = np.assary(Image.open(file_path))
X.append(im)
label = [2]
Y.append(label)

X = np.array(X)
Y = np.array(Y)

X_train = X.astype('float32') / 256

Y_train = keras.utils.to_categorical(Y, num_classes)

x = Dense(64, activation = "relu")(inputs1)
x = Dense(64, activation = "relu")(x)

y = Dense(64, activation = "relu")(inputs2)
y = Dense(64, activation = "relu")(y)

z = Dense(64, activation = "relu")(inputs3)
z = Dense(64, activation = "relu")(z)

combined = concatenate([x, y, z])

prediction = Dense(10, activation = "softmax")(combined)

model = Model(inputs = [inputs1, inputs2, inputs3], outputs = prediction)
model.compile(optimizer = SGD(lr = 0.0001, momentum = 0.9),
loss = 'categorical_crossentropy',
metrics = ['accuracy'],
)
model.summary()

#//------Generator1-------//
train_datagen1 = ImageDataGenerator(
rescale= 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip= True
)

validation_datagen1 = ImageDataGenerator(rescale = 1./255)

train_generator1 = train_datagen1.flow_from_directory(
data_dir,
target_size = (256,256),
batch_size = batch_size,
class_mode = 'categorical',
shuffle = True
)

validation_generator1 = validation_datagen1.flow_from_directory(
data_dir,
target_size = (256,256),
batch_size = batch_size,
class_mode = 'categorical',
shuffle = True
)

#//------Generator2-------//
train_datagen2 = ImageDataGenerator(
rescale= 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip= True
)

validation_datagen2 = ImageDataGenerator(rescale = 1./255)

train_generator2 = train_datagen2.flow_from_directory(
data_dir,
target_size = (256,256),
batch_size = batch_size,
class_mode = 'categorical',
shuffle = True
)

validation_generator2 = validation_datagen2.flow_from_directory(
data_dir,
target_size = (256,256),
batch_size = batch_size,
class_mode = 'categorical',
shuffle = True
)

#//------Generator3-------//
train_datagen3 = ImageDataGenerator(
rescale= 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip= True
)

validation_datagen3 = ImageDataGenerator(rescale = 1./255)

train_generator3 = train_datagen3.flow_from_directory(
data_dir,
target_size = (256,256),
batch_size = batch_size,
class_mode = 'categorical',
shuffle = True
)

validation_generator3 = validation_datagen3.flow_from_directory(
data_dir,
target_size = (256,256),
batch_size = batch_size,
class_mode = 'categorical',
shuffle = True
)
#//-------Generator END-------//

hist = model.fit([train_generator1,train_generator2,train_generator3],
epochs = epochs,
verbose= 1,
validation_data = [validation_generator1, validation_generator2, validation_generator3]
)

試したこと

エラー文を見る限り、データ前処理の段階で不具合があるようなので、色々書き換えてみましたが、現状は迷走してしまっています、、、。

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

python

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

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

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

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

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

PondVillege

2022/12/25 19:46 編集

ツッコミどころが多すぎてなかなか回答が付かないものと思われます. 1. そもそもCNNを構築していない.作られたものは全結合NN. 2. おそらく作るべきは1画像(256, 256, 3)入力3カテゴリ(3,)出力.なのに全結合NNなせいで出力の形状が(256, 256, 10, 1930)のmodelができている. 3. 3画像入力1出力だと考えるとラベルの作り方(現状3画像につき3ラベルを作っている事)と矛盾する. 4. ImageDataGeneratorの動作の理解不足からくる3つのジェネレータ作成.1つで良いはず.3種の画像に対して別々のDAを採用したいにしても書き方が異なる. 5. Train用のDataLoaderとValidation用のDataLoaderの作り方を間違えている.Train用ならsubset = "train",Validation用ならsubset = "valid"等のキーワード引数指定が必要. 6. 序盤のglobを利用したデータ読み込みも行っているが,カレントディレクトリにあるcompではなくルートディレクトリにあるcompからのデータ読み出しを行っており,非常に謎.flow_from_directoryは前者からのデータ読み出しができている. 7. 序盤のglobを利用した画像ローディングのまま進めるのか,ImageDataGenerator.flow_from_directory()を利用した画像ローディング及びオンラインDAを利用するのか決める.ImageDataGenerator.flow()の利用であれば序盤のglobを利用した画像ローディングを生かすことができる. 経験不足からくる謎コーディングだと思いますが,とりあえず次のサイトが最も解答に近いと思われます. https://pynote.hatenablog.com/entry/keras-image-data-generator-usage get_fileは済んだものとしてコードを書き進め,独自のCNNを次の記事を参考にして作成してください https://qiita.com/sasayabaku/items/9e376ba8e38efe3bcf79#%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%AE%9A%E7%BE%A9 とりあえず,1出力は何を意図するのか示してください.分類か回帰かだけでもデータ前処理に大きく関与します.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問