keras的两种编程方式
加载model模块的sequential类的顺序模型,特点是add,示例如下
"""
只是样例,跑不通的
"""
import keras
from keras.layers import Dense,Conv2D
from keras.models import Sequential
import keras.optimizers as optimizers
import keras.losses as losses
model = Sequential()
model.add(Conv2D(32,(3,3),activation='relu',input_dim =100))
model.add(Dense(units =64,activation ='relu'))
model.add(Dense(units = 32,activation ='softmax'))
SGD = optimizers.SGD(lr =0.01,momentum=0.9,nesterov =True)
model.compile(loss =losses.categorical_crossentropy,optimizer = SGD,metrics = {'accuracy'})
model.fit(x_train,y_train,epoch = 5,batch_size=16)
loss_and_metrics = model.evaluate(x_test,y_test,batch_size = 16)
classes = model.predict(x,batch_size=1)
使用Model的嵌套模型也是很流行的,特点是每条语句有都加一个(x),x表输出的特征图层
import keras
from keras.layers import Conv2D,MaxPooling2D,Dense,Flatten,Dropout
import keras.optimizers as optimizers
from keras.models import Model
inputs = Input(shape=(100, 100, 3))
x = Conv2D(32,(3,3),activation = 'relu')(inputs)
x = MaxPooling2D(pool_size= (2,2))(x)
x = Conv2D(32,(3,3),activation ='relu')(x)
x = MaxPooling2D(pool_size = (2,2))(x)
x = Flatten()(x)
x = Dropout(0.5)(x)
x = Dense(256,activation='relu')(x)
out = Dense(10,activation = 'softmax')(x)
model = Model(inputs = [inputs],outputs =[out])
SGD = optimizers.SGD(lr =0.001,decay = 1e-6,momentun = 0.9,nestervo = True)
model.compile(loss = 'categorical_crossentropy',optimizer= SGD,metrics = {'accuracy'})
model.fit(x_train,y_train,epoch = 5,batch_size=16)
loss_and_metrics = model.evaluate(x_test,y_test,batch_size = 16)
classes = model.predict(x,batch_size=1)
使用keras搭建神经网络识别三类数据练习
环境说明
- keras2.0
- 后端tensorflow-gpu版1.6
- Python3.5
- ubuntu16.4
搭建网络
- MLP
- 随意搭建的浅层CNN
- VGG
- ResNet
使用数据集
- mnist(在keras的example模块中自动下载,如果电脑不在实验室,需要科学上网辅助)
- cifar10(同上)
- asl美式手语数据集,识别A-E五类。共15000个数据,13600的训练集、1280的验证集、120的测试集
五个脚本
一些重要信息在程序注释里都解释了,这里就不多说了,自己研究研究就明白了。
数据加载脚本dataloader.py
import cv2
import numpy as np
import random
import keras
import os
class Dataloader():
def __init__(self,path,n_classes = None):
self.path = path
self.files = os.listdir(self.path)
self.n_classes = n_classes
def load_data(self,name):
"""
负责将数据一张一张读入并根据文件名(例23_D)生成标签,23只是数据的序号,根据
最后的字母D打标签
:param name:数据的路径
:return:图像数据和标签
"""
im = cv2.imread(name)
im = cv2.resize(im,(224,224))
label = name.split('_')[-1][0]
if label == 'A':
label = 0
elif label == 'B':
label = 1
elif label == 'C':
label = 2
elif label == 'D':
label = 3
elif label == 'E':
label = 4
im = np.array(im).astype('float')/255
label = keras.utils.to_categorical(label,self.n_classes)
return im,label
def load_predict_data(self,name,isgray= False,input_size=(28,28)):
"""
测试模型的时候使用,一次测一张
:param name: 文件名和路径
:param isgray:如果像mnist一类,输入数据是灰度图赋值true
:param input_size:传入图像的长宽
:return: 格式如(1,28,28,1)的数据
"""