使用TensorFlow构建神经网络确实有些麻烦,中间层需要自己核算矩阵,这导致建模略微负责。这里使用Keras构建网络,它可以用TensorFlow作为后端。
1.安装
pip3 install keras
2.小试牛刀
- 数据
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x1 = np.random.rand(100,2)*6
x2 = np.random.rand(100,2)*-6
x_ = np.vstack((x1,x2))
y1 = np.ones((100,1))
y2 = np.zeros((100,1))
y_ = np.vstack((np.hstack((y1,y2)),np.hstack((y2,y1))))
- 模型
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential()
model.add(Dense(1, input_dim=2))
model.add(Activation('relu'))
model.add(Dense(2))
model.add(Activation('softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_, y_, nb_epoch=100, batch_size=20)
keras在构建每层网络的时候非常简单,这里的Dense相当于一层网络,这里把Activation(激活函数)分开写了,实际上可以写在一起。对于第一层网络必须要指定输入维度,中间层的维度不需要管就可以自动设置。模型建立之后要编译,编译过程需要指定损失函数和优化方法。训练使用的方法是fit。
- 模型可视化
from keras.utils import plot_model
plot_model(model, to_file='model.png')
这里的模型可视化需要pyplot,安装方法如下:
pip3 install pydot-ng
sudo apt-get install graphviz
- 训练可视化
fit会返回一个history对象,从中可以获取一些数据包括批次以及损失数据。
h = model.fit(x_, y_, nb_epoch=100, batch_size=10)
plt.plot(h.epoch,h.history['loss'])
- 预测结果
bg = []
values = np.linspace(-6,6,num=50)
for i in range(50):
bg.append([[values[i], v] for v in values])
xx = np.array(bg).reshape(2500,2).astype(np.float32)
out = model.predict(xx)
#out.shape = (2500,2)
out_classes = model.predict_classes(xx)
#out.shape = (2500,)
这里使用predict会给出概率参数,使用predict_classes则会计算出是哪个类别,可以通过查看shape参数看出这个区别。