开发者社区> 禾路> 正文

基础_cifar10_model

简介: 今天进一步在cifar10数据集上解决几个问题: 1、比较一下序贯和model,为什么要分成两块; 2、同样的条件下,我去比较一下序贯和model。这个例子作为今天的晚间运行。 1、比较一下序贯和model,为什么要分成两块; 我认为比较能够说明问题的是前期那个验证码的model input...
+关注继续查看
今天进一步在cifar10数据集上解决几个问题:
1、比较一下序贯和model,为什么要分成两块;
2、同样的条件下,我去比较一下序贯和model。这个例子作为今天的晚间运行。

1、比较一下序贯和model,为什么要分成两块;
我认为比较能够说明问题的是前期那个验证码的model
input_tensor = Input((height, width, 3))
x = input_tensor
for i in range(4):
    x = Convolution2D(32*2**i, 3, 3, activation='relu')(x)
    x = Convolution2D(32*2**i, 3, 3, activation='relu')(x)
    x = MaxPooling2D((2, 2))(x)

x = Flatten()(x)
x = Dropout(0.25)(x)
x = [Dense(n_class, activation='softmax', name='c%d'%(i+1))(x) for i in range(4)]
model = Model(input=input_tensor, output=x)

一个非常显著的不同,就是最后分为了4个部分(这也是这里选择model的原因),这个 4分类直接最后导致了验证码4个部分的区分。这是验证码识别最为有技术的地方。应该说,从网络结构上来看,这个分叉,在cnn网络 中,就是model和sequence最大的不同之处,也是着重要研究的地方。

model = Model(input=input_tensor, output=x)

model最大的不同就在于它首先定义了网络结构,然后最后才生成这个模型。从编码方式上来看,只是顺序的不同而已。

= [Dense(n_class, activation='softmax', name='c%d'%(i+1))(x) for i in range(4)]

这句之所以能够将网络1分4,是因为采用的列表的形式。然后就能够进行验证?我将这个问题留给明天。另一个方面,在这个验证码的例子中,其网络就是不断地卷积-卷积-maxpooling,非常简单,是否需要进一步优化?

2、同样的条件下,我去比较一下序贯和model
'''
同样的数据集和epochs,同样的模型构造。
一个采用序贯、一个采用model方法
对生成结果进行比较
'''

from __future__ import print_function
#!apt-get -qq install -y graphviz && pip install -q pydot
import pydot
import keras
import cv2
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Input
from keras.models import Model
from keras.utils.vis_utils import plot_model
import matplotlib.image as image # image 用于读取图片
import matplotlib.pyplot as plt
import os


batch_size = 32
num_classes = 10
#epochs = 100
epochs = 3
data_augmentation = True
num_predictions = 20
save_dir = os.path.join(os.getcwd(), 'saved_models')
model_name = 'keras_cifar10_trained_model.h5'

# The data, split between train and test sets:
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# Convert class vectors to binary class matrices.
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

#序贯模型
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

#model模型
inputs = Input(shape=(x_train.shape[1:]))
x = Conv2D(32, (3, 3), activation='relu')(inputs)
x = Conv2D(32, (3, 3), activation='relu')(x)
x = MaxPooling2D((2, 2))(x)
x = Dropout(0.25)(x)
x = Conv2D(64, (3, 3), activation='relu')(x)
x = Conv2D(64, (3, 3), activation='relu')(x)
x = MaxPooling2D((2, 2))(x)
x = Dropout(0.25)(x)
x = Flatten()(x)
x = Dense(512)(x)
x = Activation('relu')(x)
x = Dropout(0.5)(x)
x = Dense(num_classes)(x)
x = Activation('softmax')(x)
model2 = Model(inputs=inputs, outputs=x)

#显示模型
model.summary()
plot_model(model,to_file='model_sequence.png',show_shapes=True)
img = image.imread('model_sequence.png')
print(img.shape)
plt.imshow(img) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()

model2.summary()
plot_model(model2,to_file='model_model.png',show_shapes=True)
img2 = image.imread('model_model.png')
print(img2.shape)
plt.imshow(img2) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()
# initiate RMSprop optimizer
opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)

