Keras小记

Keras

1 使用Keras的fit,fit_generator,train_on_batch

Keras .fit函数

小型,简单化的数据集

model.fit(trainX, trainY, batch_size=32, epochs=50)

训练数据(trainX)和训练标签(trainY

模型训练 50个epoch,同时batch size为 32

  • 我们的整个训练集可以放入RAM
  • 没有数据增强(即不需要Keras生成器)
  • 网络将在原始数据上训练
Keras fit_generator函数

数据通常会很大,即使在使用GPU的情况下,我们如果一次性将所有数据(如图像)读入CPU的内存中,内存很有可能会奔溃

  • 真实世界的数据集通常太大而无法放入内存中
  • 它们也往往具有挑战性,要求我们执行数据增强以避免过拟合并增加我们的模型的泛化能力
  • 需要利用Keras的 .fit_generator函数

2 Keras中使用TensorBoard示例

TensorBoard是一个内置于TensorFlow中的基于浏览器的可视化工具。只有当Keras使用TensorFlow后端时,这一方法才能用于Keras模型。
TensorBoard的主要用途是在训练过程中帮助你可视化的监控模型内部发生的一切,这样就可以更清楚地了解模型做了什么、没做什么。

  • 在训练过程中以可视化的方式监控指标
  • 将模型框架可视化
  • 将每层的输出和梯度的直方图可视化
  • 以三维的形式研究嵌入

2.1.构建模型
import keras
from keras import layers
from keras.datasets import imdb
from keras.preprocessing import sequence

# 数据处理
max_features = 2000 # 包含最常见的2000个单词
maxlen = 500 # 将句子截断到500个词

(x_train,y_train),(x_test,y_test) = imdb.load_data(num_words=max_features)
x_train = sequence.pad_sequences(x_train,maxlen=maxlen)
x_test = sequence.pad_sequences(x_test,maxlen=maxlen)

# 构建模型
model = keras.models.Sequential()
model.add(layers.Embedding(max_features,128,
                          input_length=maxlen,
                          name='embed'))
model.add(layers.Conv1D(32,7,activation='relu'))
model.add(layers.MaxPooling1D(5))
model.add(layers.Conv1D(32,7,activation='relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(1))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])

2.2为TensorBoard日志文件创建目录
 # os.mkdir('my_log_dir')
2.3.使用TensorBoard回调函数来训练模型
callbacks = [
    keras.callbacks.TensorBoard(
        log_dir='my_log_dir',
        histogram_freq=1,
    )
]
history = model.fit(x_train,y_train,
                   epochs=20,
                   batch_size=128,
                   validation_split=0.2,
                   callbacks=callbacks)
2.4.在命令行中启动TensorBoard服务
tensorboard --logdir=log
2.5.在浏览器中打开http://localhost:6006

此时tensorboard服务会读取log中的内容并进行可视化


3 编写自己的Keras层

简单、无状态的自定义操作,可以通过 layers.core.Lambda 层来实现

实现三个方法即可:

  • build(input_shape): 这是定义权重的地方。必须设 self.built = True,可以通过调用 super([Layer], self).build() 完成。
  • call(x): 这里是编写层的功能逻辑的地方。只需要关注传入 call 的第一个参数:输入张量,除非你希望你的层支持masking。
  • compute_output_shape(input_shape): 如果你的层更改了输入张量的形状,你应该在这里定义形状变化的逻辑,这让Keras能够自动推断各层的形状。
from keras import backend as K
from keras.engine.topology import Layer

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        # 为该层创建一个可训练的权重
        self.kernel = self.add_weight(name='kernel', 
                                      shape=(input_shape[1], self.output_dim),
                                      initializer='uniform',
                                      trainable=True)
        super(MyLayer, self).build(input_shape)  #一定要在最后调用它

    def call(self, x):
        return K.dot(x, self.kernel)

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)

还可以定义具有多个输入张量和多个输出张量的 Keras 层。 为此,假设方法 build(input_shape)call(x)compute_output_shape(input_shape) 的输入输出都是列表。 例子与上面那个相似:

from keras import backend as K
from keras.engine.topology import Layer

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        assert isinstance(input_shape, list)
        # 为该层创建一个可训练的权重
        self.kernel = self.add_weight(name='kernel',
                                      shape=(input_shape[0][1], self.output_dim),
                                      initializer='uniform',
                                      trainable=True)
        super(MyLayer, self).build(input_shape)  # 一定要在最后调用它

    def call(self, x):
        assert isinstance(x, list)
        a, b = x
        return [K.dot(a, self.kernel) + b, K.mean(b, axis=-1)]

    def compute_output_shape(self, input_shape):
        assert isinstance(input_shape, list)
        shape_a, shape_b = input_shape
        return [(shape_a[0], self.output_dim), shape_b[:-1]]

4 TFRecord

谷歌推荐的一种二进制文件格式,理论上它可以保存任何格式的信息。

uint64 length
uint32 masked_crc32_of_length
byte data[length]
uint32 masked_crc32_of_data
长度、长度校验码、数据、数据校验码

TFRecord 的核心内容在于内部有一系列的 Example ,Example 是 protocolbuf 协议下的消息体。

一个 Example 消息体包含了一系列的 feature 属性。
每一个 feature 是一个 map,也就是 key-value 的键值对。key 取值是 String 类型。
而 value 是 Feature 类型的消息体,它的取值有3种:
BytesList
FloatList
Int64List
都是列表的形式。

message Example {
  Features features = 1;
};

message Features {
  // Map from feature name to feature.
  map<string, Feature> feature = 1;
};

message Feature {
  // Each feature can be exactly one kind.
  oneof kind {
    BytesList bytes_list = 1;
    FloatList float_list = 2;
    Int64List int64_list = 3;
  }
};

message BytesList {
  repeated bytes value = 1;
}
message FloatList {
  repeated float value = 1 [packed = true];
}
message Int64List {
  repeated int64 value = 1 [packed = true];

}

你可能感兴趣的:(keras,深度学习,tensorflow)