记一次使用Tensorflow搭建神经网络模型经历

隐去背景, 作者最近第一次用Tensorflow实现训练了几个模型, 其中遇到了一些错误, 把它记录下来

前言

以下提到的所有代码, 都可以在github上面找到. 仓库地址 https://github.com/spxcds/neural_network_code/

这个仓库里提到的几段代码, 分别实现在从最简单的lr, 到全连接神经网络, 再到卷积神经网络. 从最简单的自己实现交叉熵损失函数, 计算L2正则化, 到后来直接调用库函数, 由简到难, 由浅入深, 截止目前为止, 只实现了MLR, MLP, LeNet-5, AlexNet, VGG-16等几个算法

网络结构

LeNet-5

AlexNet

代码实现

几个重要的函数

卷积操作

def conv(self, input_tensor, name, kh, kw, dh, dw, n_output, padding=‘SAME‘):
    n_input = input_tensor.get_shape()[-1].value

    kernel = tf.get_variable(
        name=name + ‘kernel‘,
        shape=[kh, kw, n_input, n_output],
        dtype=tf.float32,
        initializer=tf.truncated_normal_initializer(stddev=0.05))
    bias = tf.get_variable(
        name=name + ‘bias‘, shape=[n_output], dtype=tf.float32, initializer=tf.constant_initializer(0.0))

    c = tf.nn.conv2d(input_tensor, kernel, (1, dh, dw, 1), padding=padding) # SAME, VALID
    return tf.nn.relu(tf.nn.bias_add(c, bias), name=name)

全连接操作

def fc(self, input_tensor, name, n_output):
    n_input = input_tensor.get_shape()[-1].value
    weights = tf.get_variable(
        name=name + ‘weights‘,
        shape=[n_input, n_output],
        dtype=tf.float32,
        initializer=tf.truncated_normal_initializer(stddev=0.05))
    tf.add_to_collection(‘losses‘, tf.nn.l2_loss(weights)) # l2_lambda * tf.add_n(tf.get_collection(‘losses‘))
    bias = tf.get_variable(
        name=name + ‘bias‘, shape=[n_output], dtype=tf.float32, initializer=tf.constant_initializer(0.0))

    return tf.nn.bias_add(tf.matmul(input_tensor, weights), bias)

交叉熵

cost_cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(tf.clip_by_value(p, 1e-10, 1.0)), axis=1))

画图

def plot(self, save_path):
    df = pd.DataFrame(self.train_history, columns=[‘iterations‘, ‘train_acc‘, ‘val_acc‘, ‘train_loss‘, ‘val_loss‘])

    # loss曲线
    fig = plt.figure(figsize=(20, 10))
    ax = fig.add_subplot(121)
    ax.grid(True)
    ax.plot(df.iterations, df.train_loss, ‘k‘, label=‘训练集损失‘, linewidth=1.2, alpha=0.4)
    ax.plot(df.iterations, df.val_loss, ‘k--‘, label=‘验证集损失‘, linewidth=2)
    ax.legend(fontsize=16)
    ax.set_xlabel(‘Iterations‘, fontsize=16)
    ax.set_ylabel(‘Loss‘, fontsize=16)
    ax.set_xlim(np.min(df.iterations), np.max(df.iterations) + 0.1, auto=True)
    ax.tick_params(axis=‘both‘, which=‘major‘)
    ax.set_title(‘损失曲线‘, fontsize=22)

    # 混淆矩阵
    fig_matrix_confusion = plt.figure(figsize=(10, 10))
    ax = fig_matrix_confusion.add_subplot(111)
    confusion_matrix = self.get_confusion_matrix(mnist.test.images, mnist.test.labels)
    sns.heatmap(
        confusion_matrix,
        fmt=‘‘,
        cmap=plt.cm.Greys,
        square=True,
        cbar=False,
        ax=ax,
        annot=True,
        xticklabels=np.arange(10),
        yticklabels=np.arange(10),
        annot_kws={‘fontsize‘: 20})
    ax.set_xlabel(‘Predicted‘, fontsize=16)
    ax.set_ylabel(‘True‘, fontsize=16)
    ax.tick_params(labelsize=14)
    ax.set_title(‘混淆矩阵‘, fontsize=22)
    plt.savefig(save_path + ‘_confusion_matrix‘)
    plt.close()

碰到的问题

  1. 网络loss几乎不收敛

    • 学习率设置的不对, 稍微调大一点学习率就可以了
    • batch_size设置的太大
    • 优化算法选一个更高级的, 原先我使用的是tf.train.GradientDescentOptimizer优化算法, 跑了几千个batch才有效果, 换成tf.train.AdamOptimizer, 几十个batch就开始收敛了
  2. 训练一段时间后, 网络loss变为NaN
    • 梯度爆炸, 使学习过程偏离了正常的学习轨迹, 这个时候调低学习率就可以了
    • 计算交叉熵的时候, 出现了log(0)*0的;情况, 使用tf.clip_by_value(t=value,clip_value_min=1e-8,clip_value_min=1.0)避免这种情况
  3. 训练集和验证集accuracy维持在0.1左右不变, 可能正则化参数l2_lambda设置大了, 设成1e-4左右试一下
  4. 全连接层的最后一层输出层就不要加relu了, 直接加一个softmax即可