# Let's train the model using RMSprop
model.compile(loss='categorical_crossentropy',
optimizer=opt,
metrics=['accuracy'])

model2.compile(loss='categorical_crossentropy',
optimizer=opt,
metrics=['accuracy'])

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

if not data_augmentation:
print('Not using data augmentation.')
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(x_test, y_test),
shuffle=True)
else:
print('Using real-time data augmentation.')
# This will do preprocessing and realtime data augmentation:
datagen = ImageDataGenerator(
featurewise_center=False, # set input mean to 0 over the dataset
samplewise_center=False, # set each sample mean to 0
featurewise_std_normalization=False, # divide inputs by std of the dataset
samplewise_std_normalization=False, # divide each input by its std
zca_whitening=False, # apply ZCA whitening
rotation_range=0, # randomly rotate images in the range (degrees, 0 to 180)
width_shift_range=0.1, # randomly shift images horizontally (fraction of total width)
height_shift_range=0.1, # randomly shift images vertically (fraction of total height)
horizontal_flip=True, # randomly flip images
vertical_flip=False) # randomly flip images

# Compute quantities required for feature-wise normalization
# (std, mean, and principal components if ZCA whitening is applied).
datagen.fit(x_train)

# Fit the model on the batches generated by datagen.flow().
model.fit_generator(datagen.flow(x_train, y_train,
batch_size=batch_size),
epochs=epochs,
validation_data=(x_test, y_test),
workers=4)
model2.fit_generator(datagen.flow(x_train, y_train,
batch_size=batch_size),
epochs=epochs,
validation_data=(x_test, y_test),
workers=4)

# Save model and weights
if not os.path.isdir(save_dir):
os.makedirs(save_dir)
model_path = os.path.join(save_dir, model_name)
model.save(model_path)
print('Saved trained model at %s ' % model_path)

# Score trained model.
scores = model.evaluate(x_test, y_test, verbose=1)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])

模型打印出来比较:
img_ea8917ff0a4dbc7f110848397e8181b9.png
sequence
主要是由于在
x = Conv2D(32, (3, 3), activation='relu')(inputs)
似乎是将activation合并了,所以model_model更短一些。但是层的结果似乎也是不一样的。这个等到训练结果出来后进一步研究。
Using TensorFlow backend.
x_train shape: (50000, 32, 32, 3)
50000 train samples
10000 test samples
_________________________________________________________________
Layer (type)                 Output Shape              Param #  
=================================================================
conv2d_1 (Conv2D)            (None, 32, 32, 32)        896      
_________________________________________________________________
activation_1 (Activation)    (None, 32, 32, 32)        0        
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 30, 30, 32)        9248     
_________________________________________________________________
activation_2 (Activation)    (None, 30, 30, 32)        0        
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 15, 15, 32)        0        
_________________________________________________________________
dropout_1 (Dropout)          (None, 15, 15, 32)        0        
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 15, 15, 64)        18496    
_________________________________________________________________
activation_3 (Activation)    (None, 15, 15, 64)        0        
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 13, 13, 64)        36928    
_________________________________________________________________
activation_4 (Activation)    (None, 13, 13, 64)        0        
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 6, 6, 64)          0        
_________________________________________________________________
dropout_2 (Dropout)          (None, 6, 6, 64)          0        
_________________________________________________________________
flatten_1 (Flatten)          (None, 2304)              0        
_________________________________________________________________
dense_1 (Dense)              (None, 512)               1180160  
_________________________________________________________________
activation_5 (Activation)    (None, 512)               0        
_________________________________________________________________
dropout_3 (Dropout)          (None, 512)               0        
_________________________________________________________________
dense_2 (Dense)              (None, 10)                5130     
_________________________________________________________________
activation_6 (Activation)    (None, 10)                0        
=================================================================
Total params: 1,250,858
Trainable params: 1,250,858
Non-trainable params: 0
_________________________________________________________________
(2065, 635, 4)
vz5iTQxKmTPQQhx3NMKIQ8SByGExEEIIXEQQkgch
_________________________________________________________________
Layer (type)                 Output Shape              Param #  
=================================================================
input_1 (InputLayer)         (None, 32, 32, 3)         0        
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 30, 30, 32)        896      
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 28, 28, 32)        9248     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 14, 14, 32)        0        
_________________________________________________________________
dropout_4 (Dropout)          (None, 14, 14, 32)        0        
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 12, 12, 64)        18496    
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 10, 10, 64)        36928    
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 5, 5, 64)          0        
_________________________________________________________________
dropout_5 (Dropout)          (None, 5, 5, 64)          0        
_________________________________________________________________
flatten_2 (Flatten)          (None, 1600)              0        
_________________________________________________________________
dense_3 (Dense)              (None, 512)               819712   
_________________________________________________________________
activation_7 (Activation)    (None, 512)               0        
_________________________________________________________________
dropout_6 (Dropout)          (None, 512)               0        
_________________________________________________________________
dense_4 (Dense)              (None, 10)                5130     
_________________________________________________________________
activation_8 (Activation)    (None, 10)                0        
=================================================================
Total params: 890,410
Trainable params: 890,410
Non-trainable params: 0
_________________________________________________________________
(1623, 635, 4)
vhjX5vtMzwLjhCWLVuG+vp63c1lVCLR78SUX8WZk
从最后的结果上来看,model消耗的时间更少,而且正确率更高、loss更低。那么以后我优先建立model模型!
10000/10000 [==============================] - 2s 187us/step
Test loss: 0.9320432889938355
Test accuracy: 0.682
10000/10000 [==============================] - 2s 173us/step
Test loss2: 0.8202090420722962
Test accuracy2: 0.7091






