美文网首页
1216周三:补充9、模型层的基础算法CNN\RNN

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

作者: 是黄小胖呀 | 来源:发表于2020-12-15 22:48 被阅读0次

    补充基础算法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

          本文链接:https://www.haomeiwen.com/subject/bqupgktx.html