前提・実現したいこと
以下のコードを実行するとValueErrorになってしまいます。何が原因なのかわかりません。
発生している問題・エラーメッセージ
Epoch 1/50 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-7-0bdf069155bb> in <module> 11 epochs=50, 12 verbose = 1, ---> 13 callbacks =[earlystopping] 14 ) 15 C:\ProgramData\Anaconda3\lib\site-packages\keras\legacy\interfaces.py in wrapper(*args, **kwargs) 89 warnings.warn('Update your `' + object_name + 90 '` call to the Keras 2 API: ' + signature, stacklevel=2) ---> 91 return func(*args, **kwargs) 92 wrapper._original_function = func 93 return wrapper C:\ProgramData\Anaconda3\lib\site-packages\keras\models.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch) 1254 use_multiprocessing=use_multiprocessing, 1255 shuffle=shuffle, -> 1256 initial_epoch=initial_epoch) 1257 1258 @interfaces.legacy_generator_methods_support C:\ProgramData\Anaconda3\lib\site-packages\keras\legacy\interfaces.py in wrapper(*args, **kwargs) 89 warnings.warn('Update your `' + object_name + 90 '` call to the Keras 2 API: ' + signature, stacklevel=2) ---> 91 return func(*args, **kwargs) 92 wrapper._original_function = func 93 return wrapper C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch) 2175 outs = self.train_on_batch(x, y, 2176 sample_weight=sample_weight, -> 2177 class_weight=class_weight) 2178 2179 if not isinstance(outs, list): C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py in train_on_batch(self, x, y, sample_weight, class_weight) 1841 sample_weight=sample_weight, 1842 class_weight=class_weight, -> 1843 check_batch_axis=True) 1844 if self.uses_learning_phase and not isinstance(K.learning_phase(), int): 1845 ins = x + y + sample_weights + [1.] C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_batch_axis, batch_size) 1436 for (ref, sw, cw, mode) 1437 in zip(y, sample_weights, class_weights, self._feed_sample_weight_modes)] -> 1438 _check_array_lengths(x, y, sample_weights) 1439 _check_loss_and_target_compatibility(y, 1440 self._feed_loss_fns, C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py in _check_array_lengths(inputs, targets, weights) 215 'the same number of samples as target arrays. ' 216 'Found ' + str(list(set_x)[0]) + ' input samples ' --> 217 'and ' + str(list(set_y)[0]) + ' target samples.') 218 if len(set_w) > 1: 219 raise ValueError('All sample_weight arrays should have ' ValueError: Input arrays should have the same number of samples as target arrays. Found 18 input samples and 16 target samples.
該当のソースコード
from keras.models import Sequential from keras.layers import Conv2D from keras import backend as K from keras.preprocessing.image import ImageDataGenerator from PIL import Image import os import numpy as np from keras.callbacks import EarlyStopping model = Sequential() model.add(Conv2D(filters=64, kernel_size=9, padding="same", activation="relu", input_shape=(None,None,3) )) model.add(Conv2D(filters=32, kernel_size=1, padding="same", activation="relu", )) model.add(Conv2D(filters=3, kernel_size=5, padding="same", )) model.summary() def psnr(y_true, y_pred): return -10*K.log(K.mean(K.flatten((y_true - y_pred))**2 ))/np.log(10) BATCH_SIZE = 16 N_TRAIN_DATA = 19440 N_TEST_DATA = 1728 class SegDataGenerator(object): def __init__(self): self.reset() def reset(self): self.x_images = [] self.y_images = [] def flow_from_directory(self,directory, batch_size): folderlist = os.listdir(directory) x_path = directory + "\" + folderlist[0] y_path = directory + "\" + folderlist[1] x_filelist = os.listdir(x_path) y_filelist = os.listdir(y_path) while True: for x_file, y_file in zip(x_filelist, y_filelist): with Image.open(x_path + "\" + x_file) as f: self.x_images.append(np.asarray(f.convert("RGB"), dtype=np.float32)) with Image.open(y_path + "\" + y_file) as t: self.y_images.append(np.asarray(t.convert("RGB"), dtype=np.float32)) if len(self.y_images) == batch_size: y = np.asarray(self.y_images, dtype=np.float32) x = np.asarray(self.x_images, dtype=np.float32) self.reset() yield x/255., y/255., data_gen = SegDataGenerator() train_datagenerator = data_gen.flow_from_directory("トレインファイルパス", batch_size=BATCH_SIZE) test_datagenerator= data_gen.flow_from_directory("テストファイルパス", batch_size=BATCH_SIZE) earlystopping = EarlyStopping(monitor="val_loss",patience=2) model.compile(loss="mean_squared_error", optimizer="adam", metrics=[psnr]) model.fit_generator(train_datagenerator, validation_data = test_datagenerator, steps_per_epoch=N_TRAIN_DATA//BATCH_SIZE, validation_steps=N_TEST_DATA//BATCH_SIZE, epochs=50, verbose = 1, callbacks =[earlystopping] ) pred = model.predict(x_test)
試したこと
generatorの出力の形状を調べると(2,16,100,100,3)でした。
補足情報(FW/ツールのバージョンなど)
python3.6.6
keras2.1.3
あなたの回答
tips
プレビュー