目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
TensorFlow加载cifar10数据集
TensorFlow加载cifar10数据集
10 0
基于PaddlePaddle框架对CIFAR-100数据集在简易CNN(LeNet-5修改)和简易DNN的效果对比
基于PaddlePaddle框架对CIFAR-100数据集在简易CNN(LeNet-5修改)和简易DNN的效果对比
87 0
使用paddle搭建多种卷积神经网络实现Cifar10数据集 解析
本项目把几大重要的卷积神经网络进行了解析使用了Cifar10 项目是陆平老师的,解析采取了由上至下的方式,上面的解析详细,下面的可能没有标注 如果有疑问可以留言或私聊我都可以。
77 0
Keras创建ANN模型的四种方法
这里以MNIST数据集来介绍Keras创建人工神经网络模型的四种方法
67 0
tensorflow2.0图片分类实战---对fashion-mnist数据集分类
tensorflow2.0图片分类实战---对fashion-mnist数据集分类
69 0
判别式模型(discriminative model)和生成模型(generative model)
已知输入变量x,判别模型(discriminative model)通过求解条件概率分布P(y|x)或者直接计算y的值来预测y。生成模型(generative model)通过对观测值和标注数据计算联合概率分布P(x,y)来达到判定估算y的目的。
93 0
Paddle 环境中 使用LeNet在MNIST数据集实现图像分类
测试了在AI Stuio中 使用LeNet在MNIST数据集实现图像分类 示例。基于可以搭建其他网络程序。
463 0
Keras之DNN::基于Keras(sigmoid+binary_crossentropy+predict_classes)利用DNN实现二分类——DIY二分类数据集&预测新数据点
Keras之DNN::基于Keras(sigmoid+binary_crossentropy+predict_classes)利用DNN实现二分类——DIY二分类数据集&预测新数据点
250 0
DL之DNN:自定义MultiLayerNet(5*100+ReLU+SGD/Momentum/AdaGrad/Adam四种最优化)对MNIST数据集训练进而比较不同方法的性能
DL之DNN:自定义MultiLayerNet(5*100+ReLU+SGD/Momentum/AdaGrad/Adam四种最优化)对MNIST数据集训练进而比较不同方法的性能
108 0
+关注
禾路
图像处理工程师,专注图像处理多年,长期奋斗在图像增强、识别一线。实战经验丰富,研究开发的连铸体拼接算法、人脸美化算法、红外线血管增强识别系统、中药识别系统、石材大板识别系统等均已投入使用。对opencv有着深入理解和解析,以jsxyhelu账号参与OpenCV项目。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
ImageNet:VGGNet,ResNet,Incepti
立即下载
Analysis of dropout learnning
立即下载
Analysis of dropout lcarning r
立即下载