我正在尝试使用InceptionV4
来解决一些分类问题。在将其应用于实际问题之前,我正在进行一些实验。
我替换了最后一个密集层(大小为1001
)为一个新的密集层,编译了模型并尝试进行拟合
from keras import backend as Kimport inception_v4import numpy as npimport cv2import osfrom keras import optimizersfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom keras.layers import Convolution2D, MaxPooling2D, ZeroPadding2Dfrom keras.layers import Activation, Dropout, Flatten, Dense, Inputfrom keras.models import Modelos.environ['CUDA_VISIBLE_DEVICES'] = ''my_batch_size=32train_data_dir ='//shared_directory/projects/try_CDFxx/data/train/'validation_data_dir ='//shared_directory/projects/try_CDFxx/data/validation/'img_width, img_height = 299, 299num_classes=3nb_epoch=50nbr_train_samples = 24nbr_validation_samples = 12def train_top_model (num_classes): v4 = inception_v4.create_model(weights='imagenet') predictions = Dense(output_dim=num_classes, activation='softmax', name="newDense")(v4.layers[-2].output) # replacing the 1001 categories dense layer with my own main_input= v4.layers[1].input main_output=predictions t_model = Model(input=[main_input], output=[main_output]) train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.1, zoom_range=0.1, rotation_range=10., width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True) val_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( train_data_dir, target_size = (img_width, img_height), batch_size = my_batch_size, shuffle = True, class_mode = 'categorical') validation_generator = val_datagen.flow_from_directory( validation_data_dir, target_size=(img_width, img_height), batch_size=my_batch_size, shuffle = True, class_mode = 'categorical')# t_model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy', metrics=['accuracy'])# t_model.fit_generator( train_generator, samples_per_epoch = nbr_train_samples, nb_epoch = nb_epoch, validation_data = validation_generator, nb_val_samples = nbr_validation_samples)train_top_model(num_classes)
但我遇到了以下错误
Traceback (most recent call last): File "re_try.py", line 76, in <module> train_top_model(num_classes) File "re_try.py", line 72, in train_top_model nb_val_samples = nbr_validation_samples) File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1508, in fit_generator class_weight=class_weight) File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1261, in train_on_batch check_batch_dim=True) File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 985, in _standardize_user_data exception_prefix='model target') File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 113, in standardize_input_data str(array.shape))ValueError: Error when checking model target: expected newDense to have shape (None, 1) but got array with shape (24, 3)Exception in thread Thread-1:Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner self.run() File "/usr/lib/python2.7/threading.py", line 754, in run self.__target(*self.__args, **self.__kwargs) File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 409, in data_generator_task generator_output = next(generator) File "/usr/local/lib/python2.7/dist-packages/keras/preprocessing/image.py", line 693, in next x = self.image_data_generator.random_transform(x) File "/usr/local/lib/python2.7/dist-packages/keras/preprocessing/image.py", line 403, in random_transform fill_mode=self.fill_mode, cval=self.cval) File "/usr/local/lib/python2.7/dist-packages/keras/preprocessing/image.py", line 109, in apply_transform final_offset, order=0, mode=fill_mode, cval=cval) for x_channel in x]AttributeError: 'NoneType' object has no attribute 'interpolation'
我做错了什么?为什么在定义了大小为3的新密集层后,它仍然期望具有(None,1)
的形状?
非常感谢
PS我添加了模型总结的结尾部分
merge_25 (Merge) (None, 8, 8, 1536) 0 activation_140[0][0] merge_23[0][0] merge_24[0][0] activation_149[0][0]____________________________________________________________________________________________________averagepooling2d_15 (AveragePool (None, 1, 1, 1536) 0 merge_25[0][0]____________________________________________________________________________________________________dropout_1 (Dropout) (None, 1, 1, 1536) 0 averagepooling2d_15[0][0]____________________________________________________________________________________________________flatten_1 (Flatten) (None, 1536) 0 dropout_1[0][0]____________________________________________________________________________________________________newDense (Dense) (None, 3) 4611 flatten_1[0][0]====================================================================================================Total params: 41,210,595Trainable params: 41,147,427Non-trainable params: 63,168
回答:
好的,问题出在
validation_generator = val_datagen.flow_from_directory(... class_mode = 'categorical')
Categorical
使你的生成器返回一个独热编码向量。在你的情况下是一个3-d
的向量。但你将loss
设置为sparse_categorical_crossentropy
,它接受int
作为标签。你应该更改class_mode="sparse"
或loss="categorical_crossentropy"
。