下記のようなコードで画像分類器を作成したいと考えています。
しかし、エラーが発生してしまい実行できません。
コードは同じ本から採用しています。
解決方法がありましたら、教えていただけますでしょうか。
よろしくお願い致します。
model_and_weight.h5と1.jpgというファイルは、同階層に保存済みです。
python
from PIL import Image import os, glob from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras.optimizers import RMSprop from keras.utils import np_utils import keras import numpy as np import sys, os from keras.models import load_model imsize = (150, 150) keras_param = "model_and_weight.h5" testpic = "1.jpg" def load_image(path): img = Image.open(path) img = img.convert('RGB') img = img.resize(imsize) img = np.asarray(img) img = img / 255.0 return img model = load_model(keras_param) img = load_image(testpic) prd = model.predict(np.array([img])) print(prd) prelabel = np.argmax(prd, axis=1) if prelabel == 0: print(">>> 犬") elif prelabel == 1: print(">>> 猫")
下記に記載したのがエラー内容
python
WARNING:tensorflow:Model was constructed with shape (None, 4, 4, 512) for input KerasTensor(type_spec=TensorSpec(shape=(None, 4, 4, 512), dtype=tf.float32, name='flatten_input'), name='flatten_input', description="created by layer 'flatten_input'"), but it was called on an input with incompatible shape (None, 150, 150, 3). --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-12-baa28c867e4e> in <module> 35 model = load_model(keras_param) 36 img = load_image(testpic) ---> 37 prd = model.predict(np.array([img])) 38 # print(prd) # 精度の表示 39 prelabel = np.argmax(prd, axis=1)
学習済みファイルの作成コード
python
from keras.applications.vgg16 import VGG16 from keras.preprocessing.image import ImageDataGenerator from keras.layers import Input import numpy as np import os num_train =2000 num_validation=800 img_h,img_w=150,150 channels=3 batch_size=32 train_data_dir='data/train' validation_data_dir='data/validation' result_dir='results' if not os.path.exists(result_dir): os.mkdir(result_dir) def save_VGG16_outputs(): model=VGG16( include_top=False, weights='imagenet', input_shape=(img_h,img_w,channels)) model.summary() datagen=ImageDataGenerator(rescale=1.0/255) train_generator=datagen.flow_from_directory( train_data_dir, target_size=(img_w,img_h), batch_size=batch_size, class_mode=None, shuffle=False) print('train-label:',train_generator.class_indices) vgg16_train=model.predict_generator( train_generator, verbose=1) np.save(os.path.join(result_dir,'vgg16_train.npy'),vgg16_train) validation_generator=datagen.flow_from_directory( validation_data_dir, target_size=(img_w,img_h), batch_size=batch_size, class_mode=None, shuffle=False) print('test-label:',validation_generator.class_indices) vgg16_test=model.predict( validation_generator, verbose=1) np.save(os.path.join(result_dir,'vgg16_test.npy'),vgg16_test) save_VGG16_outputs() import os import numpy as np from keras.models import Sequential from keras import optimizers from keras.layers import Activation,Dropout,Flatten,Dense def train_FClayer(): train_data=np.load( os.path.join(result_dir,'vgg16_train.npy')) print(train_data.shape) train_labels=np.array( [0]*int(num_train/2)+[1]*int(num_train/2)) validation_data=np.load( os.path.join(result_dir,'vgg16_test.npy')) print(validation_data.shape) validation_labels=np.array( [0]*int(num_validation/2)+[1]*int(num_validation/2)) model=Sequential() model.add(Flatten(input_shape=train_data.shape[1:])) model.add(Dense(256,activation='relu')) model.add(Dense(1,activation='sigmoid')) model.compile( loss='binary_crossentropy', metrics=['accuracy'], optimizer=optimizers.SGD(lr=1e-4,momentum=0.9),) epoch=60 batch_size=32 history=model.fit(train_data, train_labels, epochs=epoch, batch_size=batch_size, verbose=1, validation_data=(validation_data,validation_labels)) with open('model.json','w') as json_file: json_file.write(model.to_json()) model.save('model_and_weight.h5') return history history=train_FClayer()
画像の処理コード
python
from keras.applications.vgg16 import VGG16 from keras.preprocessing.image import ImageDataGenerator from keras.layers import Input import numpy as np import os num_eva =1 img_h,img_w=150,150 channels=3 batch_size=32 eva_data_dir='data/evaluation' result_dir='results' if not os.path.exists(result_dir): os.mkdir(result_dir) def save_VGG16_outputs(): model=VGG16( include_top=False, weights='imagenet', input_shape=(img_h,img_w,channels)) model.summary() datagen=ImageDataGenerator(rescale=1.0/255) eva_generator=datagen.flow_from_directory( eva_data_dir, target_size=(img_w,img_h), batch_size=batch_size, class_mode=None, shuffle=False) print('eva-label:',eva_generator.class_indices) vgg16_eva=model.predict_generator( eva_generator, verbose=1) np.save(os.path.join(result_dir,'vgg16_eva.npy'),vgg16_eva) print(vgg16_eva.shape) save_VGG16_outputs() Model: "vgg16" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_2 (InputLayer) [(None, 150, 150, 3)] 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 150, 150, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 150, 150, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 75, 75, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 75, 75, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 75, 75, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 37, 37, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 37, 37, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 37, 37, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 37, 37, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 18, 18, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 18, 18, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 18, 18, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 18, 18, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 9, 9, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 9, 9, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 9, 9, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 9, 9, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 4, 4, 512) 0 ================================================================= Total params: 14,714,688 Trainable params: 14,714,688 Non-trainable params: 0 _________________________________________________________________ Found 1 images belonging to 1 classes. eva-label: {'1': 0} 1/1 [==============================] - 2s 2s/step (1, 4, 4, 512)
まだ回答がついていません
会員登録して回答してみよう