1from __future__ import print_function 2 3import keras 4from keras.datasets import cifar10 5from keras.layers import Conv2D, MaxPooling2D 6from keras.layers import Dense, Dropout, Flatten 7from keras.models import Sequential 8from keras.preprocessing.image import ImageDataGenerator 9 10(x_train, y_train), (x_test, y_test) = cifar10.load_data() 11 12x_train = x_train.astype('float32') 13x_test = x_test.astype('float32') 14 15x_train /= 255 16x_test /= 255 17 18y_train = keras.utils.to_categorical(y_train, 10) 19y_test = keras.utils.to_categorical(y_test, 10) 20 21model = Sequential() 22model.add(Conv2D(32, (3, 3), padding='same', 23 input_shape=x_train.shape[1:], activation='relu')) 24model.add(Conv2D(32, (3, 3), activation='relu')) 25model.add(MaxPooling2D()) 26model.add(Dropout(0.25)) 27 28model.add(Conv2D(64, (3, 3), padding='same', activation='relu')) 29model.add(Conv2D(64, (3, 3), activation='relu')) 30model.add(MaxPooling2D()) 31model.add(Dropout(0.25)) 32 33model.add(Flatten()) 34model.add(Dense(512, activation='relu')) 35model.add(Dropout(0.5)) 36model.add(Dense(10, activation='softmax')) 37 38model.compile(loss='categorical_crossentropy', 39 optimizer=keras.optimizers.rmsprop(lr=0.0001, decay=1e-6), 40 metrics=['accuracy']) 41 42datagen = ImageDataGenerator( 43 featurewise_center=False, 44 samplewise_center=False, 45 featurewise_std_normalization=False, 46 samplewise_std_normalization=False, 47 zca_whitening=False, 48 rotation_range=0, 49 width_shift_range=0.1, 50 height_shift_range=0.1, 51 horizontal_flip=True, 52 vertical_flip=False) 53 54datagen.fit(x_train) 55 56model.fit_generator(datagen.flow(x_train, y_train, 57 batch_size=32), 58 epochs=100, 59 validation_data=(x_test, y_test), 60 workers=4) 61 62 63 64_________________________________________________________________ 65Layer (type) Output Shape Param # 66================================================================= 67conv2d_1 (Conv2D) (None, 32, 32, 32) 896 68_________________________________________________________________ 69conv2d_2 (Conv2D) (None, 30, 30, 32) 9248 70_________________________________________________________________ 71max_pooling2d_1 (MaxPooling2 (None, 15, 15, 32) 0 72_________________________________________________________________ 73dropout_1 (Dropout) (None, 15, 15, 32) 0 74_________________________________________________________________ 75conv2d_3 (Conv2D) (None, 15, 15, 64) 18496 76_________________________________________________________________ 77conv2d_4 (Conv2D) (None, 13, 13, 64) 36928 78_________________________________________________________________ 79max_pooling2d_2 (MaxPooling2 (None, 6, 6, 64) 0 80_________________________________________________________________ 81dropout_2 (Dropout) (None, 6, 6, 64) 0 82_________________________________________________________________ 83flatten_1 (Flatten) (None, 2304) 0 84_________________________________________________________________ 85dense_1 (Dense) (None, 512) 1180160 86_________________________________________________________________ 87dropout_3 (Dropout) (None, 512) 0 88_________________________________________________________________ 89dense_2 (Dense) (None, 10) 5130 90================================================================= 91Total params: 1,250,858 92Trainable params: 1,250,858 93Non-trainable params: 0
这次的示例是采样cifar数据集进行的图像分类训练,用的是卷积神经网络,但是与之前的玩法不同,这次使用了ImageDataGenerator 这个工具来做图像增广。与之前最大的区别就是,我们一共fit了2次,第一次是对图像进行增广出来,第二次,也就是真正训练模型的时候,使用的是fit_generator 这个方式
ImageDataGenerator的参数描述及处理效果可以查看这篇文章,非常的好图片数据集太少?看我七十二变,Keras Image Data Augmentation 各参数详解
这个训练还有个特点,就是fit_generator里面,我们传入的是
datagen.flow(x_train, y_train,batch_size=32)
他会以32个作为一个批次,不断的产生新的图片,这样我们就可以在我们原有的少量数据集中,获得非常多的不同处理的图片作为训练了,训练集一下就多了起来。最后在fit_generator的时候,我们指定了用4个线程去跑,加快训练的速度