前提・実現したいこと
以前学習させたものの正解率が低かったため、画像の反転やズームなどによって学習データを水増しさせたいのですが、以下のようなエラーが出てしまいます。
エラーを解決して学習を開始したいです!
よろしくお願いいたします。
発生している問題・エラーメッセージ
ValueError: Error when checking target: expected sequential_1 to have shape (4,) but got array with shape (1,)
該当のソースコード
Python
1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3""" 4Created on Fri Feb 7 22:12:26 2020 5 6@author: kanta 7""" 8 9import os 10from keras.applications.vgg16 import VGG16 11from keras.preprocessing.image import ImageDataGenerator 12from keras.models import Sequential, Model 13from keras.layers import Input, Activation, Dropout, Flatten, Dense 14from keras.preprocessing.image import ImageDataGenerator 15from keras import optimizers 16import numpy as np 17import time 18 19# 分類するクラス 20classes = ['arin', 'kanako', 'reni', 'shiori'] 21nb_classes = len(classes) 22 23IMG_HEIGHT = 150 24IMG_WIDTH = 150 25 26 27# トレーニング用とバリデーション用の画像格納先 28train_data_dir = '/dataset/train' 29validation_data_dir = '/dataset/validation' 30 31 32nb_train_samples = 24446 33nb_validation_samples = 389 34 35batch_size = 16 36nb_epoch = 20 37 38result_dir = 'results' 39if not os.path.exists(result_dir): 40 os.mkdir(result_dir) 41 42 43def vgg_model_maker(): 44 """ VGG16のモデルをFC層以外使用。FC層のみ作成して結合して用意する """ 45 46 # VGG16のロード。FC層は不要なので include_top=False 47 input_tensor = Input(shape=(IMG_WIDTH, IMG_HEIGHT, 3)) 48 vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor) 49 50 # FC層の作成 51 top_model = Sequential() 52 top_model.add(Flatten(input_shape=vgg16.output_shape[1:])) 53 top_model.add(Dense(256, activation='relu')) 54 top_model.add(Dropout(0.5)) 55 top_model.add(Dense(nb_classes, activation='softmax')) 56 57 # VGG16とFC層を結合してモデルを作成 58 model = Model(input=vgg16.input, output=top_model(vgg16.output)) 59 60 return model 61 62 63def image_generator(): 64 """ ディレクトリ内の画像を読み込んでトレーニングデータとバリデーションデータの作成 """ 65 train_datagen = ImageDataGenerator( 66 rescale=1./255, 67 rotation_range=45, 68 width_shift_range=.15, 69 height_shift_range=.15, 70 horizontal_flip=True, 71 zoom_range=0.5 72 ) 73 74 validation_datagen = ImageDataGenerator(rescale=1./255) 75 76 train_generator = train_datagen.flow_from_directory(batch_size=batch_size, 77 directory=train_data_dir, 78 shuffle=True, 79 target_size=(IMG_HEIGHT, IMG_WIDTH), 80 class_mode='binary',) 81 82 83 84 85 """ 86 rescale=1./255, 87 rotation_range=45, 88 width_shift_range=.15, 89 height_shift_range=.15, 90 horizontal_flip=True, 91 zoom_range=0.5 92 93 train_data_gen = image_gen_train.flow_from_directory(batch_size=batch_size, 94 directory=train_dir, 95 shuffle=True, 96 target_size=(IMG_HEIGHT, IMG_WIDTH), 97 class_mode='binary') 98 """ 99 100 validation_generator = validation_datagen.flow_from_directory( 101 validation_data_dir, 102 target_size=(IMG_WIDTH, IMG_HEIGHT), 103 color_mode='rgb', 104 classes=classes, 105 class_mode='categorical', 106 batch_size=batch_size, 107 shuffle=True) 108 109 return (train_generator, validation_generator) 110 111 112if __name__ == '__main__': 113 start = time.time() 114 115 # モデル作成 116 vgg_model = vgg_model_maker() 117 118 # 最後のconv層の直前までの層をfreeze 119 for layer in vgg_model.layers[:15]: 120 layer.trainable = False 121 122 # 多クラス分類を指定 123 vgg_model.compile(loss='categorical_crossentropy', 124 optimizer=optimizers.SGD(lr=1e-3, momentum=0.9), 125 metrics=['accuracy']) 126 127 # 画像のジェネレータ生成 128 train_generator, validation_generator = image_generator() 129 130 # Fine-tuning 131 history = vgg_model.fit_generator( 132 train_generator, 133 samples_per_epoch=nb_train_samples, 134 nb_epoch=nb_epoch, 135 validation_data=validation_generator, 136 nb_val_samples=nb_validation_samples) 137 138 vgg_model.save(os.path.join(result_dir, 'finetuning new.h5')) 139 140 process_time = (time.time() - start) / 60 141 print(u'学習終了。かかった時間は', process_time, u'分です。')
試したこと
ネットで検索をしたところ、配列に与える値の数が間違っていることはわかったのですが、初心者なため、具体的にどこを変更したら良いのかわかりませんでした...
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。