Keras实现全连接神经网络(python)

全连接神经网络(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就是三步。

Keras实现全连接神经网络(python)

第一步就是决定你的function set,即决定你的神经网络长什么样子。

Keras里就是先宣告一个model:

model = Sequential()

接下来你就自己决定你的model长什么样子,举例来说我们想要叠一个network,它有两个隐藏层,每一个隐藏层都有500个神经元。要做这件事情,怎么做呢?

做法是在model里面用add()函数加一个全连接网络,全连接网络就是用Dense()来表示。

imput_dim = 2828,表示输入的是一个2828的image,我们把它拉直为28*28维的向量。

units=500就是说输出是500个神经元。

activation是说你的激活函数是什么。这里用的relu,当然也可以选别的。

Keras实现全连接神经网络(python)
如果,再加一个Layer,怎么办呢?同样是add()函数加一个Dense()。这里就不需要给它参数input_dim,因为下一层的输入就等于前一层的输出,Keras自己知道。
Keras实现全连接神经网络(python)
最后,要做10分类。所以units就设10。激活函数通常选softmax。
Keras实现全连接神经网络(python)
第二步,我们要评价一个function的好坏。

那怎么做呢?要用model.compile()函数。然后定义你的loss是什么。比如要用交叉熵损失,就写loss = ‘categorical crossentropy’。

也支持其他的损失函数,在不同的场合可能用到不同的损失函数,可以去查文档。

Keras实现全连接神经网络(python)
第三步,是training的部分:

在训练之前,你要下一些configuration,告诉它你训练的时候你打算要怎么做。

要下的第一个东西是optimizer,也就是你要找最好的function的时候,你要用什么样的方式来找最好的function。可以支持各种不同的方法。其实所有的optimizer都是基于gradient descent,不同的方法会帮你决定不同的learning rate。

Keras实现全连接神经网络(python)
然后使用model.fit()。当调用这一行的时候,Keras就会train你的network。

Keras实现全连接神经网络(python)
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的数组。

Keras实现全连接神经网络(python)
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()

结果如下:

Keras实现全连接神经网络(python)
Keras实现全连接神经网络(python)

Keras实现全连接神经网络(python)

参考:

代码实践 | 全连接神经网络回归—房价预测

使用Keras实现全连接神经网络完成手写数字识别

Python机器学习笔记:使用Keras进行回归预测

一文搞定深度学习建模预测全流程(Python)

Original: https://blog.csdn.net/weixin_44052055/article/details/122344970
Author: 小朱小朱绝不服输
Title: Keras实现全连接神经网络(python)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/631186/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球