keras的优点是让用户专注于网络模型本身,而不是花大量时间去学tf那些构建图的各种编程套路,
Keras 的核心数据结构是 model,一种组织网络层的方式
经常用到的库:
1、首先创建模型
from keras.models import Sequential
model = Sequential()
2、创建网络层,一下创建了两层,
from keras.layers import Dense
model.add(Dense(25,activation="relu",input_dim=1))#第一层有25个节点,使用的激活函数为relu,输入的数据为一维数据
3、在完成了模型的构建后, 可以使用 .compile() 来配置学习过程
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
或者自己配置优化器:
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True))
我们只需添加输入层,隐藏层和输出层。在他们之间,我们使用dropout来防止过拟合。请注意,你应始终使用20%到50%之间的dropout率。
4、在训练集上训练网络(以 32 个样本为一个 batch 进行迭代)
model.fit(x_train, y_train, epochs=5, batch_size=32)或者model.train_on_batch(x_batch, y_batch)
5、只需一行代码就能评估模型性能
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)
6、对新的数据生成预测
classes = model.predict(x_test, batch_size=128)
在每一层,我们使用“Dense”,这意味着单元全连接。在隐藏层中,我们使用ReLU函数,因为这在大多数情况下会产生令人满意的结果。
优化器optimizer,它可以是现有优化器的字符串标识符,如rmsprop或adagrad,也可以是 Optimizer 类的实例。可以自己写优化器设置优化器的参数,例如:optimizer=keras.optimizers.SGD(learning_rate=xxx).
损失函数loss,模型试图最小化的目标函数。它可以是现有损失函数的字符串标识符,如categorical_crossentropy或mse,也可以是一个目标函数。
评估标准metrics。对于任何分类问题,你都希望将其设置为metrics = ['accuracy']。评估标准可以是现有的标准的字符串标识符,也可以是自定义的评估标准函数。
# 多分类问题model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 二分类问题model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 均方误差回归问题model.compile(optimizer='rmsprop',
loss='mse')
#在分类时有时需要将y数据转换为one-hot编码,one_hot_labels = keras.utils.to_categorical(labels, num_classes=10)
keras保存模型:尽量不要使用pickle,可以使用model.save(filepath).
keras加载模型:keras.model.load_model(filepath)
keras只保存权重信息:model.save_weights().加载权重信息:model.load_weights()
示例
主要输入接收新闻标题本身,即一个整数序列(每个整数编码一个词)。
这些整数在 1 到 10,000 之间(10,000 个词的词汇表),且序列长度为 100 个词。
from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Mode
l# 标题输入:接收一个含有 100 个整数的序列,每个整数在 1 到 10000 之间。# 注意我们可以通过传递一个 "name" 参数来命名任何层。
main_input = Input(shape=(100,), dtype='int32', name='main_input')
# Embedding 层将输入序列编码为一个稠密向量的序列Embedding描述的是一种功能:数据降维和稠密表示(≈向量化),且通常所指的Embedding是中间的产物,为了方便后面的处理,# 每个向量维度为 512。
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)
# LSTM 层把向量序列转换成单个向量,# 它包含整个序列的上下文信息
lstm_out = LSTM(32)(x)