Keras有两种类型的模型,序贯模型(Sequential)和函数式模型(Model),函数式模型应用更为广泛,序贯模型是函数式模型的一种特殊情况。序贯模型:使用序贯模型可以像搭积木一样一层一层地网上叠加神经网络 .
一、序贯模型
序贯模型的基本步骤
model.add,添加层;
model.compile,模型训练的BP模式设置;
model.fit,模型训练参数设置 + 训练;
model.evaluate,模型评估
model.predict,模型预测
1、建立
可以通过向Sequential模型传递一个layer的list来构造该模型:
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential([Dense(32, units=784),Activation('relu'),Dense(10),Activation('softmax'),])
也可以通过.add()方法一个个的将layer加入模型中:
model = Sequential()
model.add(Dense(32, input_shape=(784,)))
model.add(Activation('relu'))
2、指定输入数据的shape
模型需要知道输入数据的shape,因此,Sequential的第一层需要接受一个关于输入数据shape的参数,后面的各个层则可以自动的推导出中间数据的shape,因此不需要为每个层都指定这个参数。有几种方法来为第一层指定输入数据的shape
传递一个input_shape的关键字参数给第一层,input_shape是一个tuple类型的数据
model = Sequential()
model.add(Dense(64, input_shape=(50,), activation='sigmoid'))
有些2D层,如Dense,支持通过指定其输入维度input_dim来隐含的指定输入数据shape,是一个Int类型的数据。一些3D的时域层支持通过参数input_dim和input_length来指定输入shape。
model = Sequential()
model.add(Dense(64, input_dim=20, activation='relu'))
3、编译
在训练模型之前,我们需要通过compile来对学习过程进行配置。compile接收三个参数:优化器optimizer,损失函数loss,评估函数metrics
model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
4、训练
训练模型一般使用fit函数
model.fit(x_train, y_train,epochs=20,batch_size=128)
5、评估
根据验证集评估模型的好坏,包含损失和精确度两个值
score = model.evaluate(x_val, y_val, batch_size=128)
print('val score:', score[0])
print('val accuracy:', score[1])
6、预测
对已训练完成的模型,输入特征值x会预测得到标签y
x=1
y=model.predict(x,verbose=0)
print(y)
7、实例
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
# 生成训练集和验证集
x_train = np.random.random((2000,30))
y_train = np.random.randint(3, size=(2000, 1))
x_val = np.random.random((200, 30))
y_val = np.random.randint(3, size=(200, 1))
model = Sequential()
model.add(Dense(64, input_dim=30, activation='relu'))
# 或 model.add(Dense(64, input_shape=(20,), activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
model.fit(x_train, y_train,epochs=20,batch_size=128)
score = model.evaluate(x_val, y_val, batch_size=128)
print('val score:', score[0])
print('val accuracy:', score[1])
x=1
y=model.predict(x,verbose=0)
print(y)
二、函数式模型
比序贯模型要复杂,可以同时/分阶段输入变量,分阶段输出想要的模型
1、应用函数式模型的基本步骤
model.layers,添加层;
model.compile,模型训练的BP模式设置;
model.fit,模型训练参数设置 + 训练;
model.evaluate,模型评估
model.predict,模型预测
与上文的主要区别是第一步,参数的输入方式有点区别
2、建立
model=Model(inputs=, outputs=)
3、指定输入数据的shape
inputs = Input(shape=(20,))
4、实例
与上文序贯式模型进行对比
import numpy as np
from keras.models import Model
from keras.layers import Dense, Dropout
# 生成训练集和验证集
x_train = np.random.random((2000,30))
y_train = np.random.randint(3, size=(2000, 1))
x_val = np.random.random((200, 30))
y_val = np.random.randint(3, size=(200, 1))
inputs = Input(shape=(30,))
x=Dense(64,activation='relu')(inputs)
x=Dropout(0.5)(x)
x=Dense(64,activation='relu')(x)
x=Dropout(0.5)(x)
predictions=Dense(1, activation='sigmoid')(x)
model=Model(inputs=inputs, outputs=predictions)
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
model.fit(x_train, y_train,epochs=20,batch_size=128)
score = model.evaluate(x_val, y_val, batch_size=128)
print('val score:', score[0])
print('val accuracy:', score[1])
x=2
y=model.predict(x,verbose=0)
print(y)