Keras是由python编写的开源的人工神经网络库,
Keras可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化
Keras 已经被添加到 TensorFlow 中,成为其默认的框架,为TensorFlow 提供更高级的API。 
如果读者不想了解 TensorFlow 的细节,那么 Keras 是一个不错的选择。因为Keras是高度封装的,完全模块化的,并且具有可扩展性。
Keras支持多操作系统下的多GPU并行计算。
如果将TensorFlow 比喻为编程界的Java 或 C++,那么 Keras 就是编程界的Python。
它作为 TensorFlow 的高层封装,可以与TensorFlow 联合使用,用它很速搭建原型。 
另外,Keras 兼容两种后端,即 Theano 和 TensorFlow,并且其接口形式和 Torch 有几分相像。
掌握 Keras 可以大幅提升对开发效率和网络结构的理解。 

1/Keras 的优点 
     Keras 是高度封装的,完全模块化的,具有可扩展性,非常适合新手使用,代码更新速度比较很,示例代码也比较多,文档和讨论区也比较完善。
     最重要的是,Keras 是 TensorFlow 官方支持的。当机器上有可用的GPU时,代码会自动调用GPU 进行并行计算。 
     Keras 官方网站上描述了它的几个优点,具体如下。 
          ● 模块化:模型的各个部分,如神经层、成本函数、优化器、初始化、激活函数、规范化都是独立的模块,可以组合在一起来创建模型。 
          ● 极简主义:每个模块都保持简短和简单。 
          ● 易扩展性:很容易添加新模块,因此 Keras 适于做进一步的高级研究。 
          ● 使用 Python 语言:模型用Python实现,非常易于调试和扩展。 
          
2/Keras 的模型 
    Keras 的核心数据结构是模型。模型是用来组织网络层的方式(即模型是把多层网络叠加在一起的模式)
    模型有两种,一种叫 Sequential 模型,另一种叫 Model 模型。
    Sequential 模型是一系列网络层按顺序构成的栈,是单输入和单输出的,层与层之间只有相邻关系,是最简单的一种模型。
    Model 模型是用来建立更复杂的模型的。 
    这里先介绍简单的 Sequential 模型的使用(后面将会以一个示例来介绍 Model 模型)
    <1>首先是加载数据,这里我们假设数据已经加载完毕,是X_train, Y_train 和 X_test, Y_test。
    <2>然后构建模型: 
        from keras.models import Sequential 
        from keras.layers import Dense, Activation 
        houzhen_model = Sequential()   # 先定义一个空的模型
        houzhen_model.add(Dense(output_dim=64, input_dim=100)) 
        houzhen_model.add(Activation(“relu”)) 
        houzhen_model.add(Dense(output_dim=10)) 
        houzhen_model.add(Activation(“softmax”)) 
    <3>接着,编译模型,同时指明损失函数和优化器: 
        houzhen_model.compile(loss="categorical_crossentropy",optimizer=’sgd’,metrics=["accuracy"]) 
    <4>最后,训练模型和评估模型: 
        houzhen_model.fit(X_train, Y_train, nb_epoch=5, batch_size=32) 
        loss_and_metrics = houzhen_model.evaluate(X_test, Y_test, batch_size=32) 
    <5>这就是一个最简单的模型的使用
       如果要搭建复杂的网络,可以使用 Keras 的 Model 模型
       它能定义多输出模型、含有共享层的模型、共享视觉模型、图片问答模型、视觉问答模型等。 
       在Keras 的源代码的examples文件夹里还有更多的例子,有兴趣的读者可以参参。 

