1216周三:补充9、模型层的基础算法CNN\RNN

补充基础算法CNN\RNN

1、CNN

基础的CNN由 卷积(convolution), 激活(activation), and 池化(pooling)三种结构组成。

CNN输出的结果是每幅图像的特定特征空间。

当处理图像分类任务时,我们会把CNN输出的特征空间作为全连接层或全连接神经网络(fully connected neural network, FCN)的输入,用全连接层来完成从输入图像到标签集的映射,即分类。

当然,整个过程最重要的工作就是如何通过训练数据迭代调整网络权重,也就是后向传播算法

CNN

2、RNN

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流程图示
RNN算法图示

代码未跑通。。。

朴素的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

你可能感兴趣的:(1216周三:补充9、模型层的基础算法CNN\RNN)