【Tool】Keras 基础学习 I Sequential Model

Tags: DeepLearning Tool


Keras介绍

keras是一个深度学习的high level API, 由python实现,支持Tesorflow, Theano, CNTK作为后端(也称为backend), 最近keras也成为Tensorflow的官方high level API, 因此和Tensorflow的适配性更好。keras支持简洁快速的原型设计, 支持CNN和RNN, 无缝CPU/GPU切换。此外keras模型也能直接转换为CoreML模型用在IOS设备上。

如果你熟悉深度学习基础概念, Keras很容易上手进行快速复现,因为不需要自己实现很多layer, 门槛比较低。 适合用于快速训练模型部署到生产环境,研究的话还是Tensorflow和caffe2+Pytorch吧,但是Tensorflow感觉实在是太复杂了, 接口太冗余。

Sequential Model

序列模型是多个网络层的线性堆叠, 可以传入layer list或者调用add()方法将layer加入模型。

from keras.models import Sequential
from keras.layers import Dense, Activation
# 传list
model1 = Sequential([Dense(32, input_dim=784), Activation('relu'), Dense(10), Activation('softmax')])
# add() 方法
model2 = Sequential()
model2.add(Dense(32, input_shape=(784,)))
model2.add(Activation('relu'))
model2.add(Dense(10))
model2.add(Activation('softmax'))

定义好模型之后需要调用compile方法对模型进行配置, 此时传入三个参数: optimizer, loss, metrics(如accuracy), loss和metrics都可以自定义。

# For a multi-class classification problem
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# For a binary classification problem
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# For a mean squared error regression problem
model.compile(optimizer='rmsprop',
              loss='mse')

# For custom metrics
import keras.backend as K

def mean_pred(y_true, y_pred):
    return K.mean(y_pred)

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy', mean_pred])

定义好模型和配置之后就可以使用fit()和fit_generator()方法传入进行训练。

model.fit(x_train, y_train,
          epochs=20,
          batch_size=128)

训练完了之后就可以调用evaluate()方法对训练好的模型进行评估。

score = model.evaluate(x_test, y_test, batch_size=128)

感觉真的是很简单:) user-friendly, made for human, 不像Tensorflow...

下面看一个Sequential Model的Mnist手写字符分类(深度学习hello world)例子吧。
keras内部有一些数据集接口, 包括 CIFAR10图片分类数据,CIFAR-100图片数据, IMDB电影评论分类, 路透社新闻主题分类, MNIST手写字体识别, Fashion-MNIST, 波士顿房价数据(回归模型)。可以用来练习或者测试自己的model。
感知机模型

 from keras import layers
 from keras import models
 from keras.datasets import mnist
 from keras.utils import to_categorical # convert int labels to one-hot vector
 
 # define model
 model = models.Sequential()
 model.add(layers.Dense(128, activation='relu', input_dim=784))
 model.add(layers.Dropout(0.5))
 model.add(layers.Dense(64, activation='relu'))
 model.add(layers.Dropout(0.5))
 model.add(layers.Dense(10, activation='softmax'))
 
 # print the model
 model.summary
 
 # load data
 (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
 train_images = train_images.astype('float32')/255 # normalize to 0~1
 test_images = test_images.astype('float32')/255
 train_images = train_images.reshape((60000,-1))
 test_images = test_images.reshape((10000,-1))
 
 
 # convert to one-hot vectors
 train_labels = to_categorical(train_labels)
 test_labels = to_categorical(test_labels)
 
 # define training config
 model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
 
 # train the model
 model.fit(train_images, train_labels, epochs=5, batch_size=64)
 
 # evaluate the model
 test_loss, test_accuracy = model.evaluate(test_images, test_labels)
 print("test loss:", test_loss)
 print("test accuracy:", test_accuracy)
 
# 输出
60000/60000 [==============================] - 2s 37us/step - loss: 0.6188 - acc: 0.8094
Epoch 2/5
60000/60000 [==============================] - 2s 32us/step - loss: 0.3359 - acc: 0.9093
Epoch 3/5
60000/60000 [==============================] - 2s 32us/step - loss: 0.2908 - acc: 0.9231
Epoch 4/5
60000/60000 [==============================] - 2s 32us/step - loss: 0.2699 - acc: 0.9317
Epoch 5/5
60000/60000 [==============================] - 2s 32us/step - loss: 0.2650 - acc: 0.9347
10000/10000 [==============================] - 0s 23us/step
test loss: 0.16157680716912728
test accuracy: 0.9622

卷积模型

 from keras.datasets import mnist
 from keras.utils import to_categorical # convert int labels to one-hot vector
 
 # define model
 model = models.Sequential()
 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
 model.add(layers.MaxPooling2D((2, 2)))
 model.add(layers.Conv2D(64, (3, 3), activation='relu'))
 model.add(layers.MaxPooling2D((2, 2)))
 model.add(layers.Conv2D(64, (3, 3), activation='relu'))
 model.add(layers.Flatten())
 model.add(layers.Dense(64, activation='relu'))
 model.add(layers.Dense(10, activation='softmax'))
 
 # print the model
 print(model.summary)
 
 # load data
 (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
 train_images = train_images.reshape((60000, 28, 28, 1))
 train_images = train_images.astype('float32')/255 # normalize to 0~1
 
 test_images = test_images.reshape((10000, 28, 28, 1))
 test_images = test_images.astype('float32')/255
 
 # convert to one-hot vectors
 train_labels = to_categorical(train_labels)
 test_labels = to_categorical(test_labels)
 
 # define training config
 model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
 
 # train the model
 model.fit(train_images, train_labels, epochs=5, batch_size=64)
 
 # evaluate the model
 test_loss, test_accuracy = model.evaluate(test_images, test_labels)
 print("test loss:", test_loss)
 print("test accuracy:", test_accuracy)

# 输出
60000/60000 [==============================] - 34s 565us/step - loss: 0.1739 - acc: 0.9468
Epoch 2/5
60000/60000 [==============================] - 39s 652us/step - loss: 0.0457 - acc: 0.9859
Epoch 3/5
60000/60000 [==============================] - 36s 598us/step - loss: 0.0307 - acc: 0.9906
Epoch 4/5
60000/60000 [==============================] - 37s 614us/step - loss: 0.0239 - acc: 0.9930
Epoch 5/5
60000/60000 [==============================] - 35s 590us/step - loss: 0.0193 - acc: 0.9941
10000/10000 [==============================] - 2s 189us/step
test loss: 0.028174066650505848
test accuracy: 0.9913
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,135评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,317评论 3 397
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,596评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,481评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,492评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,153评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,737评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,657评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,193评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,276评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,420评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,093评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,783评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,262评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,787评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,427评论 2 359