机器学习:Keras 简例

安装

pip install keras

Keras 有两个 Backend,也就是 Keras 基于什么东西来做运算

Keras 的两个 Backend,一个是 Theano,一个是 TensorFlow

  

每次当我们 import keras 的时候, 就会看到屏幕显示当前使用的 Backend

>>> import keras
Using TensorFlow backend.

配置文件

lin@Master:~$ cat ~/.keras/keras.json
{
    "epsilon": 1e-07,
    "floatx": "float32",
    "image_data_format": "channels_last",
    "backend": "tensorflow"
}

直接修改配置文件可能会在 import 时出现错误信息

  解决方案

  1. 在其他文本编辑器内编辑好这段文本, 然后整体拷贝到这个文件里

  2. 在 Terminal 中直接输入临时环境变量执行: KERAS_BACKEND=tensorflow python -c "from keras import backend"

  3. 在 python 代码中 import keras 前加入一个环境变量修改的语句: os.environ[\'KERAS_BACKEND\']=\'theano\'

  

为什么用 Keras

  TensorFlow 提供很多基础的操作, 要写完一个模型比如神经网络还需要很多代码

  Keras 之类的第三方软件对 TensorFlow, Theano 等作了封装

  适合于

    简易和快速的原型设计

    支持 CNN 和 RNN, 或二者的结合

    无缝 CPU 和 GPU 切换

  

Keras 适用的 Python 版本是:Python 2.7-3.6

  

Keras 的设计原则是

  用户友好:提供一致而简洁的 API

  模块性:网络层、损失函数、优化器、初始化策略、激活函数、正则化方法都是独立的模块

  易扩展性:添加新模块超级容易,只需要仿照现有的模块编写新的类或函数即可

  

  与 Python 协作:Keras 没有单独的模型配置文件类型 (作为对比, caffe 有)

          模型由 python 代码描述, 使其更紧凑和更易 debug, 并提供了扩展的便利性

  

  

神经网络例子

from sklearn import datasets
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.utils import to_categorical

## 创建一个空的顺序序列的网络结构
model = Sequential()

## 添加 Dense (既全连接层)
## units 是该层的神经元个数既输出数据维度
## activation 是激活函数(没指定就用 f(x)=x )
## use_bias 是否使用偏移
## input_dim 输入数据维度
model.add(Dense(units=64, activation=\'relu\', input_dim=4))
model.add(Dense(units=32, activation=\'relu\'))
model.add(Dense(units=3, activation=\'softmax\'))

## 也可以分两步实现, 把 Activation 作为单独一层
## model.add(Dense(units=64, input_dim=100))
## model.add(Activation("relu"))

## 编译模型, 指定损失函数, 优化器, 也可以使用自己自定义的函数
model.compile(loss=\'categorical_crossentropy\', optimizer=\'sgd\', metrics=[\'accuracy\'])

## 读取样本数据
data = datasets.load_iris()
X, Y = data.data[:-1], data.target[:-1]

## 转为二进制
Y = to_categorical(Y)

## 训练
model.fit(X, Y, epochs=100, batch_size=32)

## 评估
loss_and_metrics = model.evaluate(X, Y, batch_size=128)

## 预测
classes = model.predict(X, batch_size=128)

卷积神经网络

from keras.layers import Conv2D, MaxPool2D, Dense, Flatten
from keras.models import Sequential
from keras.utils import to_categorical
from sklearn import datasets

lenet = Sequential()

## 添加卷积层, filters 核数, kernel_size 核大小, strides 步长, padding 填充方式, input_shape 输入数据维度
lenet.add(Conv2D(filters=6, kernel_size=3, strides=1, padding=\'same\', input_shape=(8, 8, 1)))

## 添加池化层, pool_size 大小, strides 步长
lenet.add(MaxPool2D(pool_size=2, strides=2))

## 继续添加卷积层
lenet.add(Conv2D(filters=16, kernel_size=3, strides=1, padding=\'valid\'))

## 继续添加池化层
lenet.add(MaxPool2D(pool_size=2, strides=2))

## 扁平化, 将多维数据转化为一维数据
lenet.add(Flatten())

## 添加全连接层
lenet.add(Dense(120))
lenet.add(Dense(84))
lenet.add(Dense(10, activation=\'softmax\'))

## 编译
lenet.compile(\'sgd\', loss=\'mean_squared_error\', metrics=[\'accuracy\'])

## 读取样本数据
digits = datasets.load_digits()
X, Y = digits.data[:-1], digits.target[:-1]
X = X.reshape(-1,8,8,1)                         ## 将 X 从 (1796, 64) 变为 (1796, 8, 8, 1)
Y = to_categorical(Y)                           ## 将 Y 二进制化 (one-hot)

## 训练
lenet.fit(X, Y, batch_size=64, epochs=50, validation_data=[X, Y])

## 预测
lenet.predict(X)

可视化

sudo apt-get install graphviz
sudo pip install graphviz
sudo pip install pydot_ng


from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import LSTM
from keras.utils import plot_model

model = Sequential()
model.add(Embedding(input_dim=1024, output_dim=256, input_length=50))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation(\'sigmoid\'))

plot_model(model, to_file=\'model.png\')