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

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

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

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

Q&A

解決済

1回答

2156閲覧

Python3 InvalidArgumentError: Incompatible shapesについて

SuzuAya

総合スコア71

Python 3.x

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

0グッド

0クリップ

投稿2019/05/13 06:38

前提・実現したいこと

自作のデータセットでVAEを実装しています。
以下のようなエラーが発生してしまい、バッチサイズが影響しているようなのですが、修正方法が分かりません。
同じような質問はいくつかあったのですが、どう適用してよいか分からなかったため、質問をさせていただきました。
恐れ入りますが修正方法についてアドバイスしていただけますと幸いです。
https://teratail.com/questions/141391
https://teratail.com/questions/93251

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

InvalidArgumentError Traceback (most recent call last) <ipython-input-21-907c1a122678> in <module>() 319 batch_size=batch_size, 320 validation_data=(x_test, None), --> 321 callbacks = callbacks) 5 frames /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/errors_impl.py in __exit__(self, type_arg, value_arg, traceback_arg) 526 None, None, 527 compat.as_text(c_api.TF_Message(self.status.status)), --> 528 c_api.TF_GetCode(self.status.status)) 529 # Delete the underlying status object from memory otherwise it stays alive 530 # as there is a reference to status from this from the traceback due to InvalidArgumentError: Incompatible shapes: [20,512,496] vs. [20] [[{{node training_5/Adam/gradients/add_21_grad/BroadcastGradientArgs}}]]

該当のソースコード