未经允许禁止转载 http://spxcds.com/2019/01/01/first_deep_learning/

原文地址:https://www.cnblogs.com/spxcds/p/10205562.html

时间: 2024-10-25 07:35:50

记一次使用Tensorflow搭建神经网络模型经历的相关文章

使用Tensorflow训练神经网络模型

最近正在入坑机器学习,前期以读代码为主.买了一本才云科技郑泽宇的书,叫做<Tensorflow,实战Google深度学习框架>,觉得很适合入门的小菜鸟,拿出来跟大家分享下. 下面是第一个完整的训练神经网络模型的代码,里面综合了作者和我在网上查到的其他人关于代码的解读.整理之后如下: 1 #-*-coding:UTF-8-*- 2 import tensorflow as tf 3 #通过numpy工具包生成模拟数据集 4 from numpy.random import RandomState

利用Tensorflow实现神经网络模型

首先看一下神经网络模型,一个比较简单的两层神经. 代码如下: # 定义参数 n_hidden_1 = 256 #第一层神经元 n_hidden_2 = 128 #第二层神经元 n_input = 784 #输入大小,28*28的一个灰度图,彩图没有什么意义 n_classes = 10 #结果是要得到一个几分类的任务 # 输入和输出 x = tf.placeholder("float", [None, n_input]) y = tf.placeholder("float&q

基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型

一.卷积神经网络模型知识要点卷积卷积 1.卷积 2.池化 3.全连接 4.梯度下降法 5.softmax 本次就是用最简单的方法给大家讲解这些概念,因为具体的各种论文网上都有,连推导都有,所以本文主要就是给大家做个铺垫,如有错误请指正,相互学习共同进步. 二.卷积神经网络讲解 2.1卷积神经网络作用 大家应该知道大名鼎鼎的傅里叶变换,即一个波形,可以有不同的正弦函数和余弦函数进行叠加完成,卷积神经网络也是一样,可以认为一张图片是由各种不同特征的图片叠加而成的,所以它的作用是用来提取特定的特征,举

利用Tensorflow实现卷积神经网络模型

首先看一下卷积神经网络模型,如下图: 卷积神经网络(CNN)由输入层.卷积层.激活函数.池化层.全连接层组成,即INPUT-CONV-RELU-POOL-FC池化层:为了减少运算量和数据维度而设置的一种层. 代码如下: n_input = 784 # 28*28的灰度图 n_output = 10 # 完成一个10分类的操作 weights = { #'权重参数': tf.Variable(tf.高期([feature的H, feature的W, 当前feature连接的输入的深度, 最终想得到

【TensorFlow/简单网络】MNIST数据集-softmax、全连接神经网络,卷积神经网络模型

初学tensorflow,参考了以下几篇博客: soft模型 tensorflow构建全连接神经网络 tensorflow构建卷积神经网络 tensorflow构建卷积神经网络 tensorflow构建CNN[待学习] 全连接+各种优化[待学习] BN层[待学习] 先解释以下MNIST数据集,训练数据集有55,000 条,即X为55,000 * 784的矩阵,那么Y为55,000 * 10的矩阵,每个图片是28像素*28像素,带有标签,Y为该图片的真实数字,即标签,每个图片10个数字,1所在位置

Tensorflow 对上一节神经网络模型的优化

本节涉及的知识点: 1.在程序中查看变量的取值 2.张量 3.用张量重新组织输入数据 4.简化的神经网络模型 5.标量.多维数组 6.在TensorFlow中查看和设定张量的形态 7.用softmax函数规范可变参数 8.小结:线性问题 一.在程序中查看变量的取值 x = 1 y = 2.2 z = "adc" print("x is: %d" % x) print("y is: %f" % y) print("z is: %s&quo

tensorflow 神经网络模型概览;熟悉Eager 模式;

典型神经网络模型:(图片来源:https://github.com/madalinabuzau/tensorflow-eager-tutorials) 保持更新,更多内容请关注 cnblogs.com/xuyaowen; 原文地址:https://www.cnblogs.com/xuyaowen/p/tensorflow-nn-Eager.html

Tensorflow搭建神经网络及使用Tensorboard进行可视化

创建神经网络模型 1.构建神经网络结构,并进行模型训练 import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt #python的结果可视化模块 """定义一个添加神经层的函数 inputs:输入数据 in_size:输入神经元的个数 out_size:输出神经元的个数 activation_function:激活函数"""def add_layer(inpu

【数据挖掘技术】神经网络模型

神经网络模型 一.神经网络模型 对网络模型的研究始于20世纪40年代,作为一门交叉学科,它是人类基于对其大脑神经认识的基础上,人工构造实现某种功能的网络模型.经过将近70年的发展,神经网络模型已成为机器学习的典型代表,它不依照任何概率分布,而是模仿人脑功能进行抽象运算.神经网络(Neutral Network)是通过数学算法来模仿人脑思维的,它是数据挖掘中机器学习的典型代表.神经网络是人脑的抽象计算模型,我们知道人脑中有数以百亿个神经元(人脑处理信息的微单元),这些神经元之间相互连接,是的人的大