在全连接神经网络(DNN)学习了全连接神经网络的原理,然后再使用Keras来实现全连接神经网络,每一步都清晰描述。
Kears的安装过程参考:Tensorflow和Keras版本对照及环境安装。
Keras中文文档请参考:Keras中文文档。
这里使用Keras来实现神经网络,可能会说怎么不用tensorflow呢?
其实tensorflow没有那么好用。tensorflow跟另外一个相近的工具theano,它们非常flexible。它完全可以做deep learning以外的事情。学起来是有一些难度的。而Keras是可以在数十分钟内就精通,就可以非常熟悉它,就可以用来实现一个自己的DNN了。
一、Keras介绍
Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。
如果你在以下情况下需要深度学习库,请使用 Keras:
- 允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。
- 同时支持卷积神经网络和循环神经网络,以及两者的组合。
- 在 CPU 和 GPU 上无缝运行。
Keras 的核心数据结构是 model,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。
二、Keras实现神经网络
Deep learning就是三步。
第一步就是决定你的function set,即决定你的神经网络长什么样子。
Keras里就是先宣告一个model:
model = Sequential()
接下来你就自己决定你的model长什么样子,举例来说我们想要叠一个network,它有两个隐藏层,每一个隐藏层都有500个神经元。要做这件事情,怎么做呢?
做法是在model里面用add()函数加一个全连接网络,全连接网络就是用Dense()来表示。
imput_dim = 2828,表示输入的是一个2828的image,我们把它拉直为28*28维的向量。
units=500就是说输出是500个神经元。
activation是说你的激活函数是什么。这里用的relu,当然也可以选别的。
如果,再加一个Layer,怎么办呢?同样是add()函数加一个Dense()。这里就不需要给它参数input_dim,因为下一层的输入就等于前一层的输出,Keras自己知道。
最后,要做10分类。所以units就设10。激活函数通常选softmax。
第二步,我们要评价一个function的好坏。
那怎么做呢?要用model.compile()函数。然后定义你的loss是什么。比如要用交叉熵损失,就写loss = ‘categorical crossentropy’。
也支持其他的损失函数,在不同的场合可能用到不同的损失函数,可以去查文档。
第三步,是training的部分:
在训练之前,你要下一些configuration,告诉它你训练的时候你打算要怎么做。
要下的第一个东西是optimizer,也就是你要找最好的function的时候,你要用什么样的方式来找最好的function。可以支持各种不同的方法。其实所有的optimizer都是基于gradient descent,不同的方法会帮你决定不同的learning rate。
然后使用model.fit()。当调用这一行的时候,Keras就会train你的network。
x_train是一个numpy array。在这个task里面,要把image 存到numpy array里面。存法是这样的:numpy array是2维的,第一个维度代表有多少张图片,有几个training examples,第二个维度要看有多少个像素(这里有28*28 = 784个像素,所以第二维有784个元素)。因此第一个数组是training examples * 784的二维数组。
y_train也是一个numpy array。同样,第一个维度表示有几个training examples.第二个维度就是10。举例来说,第一张图片是5,所以在他的y_train里面,对应到5的哪一维是1,其他的是0。因此,第二个数组是training examples * 10的数组。
batch_size为100,表示随机挑选100张图片作为一个batch。每个batch更新一次参数。假设有1万ge training examples,则有10000/100 = 100个batch。
epochs = 20表示一共有20个epoch。一个epoch表示把所有的training examples看完一遍。
所用总共要更新20*100次参数。(每个epoch中更新100次,20个epoch)
三、Keras实现神经网络回归预测
数据集(本来想使用房价预测的数据集,但是找不到了,就使用自己的一个数据集):
这里是26个特征变量,即26个X和一个预测值Y。
1. 引入相对应的python包
import matplotlib.pyplot as plt
from math import sqrt
from matplotlib import pyplot
import pandas as pd
from numpy import concatenate
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import Adam
2. 数据集的处理
filename = 'data.csv'
data = pd.read_csv(filename)
values = data.values
scaler = MinMaxScaler(feature_range=(0, 1))
scaled = scaler.fit_transform(values)
Y = scaled[:, -1]
X = scaled[:, 0:-1]
from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y = train_test_split(X, Y, test_size=0.25)
3. 构建全连接网络模型
model = Sequential()
input = X.shape[1]
model.add(Dense(128, input_shape=(input,)))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer=Adam())
from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=50, verbose=2)
history = model.fit(train_x, train_y, epochs=300, batch_size=20,
validation_data=(test_x, test_y), verbose=2,
shuffle=False, callbacks=[early_stopping])
4. 结果可视化
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.title('Model loss')
pyplot.ylabel('Loss')
pyplot.xlabel('Epoch')
pyplot.legend()
pyplot.show()
yhat = model.predict(test_x)
inv_yhat0 = concatenate((test_x, yhat), axis=1)
inv_yhat1 = scaler.inverse_transform(inv_yhat0)
inv_yhat = inv_yhat1[:, -1]
test_y = test_y.reshape(len(test_y), 1)
inv_y0 = concatenate((test_x, test_y), axis=1)
inv_y1 = scaler.inverse_transform(inv_y0)
inv_y = inv_y1[:, -1]
r_2 = r2_score(inv_y, inv_yhat)
print('Test r_2: %.3f' % r_2)
mae = mean_absolute_error(inv_y, inv_yhat)
print('Test MAE: %.3f' % mae)
rmse = sqrt(mean_squared_error(inv_y, inv_yhat))
print('Test RMSE: %.3f' % rmse)
plt.plot(inv_y)
plt.plot(inv_yhat)
plt.show()
结果如下:
参考:
Original: https://blog.csdn.net/weixin_44052055/article/details/122344970
Author: 小朱小朱绝不服输
Title: Keras实现全连接神经网络(python)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/631186/
转载文章受原作者版权保护。转载请注明原作者出处!