from __future__ import absolute_import from __future__ import division from __future__ import print_function from keras.layers import Lambda, Input, Dense from keras.models import Model from keras.models import Sequential, model_from_json from keras.losses import mse, binary_crossentropy from keras.layers import Conv2D, Flatten, Lambda from keras.layers import Reshape, Conv2DTranspose from keras.utils import plot_model, np_utils from keras.utils import plot_model from keras.callbacks import Callback, EarlyStopping, TensorBoard, ModelCheckpoint, LearningRateScheduler, CSVLogger from keras import optimizers from keras import backend as K from keras.preprocessing.image import array_to_img, img_to_array,load_img from keras.preprocessing.image import ImageDataGenerator import numpy as np import matplotlib.pyplot as plt import argparse import os import re import glob import random as rn import tensorflow as tf import cv2 import easydict from PIL import Image from google.colab.patches import cv2_imshow import warnings warnings.filterwarnings('ignore') %matplotlib inline def sampling(args): z_mean, z_log_var = args batch = K.shape(z_mean)[0] dim = K.int_shape(z_mean)[1] # by default, random_normal has mean=0 and std=1.0 epsilon = K.random_normal(shape=(batch, dim)) return z_mean + K.exp(0.5 * z_log_var) * epsilon #original dataset #train filenames = glob.glob("./NORMAL_resize_100_1_0506/*.jpeg") X = [] for filename in filenames: img = img_to_array(load_img( filename, color_mode = "grayscale" , target_size=(512,496))) X.append(img) X = np.asarray(X) #test img_size = (512,496) dir_name = './NORMAL_resize_0506' file_type = 'jpeg' img_list = glob.glob('./' + dir_name + '/*.' + file_type) test_img_array_list = [] for img in img_list: test_img = load_img(img,grayscale=True,target_size=(img_size)) test_img_array = img_to_array(test_img) /255 test_img_array_list.append(test_img_array) test_img_array_list = np.array(test_img_array_list) np.save(dir_name+'.npy',test_img_array_list) del test_img_array_list # test_img_array_listをメモリから解放 x_test = np.load('./NORMAL_resize_0506.npy') print(x_test.shape) image_size = X.shape[1] original_dim = 512 * 496 *1 #3削除 x_train = np.reshape(X, [-1, 512, 496, 1])# x_train = np.reshape(X, [-1, original_dim, 1]) x_test = np.reshape(x_test, [-1, 512, 496, 1])# x_test = np.reshape(X, [-1, original_dim, 1]) x_train = x_train.astype('float32') / 255 #x_test = x_test.astype('float32') / 255 print(x_train.shape) print(x_test.shape) # network parameters input_shape = (512, 496, 1) kernel_size = 3 filters = 16 #intermediate_dim = 512 batch_size = 20#128 latent_dim = 2 # Dimensionality of the latent space: a plane 潜在空間の次元数:平面 epochs = 5#50 # build encoder model inputs = Input(shape=input_shape, name='encoder_input') x = inputs for i in range(4): filters *= 2 x = Conv2D(filters=filters,kernel_size=kernel_size,activation='relu',strides=2,padding='same')(x) # shape info needed to build decoder model shape = K.int_shape(x) # generate latent vector Q(z|X) x = Flatten()(x) x = Dense(64, activation='relu')(x) z_mean = Dense(latent_dim, name='z_mean')(x) z_log_var = Dense(latent_dim, name='z_log_var')(x) # use reparameterization trick to push the sampling out as input # note that "output_shape" isn't necessary with the TensorFlow backend z = Lambda(sampling, output_shape=(latent_dim,), name='z')([z_mean, z_log_var]) # instantiate encoder model encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder') encoder.summary() plot_model(encoder, to_file='vae_mlp_encoder.png', show_shapes=True) # build decoder model latent_inputs = Input(shape=(latent_dim,), name='z_sampling') x = Dense(shape[1] * shape[2] * shape[3], activation='relu')(latent_inputs) x = Reshape((shape[1], shape[2], shape[3]))(x) for i in range(4): x = Conv2DTranspose(filters=filters, kernel_size=kernel_size, activation='relu', strides=2, padding='same')(x) filters //= 2 outputs = Conv2DTranspose(filters=1, kernel_size=kernel_size, activation='sigmoid', padding='same', name='decoder_output')(x) # instantiate decoder model decoder = Model(latent_inputs, outputs, name='decoder') decoder.summary() plot_model(decoder, to_file='vae_mlp_decoder.png', show_shapes=True) # instantiate VAE model outputs = decoder(encoder(inputs)[2]) vae = Model(inputs, outputs, name='vae_mlp') if __name__ == '__main__': args = easydict.EasyDict({ "batchsize": 20,#40, "epoch": 5,#50, #"gpu": 0, "out": "result", "resume": False, #"unit": 1000 }) #parser = argparse.ArgumentParser() #help_ = "Load h5 model trained weights" #parser.add_argument("-w", "--weights", help=help_) #help_ = "Use mse loss instead of binary cross entropy (default)" #parser.add_argument("-m", #"--mse", #help=help_, action='store_true') #args = parser.parse_args() models = (encoder, decoder) data = (x_test)#, y_test削除 os.environ['PYTHONHASHSEED'] = '0' np.random.seed(5) rn.seed(5) config = tf.ConfigProto( gpu_options=tf.GPUOptions( visible_device_list="0,1", # specify GPU number allow_growth=True ) ) tf.set_random_seed(5) sess = tf.Session(graph=tf.get_default_graph(), config=config) K.set_session(sess) # VAE loss = mse_loss or xent_loss + kl_loss #if args.mse: #reconstruction_loss = mse(inputs, outputs) #else: reconstruction_loss = binary_crossentropy(inputs, outputs) reconstruction_loss *= original_dim kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var) kl_loss = K.sum(kl_loss, axis=-1) kl_loss *= -0.5 vae_loss = K.mean(reconstruction_loss + kl_loss) vae.add_loss(vae_loss) vae.compile(optimizer='adam') vae.summary() plot_model(vae, to_file='vae_mlp.png', show_shapes=True) callbacks = [] callbacks.append(ModelCheckpoint(filepath="model.ep{epoch:02d}.h5"))# 各epochでのモデルの保存 callbacks.append(EarlyStopping(monitor='val_loss', patience=0, verbose=1)) #callbacks.append(LearningRateScheduler(lambda ep: float(1e-3 / 3 ** (ep * 4 // 5))))# MAX_EPOCH削除, 5追記 callbacks.append(CSVLogger("history.csv")) #if args.weights: #vae.load_weights(args.weights) #else: # train the autoencoder history = vae.fit(x_train, epochs=epochs, batch_size=batch_size, validation_data=(x_test, None), callbacks = callbacks) score = model.evaluate(x_test, verbose=0)#y_test削除 print('Test loss:', score[0]) print('Test accuracy:', score[1]) plt.plot(history.history["acc"], label="acc", ls="-", marker="o") plt.plot(history.history["val_acc"], label="val_acc", ls="-", marker="x") plt.ylabel("accuracy") plt.xlabel("epoch") plt.legend(loc="best") plt.show()

試したこと

inputshapeを色々修正してみたりしたのですが、うまくいきませんでした。

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

Google Colabを使用しています。

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

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

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

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

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

guest

回答1

0

自己解決

結局、train/test画像の形状とinput_shape、build encorder/decoder modelの部分をkerasのサンプルコード通りに修正したところ、うまく動きました。
根本的な解決になっていないかもしれませんが、動いたコードを共有させていただきます。

