keras相关笔记记载

Keras是一个站在巨人肩膀上的深度学习框架,其后端可以用不同的DL框架支撑,比如theano,比如Tensorflow,比如微软的CNTK。
好消息是,原本被吐槽的速度问题,在使用CNTK做后端之后,官方测试表明甚至可以比原生态的Tensorflow速度还要快。

keras中分两种模型
Sequential/序贯模型,就是大家熟知的一层一层搭网络的这种模型过程。
# 1.序贯模型要点
# 简单的汉堡堆叠 or 手动加菜
# 可以通过向Sequential模型传递一个layer的list来构造序贯模型,或者通过.add()方法一个个的将layer加入模型中

# 一次性构建汉堡,一次性构建好架构
from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential([
    Dense(32, units=784),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])

# ”手动加菜“  一步一步的自己搭建
model = Sequential()
model.add(Dense(32, input_shape=(784,)))
model.add(Activation('relu'))
# 1.2 告诉模型数据的维度
# 模型需要知道输入数据的shape,Sequential的第一层需要接受一个关于输入数据shape的参数,后面的各个层则可以自动的推导出中间数据的shape。
# 第一层的数据维度可以这么给进去(和Tensorflow定义placeholder有点像):
#   - 传递一个input_shape的关键字参数给第一层,input_shape是一个tuple类型的数据,其中也可以填入None,如果填入None则表示此位置可能是任何正整数。数据的batch大小不应包含在其中。
#   - 有些2D层,如Dense,支持通过指定其输入维度input_dim来隐含的指定输入数据shape。一些3D的时域层支持通过参数input_dim和input_length来指定输入shape。
#   - 如果你需要为输入指定一个固定大小的batch_size(常用于stateful RNN网络),可以传递batch_size参数到一个层中,例如你想指定输入张量的batch大小是32,数据shape是(6,8),则你需要传递batch_size=32和input_shape=(6,8)。

model = Sequential()
model.add(Dense(32, input_dim=784))

model = Sequential()
model.add(Dense(32, input_shape=784))

# ### 1.3 编译你的模型

# 在训练模型之前,我们需要通过compile来对学习过程进行配置。compile接收三个参数:
#   - **优化器optimizer**:该参数可指定为已预定义的优化器名,如rmsprop、adagrad,或一个Optimizer类的对象,详情见[optimizers](http://keras-cn.readthedocs.io/en/latest/other/optimizers/)
#   - **损失函数loss**:该参数为模型试图最小化的目标函数,它可为预定义的损失函数名,如categorical_crossentropy、mse,也可以为一个损失函数。详情见[losses](http://keras-cn.readthedocs.io/en/latest/other/objectives/)
#   - **指标列表metrics**:对分类问题,我们一般将该列表设置为metrics=['accuracy']。指标可以是一个预定义指标的名字,也可以是一个用户定制的函数.指标函数应该返回单个张量,或一个完成metric_name - > metric_value映射的字典.请参考[性能评估](http://keras-cn.readthedocs.io/en/latest/other/metrices/)

# 多分类问题
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy', # 多分类交叉熵
              metrics=['accuracy'])

# 二分类问题
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 回归问题
model.compile(optimizer='rmsprop',
              loss='mse')

# 自定义metrics
import keras.backend as K   # 用k来表示,底层不管是TensorFlow还是theao,都可以了

def mean_pred(y_true, y_pred):  # 自定义评价函数
    return K.mean(y_pred)

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy', mean_pred])  # 使用定义的评价函数
# ### 1.4 训练
# 如果你的数据可以一次性读进内容进行建模,那么你会用到fit函数

# 构建与编译模型
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 查出数据
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))

# 训练与数据拟合
model.fit(data, labels, epochs=10, batch_size=32)


# 如果你的数据量很大,你可能要用到 fit_generator,如果数据量比较大,使用类似于生产者消费者的模型进行训练
def generate_arrays_from_file(path):
    while 1:
        f = open(path)
        for line in f:
            x, y = process_line(line)
            img = load_images(x)
            yield (img, y)
        f.close()

model.fit_generator(generate_arrays_from_file('/my_file.txt'),
        samples_per_epoch=10000, nb_epoch=10)   # 当迭代到10*10000就停止了

常用的参数:
model.add(Flatten()) # 将矩阵拉成向量,展平

model.add(Embedding(max_features, output_dim=256)) # 把输入数据做一个embedding,就是指embeding到一个什么样的维度
model.add(LSTM(128)) # 这里的128 理解成很多cell,每个cell都带有memory,而所谓的memory指需要一定的信息来捕捉之前的信息,捕捉信息在神经网络中就是用矩阵或向量来捕捉,这里用128就表示用128维的向量来捕捉memory的部分


dropout是指每个神经元使不使用的概率,而不是简单的比例
batch的选取,
模型训练的时候,取小了,会发现输出的损失震荡的很厉害
取大了,会发现开始的时候损失下降的很快,过了一会就不下将了,可能到达了局部最优解了
keras可以通过回调函数callback 调用TensorFlow 的tensorboard实现可视化
model.fit(..., callbacks=[batch_print_callback, plot_loss_callback, cleanup_callback])
keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, write_graph=True, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None)
回调函数中一些其他的方法
EarlyStopping
keras.callbacks.EarlyStopping(monitor='val_loss', patience=0, verbose=0, mode='auto')
当监测值不再改善时,该回调函数将中止训练
根据验证集上loss的变化,决定要不要把它停掉,因为验证集上的损失不再降,说明它可能过拟合了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值