Keras(四)CNN 卷积神经网络 RNN 循环神经网络 原理及实例
原文链接:http://www.one2know.cn/keras5/
CNN 卷积神经网络
- 卷积 池化
https://www.cnblogs.com/peng8098/p/nlp_16.html 中有介绍 - 以数据集MNIST构建一个卷积神经网路
from keras.layers import Dense,Activation,Conv2D,MaxPooling2D,Flatten
from keras.models import Model,Sequential
from keras.datasets import mnist
from keras.utils import np_utils
# 构建数据集
(x_train,y_train),(x_test,y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape[0],1,28,28)/255
x_test = x_test.reshape(x_test.shape[0],1,28,28)/255
y_train = np_utils.to_categorical(y_train,num_classes=10)
y_test = np_utils.to_categorical(y_test,num_classes=10)
print(x_train[0].shape)
print(y_train[:3])
## 构建模型
model = Sequential()
# 第一层 卷积层
model.add(Conv2D(
# input_shape=(60000,1,28,28),
batch_input_shape=(32,1,28,28), # 输入数据的shape
filters=32, # 滤波器数量为32
kernel_size=5,
strides=1,
padding='same', # same即不改变原来数据的长度和宽度
data_format='channels_first'
))
model.add(Activation('relu')) # 激励函数为relu
# 第二层 池化层
model.add(MaxPooling2D(
pool_size=2, # 分辨率长宽各降低一半,输出数据shape为(32,14,14)
strides=2,
padding='same',
data_format='channels_first'
))
# 再加一遍卷积层和池化层 输出数据shape为(64,7,7)
model.add(Conv2D(64, 5, strides=1, padding='same', data_format='channels_first'))
model.add(Activation('relu'))
model.add(MaxPooling2D(2, 2, 'same', data_format='channels_first'))
# 将数据抹平 再加一层全连接层
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
# 再加一层全连接层 作为输出层
model.add(Dense(10))
model.add(Activation('softmax'))
# 设置adam优化方法,loss函数, metrics方法来观察输出结果
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
# 训练模型
model.fit(x_train, y_train, epochs=1, batch_size=32)
# 预测
loss,accuracy = model.evaluate(x_test,y_test)
print('test loss:',loss)
print('test accuracy:',accuracy)
输出:
Epoch 1/1
32/60000 [..............................] - ETA: 31:05 - loss: 2.2981 - acc: 0.1562
64/60000 [..............................] - ETA: 19:05 - loss: 2.2658 - acc: 0.2344
32/10000 [..............................] - ETA: 35s
96/10000 [..............................] - ETA: 21s
test loss: 0.03328929296457209
test accuracy: 0.9897
RNN 循环神经网络
- 序列数据

我们想象现在有一组序列数据 data 0,1,2,3. 在当预测 result0 的时候,我们基于的是 data0, 同样在预测其他数据的时候, 我们也都只单单基于单个的数据. 每次使用的神经网络都是同一个 NN. 不过这些数据是有关联 顺序的 , 就像在厨房做菜, 酱料 A要比酱料 B 早放, 不然就串味了. 所以普通的神经网络结构并不能让 NN 了解这些数据之间的关联 - 处理序列数据的神经网路
最基本的方式,就是记住之前发生的事情. 那我们让神经网络也具备这种记住之前发生的事的能力. 再分析 Data0 的时候, 我们把分析结果存入记忆. 然后当分析 data1的时候, NN会产生新的记忆, 但是新记忆和老记忆是没有联系的. 我们就简单的把老记忆调用过来, 一起分析. 如果继续分析更多的有序数据 , RNN就会把之前的记忆都累积起来, 一起分析