from __future__ import absolute_import from __future__ import division from __future__ import print_function from keras.layers import Lambda, Input, Dense from keras.models import Model from keras.models import Sequential, model_from_json from keras.losses import mse, binary_crossentropy from keras.layers import Conv2D, Flatten, Lambda from keras.layers import Reshape, Conv2DTranspose from keras.utils import plot_model, np_utils from keras.utils import plot_model from keras.callbacks import Callback, EarlyStopping, TensorBoard, ModelCheckpoint, LearningRateScheduler, CSVLogger from keras import optimizers from keras import backend as K from keras.preprocessing.image import array_to_img, img_to_array,load_img from keras.preprocessing.image import ImageDataGenerator import numpy as np import matplotlib.pyplot as plt import argparse import os import re import glob import random as rn import tensorflow as tf import cv2 import easydict from PIL import Image from google.colab.patches import cv2_imshow import warnings warnings.filterwarnings('ignore') %matplotlib inline get_ipython().run_line_magic('matplotlib', 'inline') def sampling(args): """Reparameterization trick by sampling fr an isotropic unit Gaussian. # Arguments args (tensor): mean and log of variance of Q(z|X) # Returns z (tensor): sampled latent vector """ z_mean, z_log_var = args batch = K.shape(z_mean)[0] dim = K.int_shape(z_mean)[1] # by default, random_normal has mean=0 and std=1.0 epsilon = K.random_normal(shape=(batch, dim)) return z_mean + K.exp(0.5 * z_log_var) * epsilon #original dataset #train filenames = glob.glob("./NORMAL_resize_100_1_0506/*.jpeg") X = [] for filename in filenames: img = img_to_array(load_img( filename, color_mode = "grayscale" , target_size=(512,496))) X.append(img) #Y.append(0) X = np.asarray(X) #test img_size = (512,496) dir_name = './NORMAL_resize_0506' file_type = 'jpeg' img_list = glob.glob('./' + dir_name + '/*.' + file_type) test_img_array_list = [] for img in img_list: test_img = load_img(img,grayscale=True, target_size=(img_size))#元々はgrayscale=False test_img_array = img_to_array(test_img) /255 test_img_array_list.append(test_img_array) test_img_array_list = np.array(test_img_array_list) np.save(dir_name+'.npy',test_img_array_list) del test_img_array_list # test_img_array_listをメモリから解放 x_test = np.load('./NORMAL_resize_0506.npy') print(x_test.shape) image_size = (512, 496)#X.shape[1] original_dim = 512 * 496 #3削除 x_train = np.reshape(X, [-1, original_dim])# x_train = np.reshape(X, [-1, original_dim, 1]) x_test = np.reshape(x_test, [-1, original_dim])# x_test = np.reshape(X, [-1, original_dim, 1]) x_train = x_train.astype('float32') / 255 # network parameters input_shape = (original_dim, ) intermediate_dim = 8#512 batch_size = 32#128 latent_dim = 2 epochs = 5#50 # VAE model = encoder + decoder # build encoder model inputs = Input(shape=input_shape, name='encoder_input') x = Dense(intermediate_dim, activation='relu')(inputs) z_mean = Dense(latent_dim, name='z_mean')(x) z_log_var = Dense(latent_dim, name='z_log_var')(x) # use reparameterization trick to push the sampling out as input # note that "output_shape" isn't necessary with the TensorFlow backend z = Lambda(sampling, output_shape=(latent_dim,), name='z')([z_mean, z_log_var]) # instantiate encoder model encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder') encoder.summary() plot_model(encoder, to_file='vae_mlp_encoder.png', show_shapes=True) # build decoder model latent_inputs = Input(shape=(latent_dim,), name='z_sampling') x = Dense(intermediate_dim, activation='relu')(latent_inputs) outputs = Dense(original_dim, activation='sigmoid')(x) # instantiate decoder model decoder = Model(latent_inputs, outputs, name='decoder') decoder.summary() plot_model(decoder, to_file='vae_mlp_decoder.png', show_shapes=True) # instantiate VAE model outputs = decoder(encoder(inputs)[2]) vae = Model(inputs, outputs, name='vae_mlp') if __name__ == '__main__': parser = argparse.ArgumentParser() help_ = "Load h5 model trained weights" parser.add_argument("-w", "--weights", help=help_) help_ = "Use mse loss instead of binary cross entropy (default)" parser.add_argument("-m", "--mse", help=help_, action='store_true') args = parser.parse_args([])#jupyter notebookを利用していない場合はargs = parser.parse_args()   models = (encoder, decoder) data = (x_test) # VAE loss = mse_loss or xent_loss + kl_loss if args.mse: reconstruction_loss = mse(inputs, outputs) else: reconstruction_loss = binary_crossentropy(inputs, outputs) reconstruction_loss *= original_dim kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var) kl_loss = K.sum(kl_loss, axis=-1) kl_loss *= -0.5 vae_loss = K.mean(reconstruction_loss + kl_loss) vae.add_loss(vae_loss) vae.compile(optimizer='adam') vae.summary() plot_model(vae, to_file='vae_mlp.png', show_shapes=True) callbacks = [] callbacks.append(ModelCheckpoint(filepath="model.ep{epoch:02d}.h5"))# 各epochでのモデルの保存 callbacks.append(EarlyStopping(monitor='val_loss', patience=0, verbose=1)) #callbacks.append(LearningRateScheduler(lambda ep: float(1e-3 / 3 ** (ep * 4 // 5))))# MAX_EPOCH削除, 5追記 callbacks.append(CSVLogger("history.csv")) if args.weights: vae.load_weights(args.weights) else: # train the autoencoder history=vae.fit(x_train, epochs=epochs, batch_size=batch_size, validation_data=(x_test, None), callbacks = callbacks) #vae.save_weights('vae_mlp_mnist.h5') plot_results(models, data, batch_size=batch_size, model_name="vae_mlp")

投稿2019/05/13 12:20

編集2019/05/13 12:22
SuzuAya

総合スコア71

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問