补充基础算法CNN\RNN
1、CNN
基础的CNN由 卷积(convolution), 激活(activation), and 池化(pooling)三种结构组成。
CNN输出的结果是每幅图像的特定特征空间。
当处理图像分类任务时,我们会把CNN输出的特征空间作为全连接层或全连接神经网络(fully connected neural network, FCN)的输入,用全连接层来完成从输入图像到标签集的映射,即分类。
当然,整个过程最重要的工作就是如何通过训练数据迭代调整网络权重,也就是后向传播算法。
2、RNN
RNN模型更多原理:
实例
1、CNN实现
小tips:padding是什么,可填充元素使得卷积前后输入输出尺寸相同,https://zhuanlan.zhihu.com/p/51438052
实现代码如下:
10 import tensorflow as tf
11import numpy asnp
12
13 class CNN(tf.keras.Model):
14 def __init__(self):
15 super().__init__()
16 self.conv1 = tf.keras.layers.Conv2D(
17 filters=32, # 卷积层神经元(卷积核)数目
18 kernel_size=[5, 5], # 感受野大小
19 padding='same', # padding策略(vaild 或 same)
20 activation=tf.nn.relu # 激活函数
21 )
22 self.pool1 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)
23 self.conv2 = tf.keras.layers.Conv2D(
24 filters=64,
25 kernel_size=[5, 5],
26 padding='same',
27 activation=tf.nn.relu
28 )
29 self.pool2 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)
30 self.flatten = tf.keras.layers.Reshape(target_shape=(7 * 7 * 64,))
31 self.dense1 = tf.keras.layers.Dense(units=1024, activation=tf.nn.relu)
32 self.dense2 = tf.keras.layers.Dense(units=10)
33
34 def call(self, inputs):
35 x = self.conv1(inputs) # [batch_size, 28, 28, 32]
36 x = self.pool1(x) # [batch_size, 14, 14, 32]
37 x = self.conv2(x) # [batch_size, 14, 14, 64]
38 x = self.pool2(x) # [batch_size, 7, 7, 64]
39 x = self.flatten(x) # [batch_size, 7 * 7 * 64]
40 x = self.dense1(x) # [batch_size, 1024]
41 x = self.dense2(x) # [batch_size, 10]
42 output = tf.nn.softmax(x)
43 return output
44
45 class MNISTLoader():
46 def __init__(self):
47 mnist = tf.keras.datasets.mnist
48 (self.train_data, self.train_label), (self.test_data, self.test_label) = mnist.load_data()
49 # MNIST中的图像默认为uint8(0-255的数字)。以下代码将其归一化到0-1之间的浮点数,并在最后增加一维作为颜色通道
50 self.train_data = np.expand_dims(self.train_data.astype(np.float32) /255.0, axis=-1) # [60000, 28, 28, 1]
51 self.test_data = np.expand_dims(self.test_data.astype(np.float32) /255.0, axis=-1) # [10000, 28, 28, 1]
52 self.train_label = self.train_label.astype(np.int32) # [60000]
53 self.test_label = self.test_label.astype(np.int32) # [10000]
54 self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0]
55
56 def get_batch(self, batch_size):
57 # 从数据集中随机取出batch_size个元素并返回
58 index = np.random.randint(0, np.shape(self.train_data)[0], batch_size)
59 return self.train_data[index, :], self.train_label[index]
60
61num_epochs = 5
62batch_size = 50
63learning_rate = 0.001
64
65model = CNN()
66data_loader = MNISTLoader()
67optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)
68
69
70num_batches = int(data_loader.num_train_data // batch_size * num_epochs)
71 for batch_index in range(num_batches):
72 X, y = data_loader.get_batch(batch_size)
73 with tf.GradientTape() as tape:
74 y_pred = model(X)
75 loss = tf.keras.losses.sparse_categorical_crossentropy(y_true=y, y_pred=y_pred)
76 loss = tf.reduce_mean(loss)
77 print("batch %d: loss %f" % (batch_index, loss.numpy()))
78 grads = tape.gradient(loss, model.variables)
79 optimizer.apply_gradients(grads_and_vars=zip(grads, model.variables))
80
81
82sparse_categorical_accuracy = tf.keras.metrics.SparseCategoricalAccuracy()
83num_batches = int(data_loader.num_test_data // batch_size)
84 for batch_index in range(num_batches):
85 start_index, end_index = batch_index * batch_size, (batch_index +1) * batch_size
86 y_pred = model.predict(data_loader.test_data[start_index: end_index])
87 sparse_categorical_accuracy.update_state(y_true=data_loader.test_label[start_index: end_index], y_pred=y_pred)
88print("test accuracy: %f" % sparse_categorical_accuracy.result())
2、RNN实现
循环神经网络(Recurrent Neural Network, RNN)是一种适宜于处理序列数据的神经网络,被广泛用于语言模型、文本生成、机器翻译等。
一个利用RNN进行文本自动生成的例子,这个任务的本质是预测一段英文文本的接续字母的概率分布。
流程如下:
(1)#实现一个DataLoader类来读取文本
(2)#模型的实现,在init方法中实例化一个LSTMcell单元以及一个线性变换的全连接层
#初始化RNN单元的状态,存入变量state中,接下来将序列从头到尾依次送入RNN单元,即在t时刻将上一时刻t-1的RNN单元状态stat e和序列的第t个元素inputs[t:]送入RNN单元,得到当前时刻的输出output和RNN单元状态,取RNN单元最后一次的输出通过全连接层 变换到num_chars维,作为模型的输出。
(3)#定义模型的超参数
(4)#定义训练过程
代码未跑通。。。
朴素的RNN之后有优化的LSTM和GRU结构
参考资料:
1、卷积神经网络 https://www.zhihu.com/topic/20043586/intro
2、一文搞懂RNN(循环神经网络)基础篇 https://zhuanlan.zhihu.com/p/30844905
3、简单粗暴 TensorFlow 2.0 循环神经网络(RNN) https://www.bookstack.cn/read/TensorFlow2.0/spilt.4.c868281a01ad8ec0.md
4、零基础入门深度学习(6) - 长短时记忆网络(LSTM) https://zybuluo.com/hanbingtao/note/581764
5、人人都能看懂的LSTM https://zhuanlan.zhihu.com/p/32085405