每次 RNN 运算完之后都会产生一个对于当前状态的描述 , state. 我们用简写 S( t) 代替, 然后这个 RNN开始分析 x(t+1) , 他会根据 x(t+1)产生s(t+1), 不过此时 y(t+1) 是由 s(t) 和 s(t+1) 共同创造的. 所以我们通常看到的 RNN 也可以表达成这种样子
RNN Classifier 实例
- 依然使用MNIST数据集
import numpy as np
np.random.seed(1)
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import SimpleRNN, Activation, Dense
from keras.optimizers import Adam
# 超参数
TIME_STEPS = 28
INPUT_SIZE = 28
BATCH_INDEX = 0 # 从第0个开始训练
BATCH_SIZE = 50 # 一个batch50个数据
CELL_SIZE = 50 # 输出50个神经元
OUTPUT_SIZE = 10 # 输出10个类:0~9
LR = 0.001 # 学习速度
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# data pre-processing
x_train = x_train.reshape(-1, 28, 28) / 255. # 标准化
x_test = x_test.reshape(-1, 28, 28) / 255.
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)
## 搭建模型
model = Sequential()
# 添加RNN层
model.add(SimpleRNN(
batch_input_shape=(None, TIME_STEPS, INPUT_SIZE),
output_dim=CELL_SIZE,
unroll=True,
))
# 添加输出层
model.add(Dense(OUTPUT_SIZE))
model.add(Activation('softmax'))
# 设置优化器
adam = Adam(LR)
model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])
# 训练
for step in range(40001):
X_batch = x_train[BATCH_INDEX: BATCH_INDEX+BATCH_SIZE, :, :]
Y_batch = y_train[BATCH_INDEX: BATCH_INDEX+BATCH_SIZE, :]
cost = model.train_on_batch(X_batch, Y_batch)
BATCH_INDEX += BATCH_SIZE
BATCH_INDEX = 0 if BATCH_INDEX >= x_train.shape[0] else BATCH_INDEX
if step % 500 == 0: # 每训练500进行一次测试
cost, accuracy = model.evaluate(x_test, y_test, batch_size=y_test.shape[0], verbose=False)
print('test cost: ', cost, 'test accuracy: ', accuracy)
输出:
test cost: 2.3316211700439453 test accuracy: 0.12210000306367874
test cost: 0.5586103200912476 test accuracy: 0.8342999815940857
test cost: 0.4080776870250702 test accuracy: 0.8806999921798706
。。。。。。
test cost: 0.12420056015253067 test accuracy: 0.9653000235557556
test cost: 0.13435833156108856 test accuracy: 0.9632999897003174
test cost: 0.12595564126968384 test accuracy: 0.9653000235557556
RNN Regressor 实例
import numpy as np
np.random.seed(1)
from keras.models import Sequential
from keras.layers import Dense,TimeDistributed,SimpleRNN
from keras.optimizers import Adam
import matplotlib.pyplot as plt
# 超参数
BATCH_START = 0
TIME_STEPS = 20 # 时间步长 前面20个数据对下一个有影响
BATCH_SIZE = 50
INPUT_SIZE = 1
OUTPUT_SIZE = 1
CELL_SIZE = 20
LR = 0.01
# 生成数据
def get_batch():
global BATCH_START, TIME_STEPS
xs = np.arange(BATCH_START, BATCH_START+TIME_STEPS*BATCH_SIZE).reshape((BATCH_SIZE, TIME_STEPS)) / (10*np.pi)
seq = np.sin(xs)
res = np.cos(xs)
BATCH_START += TIME_STEPS
return [seq[:, :, np.newaxis], res[:, :, np.newaxis], xs]
# 查看数据
# get_batch()
# exit()
## 搭建网络
model = Sequential()
# 添加RNN层
model.add(SimpleRNN(
batch_input_shape=(BATCH_SIZE, TIME_STEPS, INPUT_SIZE),
output_dim=CELL_SIZE,
return_sequences=True, # 对于每一个时间点需不需要输出对应的output,True每个时刻都输出,False最后的输出output
stateful=True, # batch与batch之间是否有联系,需不需要将状态进行传递
))
# 添加输出层
model.add(TimeDistributed(Dense(OUTPUT_SIZE))) # TimeDistributed:对每一个output进行全连接的计算
# 优化器
adam = Adam()
model.compile(
optimizer=adam,
loss='mse',
)
# 训练
print('Training ------------')
for step in range(501):
# data shape = (batch_num, steps, inputs/outputs)
X_batch, Y_batch, xs = get_batch()
cost = model.train_on_batch(X_batch, Y_batch)
pred = model.predict(X_batch, BATCH_SIZE)
plt.plot(xs[0, :], Y_batch[0].flatten(), 'r', xs[0, :], pred.flatten()[:TIME_STEPS], 'b--')
plt.ylim((-1.2, 1.2))
plt.draw()
plt.pause(0.1)
if step % 10 == 0:
print('train cost: ', cost)
Keras(四)CNN 卷积神经网络 RNN 循环神经网络 原理及实例的更多相关文章
- Recurrent Neural Networks(RNN) 循环神经网络初探
1. 针对机器学习/深度神经网络“记忆能力”的讨论 0x1:数据规律的本质是能代表此类数据的通用模式 - 数据挖掘的本质是在进行模式提取 数据的本质是存储信息的介质,而模式(pattern)是信息的一 ...
- CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
https://www.zhihu.com/question/34681168 CNN(卷积神经网络).RNN(循环神经网络).DNN(深度神经网络)的内部网络结构有什么区别?修改 CNN(卷积神经网 ...
- CNN(卷积神经网络)、RNN(循环神经网络)、DNN,LSTM
http://cs231n.github.io/neural-networks-1 https://arxiv.org/pdf/1603.07285.pdf https://adeshpande3.g ...
- TensorFlow框架(6)之RNN循环神经网络详解
1. RNN循环神经网络 1.1 结构 循环神经网络(recurrent neural network,RNN)源自于1982年由Saratha Sathasivam 提出的霍普菲尔德网络.RNN的主 ...
- 4.5 RNN循环神经网络(recurrent neural network)
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1 RNN循环神经网络 ...
- 关于 RNN 循环神经网络的反向传播求导
关于 RNN 循环神经网络的反向传播求导 本文是对 RNN 循环神经网络中的每一个神经元进行反向传播求导的数学推导过程,下面还使用 PyTorch 对导数公式进行编程求证. RNN 神经网络架构 一个 ...
- CNN(卷积神经网络)、RNN(循环神经网络)和DNN(深度神经网络)
本文转载修改自:知乎-科言君 感知机(perceptron) 神经网络技术起源于上世纪五.六十年代,当时叫感知机(perceptron),拥有输入层.输出层和一个隐含层.输入的特征向量通过隐含层变换达 ...
- 神经网络6_CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)概念区分理解
sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程,QQ:231469242) https://study.163.com/course/introduction.htm?courseId ...
- 学习笔记TF057:TensorFlow MNIST,卷积神经网络、循环神经网络、无监督学习
MNIST 卷积神经网络.https://github.com/nlintz/TensorFlow-Tutorials/blob/master/05_convolutional_net.py .Ten ...
随机推荐
- UltraEdit不自动生成保存备份文件(.bak)
UltraEdit修改文件或格式化文件保存后会生成烦人的.bak文件. 去掉该功能办法如下: 高级 -> 配置 -> 文件处理 -> 备份 “保存时备份文件”选择“不备份” (Adv ...
- Metrics类型
Metrics类型 在上一小节中我们带领读者了解了Prometheus的底层数据模型,在Prometheus的存储实现上所有的监控样本都是以time-series的形式保存在Prometheus内存的 ...
- java相关的一些资源
http://www.cnblogs.com/best/p/5876559.html#_label1
- Redis 学习笔记(篇七):Redis 持久化
因为 Redis 是内存数据库,它将自己的数据储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据也将会丢失,为了解决这个问题,Redis ...
- 前端笔记之微信小程序(三)GET请求案例&文件上传和相册API&配置https
一.信息流小程序-GET请求案例 1.1服务端接口开发 一定要养成接口的意识,前端单打独斗出不来任何效果,必须有接口配合,写一个带有分页.关键词查询的接口: 分页接口:http://127.0.0.1 ...
- zookeeper基本知识入门(一)
之前我们在搭建hadoop分布式环境的时候用到过Zookeeper注册hadoop服务.那么到底Zookeeper在分布式环境中发挥了什么作用呢,这次我们就来讨论这个问题. 在分布式系统中通常都会有多 ...
- testlink搭建教程
1,下载testlink安装包 请加QQ群299524235,在群文件中下载 2.配置Apache环境和PHP环境 解压testlink文件到Apache中, 通过127.0.0.1/ ...
- Kafka 系列(五)—— 深入理解 Kafka 副本机制
一.Kafka集群 Kafka 使用 Zookeeper 来维护集群成员 (brokers) 的信息.每个 broker 都有一个唯一标识 broker.id,用于标识自己在集群中的身份,可以在配置文 ...
- TinyMCE使用
1.文本&文本字体颜色 与word类似不赘述 2.字体加粗&划线 与word类似不赘述 选中后 ctrl + B 加粗快捷键 选中后 ctrl + I 斜体快捷键 选中后 c ...
- .net测试篇之单元测试/集成测试神器Autofixture
autofixture简介 有了单元测试框架加上Moq(后面我们会用单独章节来介绍moq),可以说测试问题基上都能搞定了.然而有了AutoFixture对单元测试来说可以说是如虎添翼,AutoFixt ...