零基础入门keras实战教学+源码利用vgg16(keras)搭建属于自己图像分类识别的模型(其一)

导读

写下此文章的目的,是希望帮助那些跟我一样希望使用keras来搭建属于自己的模型的童鞋。

在这里,使用了属于自己的数据集,去一步步的搭建属于自己的keras模型,并进行训练。

其中有详细的,有忽略的,有不明白的,或者希望更深一步进行理解的,万能的csdn会给你解答。


理解

在我的理解中,整个过程我大致的分为四步:

1.数据预处理

2.模型搭建

3.模型调参

4.模型训练


解读

碎碎念开启:

首先,数据预处理,在我理解中,他的涵义之一就是将不规则的数据,统一规划起来。一个散乱的军队,我想是没法打好仗的,同样的道理,一堆没有统一的数据,模型是很难学习的。我们需要将他们统一格式,然后,我们还要对数据进行加强。加强是什么意思呢?就是,对于我们拍摄的数据,我们希望模型在学习的时候,能够举一反三,就是对于这张照片,我们上下翻转,左右平移一下,模型还能识别出来,所以我们在模型学习的时候,就将这些数据进行处理,将一张张照片进行一些反转啊平移之类的处理。希望模型学习完成的时候,能对一张照片的不同样式下,都能识别出来。


其次,是模型搭建。模型搭建有深有浅,约深的模型,更能学习一张照片比较的抽象的状态。比较浅的模型,能够好的学习一张照片的边边角角,通俗理解就是照片中物体大概的轮廓。模型是灵活的,是根据自己需要进行搭建的。你可能会像,我是不是需要学很多才能搭建比较理想的一种模型,实际上,答案已经给出了。我们可以学习使用目前比较成熟好用的模型,从而省下自己去设计去摸索的时间,能够更好的进行应用与实践。时间充裕时,在具有一定理解的基础上,进行自己的摸索与研究,更深入一番。


再次,模型调参,用我认识的一位老师的一句话,是一门艺术活。在这方面,因为时间精力原因(主要是因为我太菜了),并没有很多的理解与操作。

最后,模型的训练,实际上,模型训练并不是最后一步。模型调参与模型训练是两个相互结合重复循环的过程,就是训练,看好一看效果,调一调参,训练训练(注意不是训练一边就调一次参,在你感觉模型到极限的,或者通过调参可以拥有更好的效果的时候)。在进行合理的训练之后,在拟合和过拟合之间时,如果模型对未知的数据(没有学习过的数据)进行预测时,一直没有达到很理想的水平。我们就改考虑是否更改模型的结构了。这些都是看个人理解与个人经验。


碎碎念结束!干货了,对于不懂得函数,大可以csdn搜索,查看函数时有何作用,以及参数的意义。

在这次的实践中,我们都是用了那些的东西嘞??

大概罗列一下:keras 的线性模型Sequential()模型(堆蛋糕一样的堆模型)、图片生成器ImageDataGenerator()、模型的保存加载、模型训练fit_generator()(他还有一个孪生兄弟,感兴趣的去搜一搜啊)等等......源码中的好多东西,都可以csdn出来学习哦。

以为电脑要没电啦,所以先贴出来我进行实践时的代码吧!

如果想要一直使用keras中的vgg16模型,就把他封装函数就好了,尽管本来就有vgg16(tensorflow)哈哈哈。

讲解放到下一篇中文章中了,因为实在是没电了。

讲解篇链接:https://blog.csdn.net/qq_41549459/article/details/100822150

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 10 18:48:57 2019

@author: 29538
"""

from keras.models import Sequential
#from keras.layers import Conv2D, MaxPooling2D
#from keras.layers import Dropout, Flatten, Dense
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
from keras.models import load_model
import numpy as np

import matplotlib.pyplot as plt
import keras
from keras.datasets import cifar10
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D, BatchNormalization
from keras import optimizers
from keras.layers.core import Lambda
from keras import backend as K
from keras.optimizers import SGD
from keras import regularizers
from keras.models import load_model

weight_decay = 0.0005
nb_epoch=100
batch_size=32

#layer1 32*32*3
model = Sequential()
model.add(Conv2D(64, (3, 3), padding='same',
input_shape=(224,224,3),kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.3))
#layer2 32*32*64
model.add(Conv2D(64, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2),padding='same')  )
#layer3 16*16*64
model.add(Conv2D(128, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))
#layer4 16*16*128
model.add(Conv2D(128, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
#layer5 8*8*128
model.add(Conv2D(256, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))
#layer6 8*8*256
model.add(Conv2D(256, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))
#layer7 8*8*256
model.add(Conv2D(256, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
#layer8 4*4*256
model.add(Conv2D(512, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))
#layer9 4*4*512
model.add(Conv2D(512, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))
#layer10 4*4*512
model.add(Conv2D(512, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
#layer11 2*2*512
model.add(Conv2D(512, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))
#layer12 2*2*512
model.add(Conv2D(512, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))
#layer13 2*2*512
model.add(Conv2D(512, (3, 3), padding='same',kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
#layer14 1*1*512
model.add(Flatten())
model.add(Dense(512,kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
#layer15 512
model.add(Dense(512,kernel_regularizer=regularizers.l2(weight_decay)))
model.add(Activation('relu'))
model.add(BatchNormalization())
#layer16 512
model.add(Dropout(0.5))
model.add(Dense(2))
model.add(Activation('softmax'))
# 10
model.summary()
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='sparse_categorical_crossentropy', optimizer=sgd,metrics=['accuracy'])



train_datagen = ImageDataGenerator(rescale=1./255,
                                   rotation_range = 90,
                                   shear_range=0.5,
                                   zoom_range=0.2,
                                   horizontal_flip=True,
                                   vertical_flip=True
                                   )
test_datagen = ImageDataGenerator(rescale=1./255,
                                  )
t1="gaoerji"
first="D:/cell5/"
end1="/train"
end2="/validation"
hear=".h5"
change=t1
path1=first+change+end1
path2=first+change+end2
fp=first+"vgg16_"+change+hear
model_path=first+"vgg16_"+t5+hear
print(path1)
print(path2)
print(fp)
      #d:/cell5/gaoerji/train
      #/validation
train_generator = train_datagen.flow_from_directory(path1,
                                                    target_size=(224,224),
                                                    batch_size=5,
                                                    class_mode='binary',
                                                    #save_to_dir='D:/test/train1'
                                                    )

validation_generator = test_datagen.flow_from_directory(path2,
                                                        target_size=(224,224),
                                                        batch_size=5,
                                                        class_mode='binary',
                                                        #save_to_dir='D:/test/tes1'
                                                        )

#for i in range(5):
#    train_generator.next()



try:
    model.load_weights(fp)
    print("done")
except:
    print("not found error!")
history=model.fit_generator(train_generator,
                    steps_per_epoch=15,
                    epochs=5,
                    validation_data=validation_generator,
                    validation_steps=10
                    )
#model.save(model_path)

print(history.history.keys())
model.save_weights(fp)
print("save the model")
'''
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['val_loss', 'val_acc', 'loss', 'acc'], loc='upper left') 
plt.show()
pylab.show()
# summarize history for loss plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('model loss')
#plt.ylabel('loss')
#plt.xlabel('epoch')
#plt.legend(['train', 'test'], loc='upper left') 
#plt.show()

      '''  


'''
file_path = "D:/cell2/1.jpg"
img = image.load_img(file_path,target_size=(300,300))
x = image.img_to_array(img)
x = np.expand_dims(x,axis=0)
model = load_model(gaoerji)#gaoerji
y = model.predict(x)
print("gaoerji:"+y)
'''

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值