3/Keras 的使用 
    我们下载Keras 代码①到本地目录,将下载后的目录命名为keras
    Keras 源代码中包含很多 
    示例,例如: 
        ● CIFAR10—图片分类(使用CNN 和实时数据); 
        ● IMDB—电影评论观点分类(使用LSTM); 
        ● Reuters—新闻主题分类(使用多层感知器); 
        ● MNIST—手写数字识别(使用多层感知器和CNN); 
        ● OCR—识别字符级文本生成(使用LSTM)。 
    这里我们主要用MNIST 示例进行讲解。 
  <1> 安装 
        Keras 的安装非常简单,不依赖操作系统,建议大家直接通过 pip 命令安装: 
        pip install keras 
        安装完成后,需要选择依赖的后端,在~/.keras/keras.json 下修改最后一行backend 对应的 
        值即可。修改后的文件如下: 
        { 
        “image_dim_ordering”: “tf”, 
        “epsilon”: 1e-07, 
        “floatx”: “float32”, 
        “backend”: “tensorflow” 
        } 
  <2> 实现一个网络模型 
      主要分为加载数据、模型构建、模型编译、模型训练、模型评估或者模型预测几步。
      下面我们就用最简单的MNIST 示例来看如何用Keras 实现一个卷积神经网络(CNN)。 
      首先,定义好一参数以及加载数据,如下: 
      batch_size = 128 
      nb_classes = 10 # 分类数 
      nb_epoch = 12 # 训练轮数 
      # 输入图片的维度 
      img_rows, img_cols = 28, 28 
      # 卷积滤镜的个数 
      nb_filters = 32 
      # 最大池化,池化核大小 
      pool_size = (2, 2) 
      # 卷积核大小 
      kernel_size = (3, 3) 
      (X_train, y_train), (X_test, y_test) = mnist.load_data() 
      if K.image_dim_ordering() == ‘th’: 
      # 使用Theano 的顺序:(conv_dim1, channels, conv_dim2, conv_dim3) 
      X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols) 
      X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols) 
      input_shape = (1, img_rows, img_cols) 
      else: 
      # 使用TensorFlow 的顺序:(conv_dim1, conv_dim2, conv_dim3, channels) 
      X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1) 
      X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1) 
      input_shape = (img_rows, img_cols, 1) 
      X_train = X_train.astype(‘float32’) 
      X_test = X_test.astype(‘float32’) 
      X_train /= 255 
      X_test /= 255 
      # 将类向量转换为二进制类矩阵 
      Y_train = np_utils.to_categorical(y_train, nb_classes) 
      Y_test = np_utils.to_categorical(y_test, nb_classes) 
      下面来构建模型,这里用2 个卷积层、1 个池化层和2 个全连接层来构建,如下: 
      model = Sequential() 
      model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], 
      border_mode=’valid’, 
      input_shape=input_shape)) 
      model.add(Activation(‘relu’)) 
      model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1])) 
      model.add(Activation(‘relu’)) 
      model.add(MaxPooling2D(pool_size=pool_size)) 
      model.add(Dropout(0.25)) 
      model.add(Flatten()) 
      model.add(Dense(128)) 
      model.add(Activation(‘relu’)) 
      model.add(Dropout(0.5)) 
      model.add(Dense(nb_classes)) 
      model.add(Activation(‘softmax’)) 
      随后,用model.compile()函数编译模型,采用多分类的损失函数,用Adadelta 算法做优化 
      方法,如下: 
      model.compile(loss=’categorical_crossentropy’, 
      optimizer=’adadelta’, 
      metrics=[‘accuracy’]) 
      然后,开始用model.fit()函数训练模型,输入训练集和测试数据,以及batch_size 和nb_epoch 
      参数,如下: 
      model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, 
      verbose=1, validation_data=(X_test, Y_test)) 
      最后,用model.evaluate()函数来评估模型,输出测试集的损失值和准确率,如下: 
      score = model.evaluate(X_test, Y_test, verbose=0) 
      print(‘Test score:’, score[0]) 
      print(‘Test accuracy:’, score[1]) 
      计算出的损失值和准确率如下: 
      Test score: 0.0327563833317 
      Test accuracy: 0.9893 
      这是一个非常简单的例子。尽管模型架构是不变的,但是读者要将其应用到自己的开发领 
      域,一般是先读懂对应的神经网络论文,然后用这个架构去搭建和训练模型。 

<3> 模型的加载及保存 
      Keras 的save_model 和load_model 方法可以将Keras 模型和权重保存在一个HDF5 文件中, 
      这里面包括模型的结构、权重、训练的配置(损失函数、优化器)等。如果训练因为某种原因 
      keras.models import save_model, load_model 
      def test_sequential_model_saving(): 
      model = Sequential() 
      model.add(Dense(2, input_dim=3)) 
      model.add(RepeatVector(3)) 
      model.add(TimeDistributed(Dense(3))) 
      model.compile(loss=objectives.MSE, 
      optimizer=optimizers.RMSprop(lr=0.0001), 
      metrics=[metrics.categorical_accuracy], 
      sample_weight_mode=’temporal’) 
      x = np.random.random((1, 3)) 
      y = np.random.random((1, 3, 3)) 
      model.train_on_batch(x, y) 
      out = model.predict(x) 
      _, fname = tempfile.mkstemp(‘.h5’) # 创建一个HDFS 5 文件 
      save_model(model, fname) 
      new_model = load_model(fname) 
      os.remove(fname) 
      out2 = new_model.predict(x) 
      assert_allclose(out, out2, atol=1e-05) 
      # 检测新保存的模型和之前定义的模型是否一致 
      x = np.random.random((1, 3)) 
      y = np.random.random((1, 3, 3)) 
      model.train_on_batch(x, y) 
      new_model.train_on_batch(x, y) 
      out = model.predict(x) 
      out2 = new_model.predict(x) 
      assert_allclose(out, out2, atol=1e-05) 
      如果只是希望保存模型的结构,而不包含其权重及训练的配置(损失函数、优化器),可 
      以使用下面的代码将模型序列化成json 或者yaml 文件: 
      json_string = model.to_json() 
      json_string = model.to_yaml() 
      保存完成后,还可以手动编辑,并且使用如下语句进行加载: 
      from keras.models import model_from_json 
      model = model_from_json(json_string) 
      model = model_from_yaml(yaml_string) 
      如果仅需要保存模型的权重,而不包含模型的结构,可以使用save_weights 和load_weights 
      语句来保存和加载: 
      model.save_weights(‘my_model_weights.h5’) 
      model.load_weights(‘my_model_weights.h5’)

   
Copy the code