keras中的主要数据结构是model(模型),它提供定义完整计算图的方法。通过将图层添加到现有模型/计算图,我们可以构建出复杂的神经网络
Sequential模型字面上的翻译是顺序模型,给人的第一感觉是那种简单的线性模型,但实际上Sequential模型可以构建非常复杂的神经网络,包括全连接神经网络、卷积神经网络(CNN)、循环神经网络(RNN)、等等。这里的Sequential更准确的应该理解为堆叠,通过堆叠许多层,构建出深度神经网络
如下代码向模型添加一个带有64个大小为3 * 3的过滤器的卷积层:
from keras.models import Sequential
from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout
model = Sequential()
model.add(Conv2D(64, (3, 3), activation='relu'))
Sequential模型的核心操作是添加layers(图层),以下展示如何将一些最流行的图层添加到模型中:
#添加卷积层
model.add(Conv2D(64, (3, 3), activation='relu'))
#添加最大池化层
model.add(MaxPooling2D(pool_size=(2, 2)))
#添加全连接层
model.add(Dense(256, activation='relu'))
#添加dropout层
model.add(Dropout(0.5))
#Flattening layer(展平层)
model.add(Flatten())
基本的sequential开发流程:
首先,网络的第一层是输入层,读取训练数据。为此,我们需要指定为网络提供的训练数据的大小,这里input_shape参数用于指定输入数据的形状:
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)))
上面的代码中,输入层是卷积层,其获取224 * 224 * 3的输入图像。
接下来就是为模型添加中间层和输出层。
然后,进入最重要的部分: 选择优化器(如rmsprop或adagrad)并指定损失函数(如categorical_crossentropy)来指定反向传播的计算方法。在keras中,Sequential模型的compile方法用来完成这一操作。例如,在下面的这一行代码中,我们使用’rmsprop’优化器,损失函数为’binary_crossentropy’。
model.compile(loss='binary_crossentropy',optimizer='rmsprop')
到这一步,我们创建了模型,接下来就是调用fit函数将数据提供给模型。这里还可以指定批次大小(batch size)、迭代次数、验证数据集等等。其中批次大小、迭代次数需要根据数据规模来确定,并没有一个固定的最优值。
model.fit(x_train, y_train, batch_size=32, epochs=10,validation_data=(x_val, y_val))
最后,使用evaluate方法来评估模型:
score = model.evaluate(x_test,y_test,batch_size = 32)
使用Sequential模型解决线性回归问题
import keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
#生成数据集
trX = np.linspace(-1, 1, 101)
trY = 3 * trX + np.random.randn(*trX.shape) * 0.33
#创建模型
model = Sequential()
#代码创建一个Sequential模型,这里使用了一个采用线性激活的全连接(Dense)层。它实际上封装了输入值x乘以权重w,加上偏置(bias)b,然后进行线性激活以产生输出。
model.add(Dense(input_dim=1, output_dim=1, init='uniform', activation='linear'))
#查看参数值
weights = model.layers[0].get_weights()
w_init = weights[0][0][0]
b_init = weights[1][0]
print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init))
#选择优化器和损失函数
model.compile(optimizer='sgd', loss='mse')
#训练模型
model.fit(trX, trY, nb_epoch=200, verbose=1)
#训练完毕后查看权重和偏执向量
weights = model.layers[0].get_weights()
w_final = weights[0][0][0]
b_final = weights[1][0]
print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final))
训练前权重和偏置向量的值:
训练200轮后权重和偏置向量的值: