# Tensorflow实现CNN

[En]

In the process of typing the code, if you encounter unclear functions, you can directly look at the interpretation of the source code (or directly search bloggers on Baidu), so it will not be easy to make mistakes and have a better understanding of what they are for.

import tensorflow as tf # 导入tensorflow
from tensorflow.examples.tutorials.mnist import input_data # 导入自带数据集

mnist = input_data.read_data_sets('MNIST_data/', one_hot=True) # 设置数据集
x = tf.placeholder(tf.float32,[None, 784]) # placeholder image
y_ = tf.placeholder(tf.float32, [None, 10]) # placeholder label

----Weight Initialization--- #
One should generally initialize weights with a small amount of noise
for symmetry breaking,

def weight_variable(shape): # 权重
# mean，均值，默认0  stddev，标准差，默认1
# 截断的产生正态分布的随机数，即随机数与均值的差值若大于两倍的标准差，则重新生成
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape): # 偏差
initial = tf.constant(0.1, shape=shape) # 常量填充
return tf.Variable(initial)

Convolution and Pooling
Our convolutions uses a stride of one and are zero padded
so that the output is the same size as the input.

Our pooling is plain old max pooling over 2x2 blocks

def conv2d(x, W):
# tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
def max_pool_2x2(x):
# h : 需要池化的输入，一般池化层接在卷积层后面，
# 所以输入通常是feature map，依然是[batch_size, height, width, channels]这样的shape
# k_size : 池化窗口的大小，取一个四维向量，一般是[1, height, width, 1]，
# 因为我们不想在batch和channels上做池化，所以这两个维度设为了1

To apply the layer, we first reshape x to a 4d tensor,
with the second and third dimensions corresponding to image width and height,
and the final dimension corresponding to the number of color channels.

x_image = tf.reshape(x, [-1,28,28,1])

#----first convolution layer----#
#the convolution will compute 32 features for each 5x5 patch. Its weight tensor will have a shape of [5, 5, 1, 32].

#The first two dimensions are the patch size,
#the next is the number of input channels, and the last is the number of output channels.

W_conv1 = weight_variable([5,5,1,32]) # 使用32个5x5的filter，然后通过maxpooling。

#We will also have a bias vector with a component for each output channel.

b_conv1 = bias_variable([32])

#We then convolve x_image with the weight tensor, add the bias, apply the ReLU function, and finally max pool.

#The max_pool_2x2 method will reduce the image size to 14x14.

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) # relu：将输入小于0的值幅值为0，输入大于0的值不变。
h_pool1 = max_pool_2x2(h_conv1)

#----second convolution layer----#
#The second layer will have 64 features for each 5x5 patch and input size 32.

W_conv2 = weight_variable([5,5,32,64]) # 这里的32是因为第一个卷积层有 32 个卷积核
b_conv2 = bias_variable([64])

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

#----fully connected layer----#
#Now that the image size has been reduced to 7x7,
#we add a fully-connected layer with 1024 neurons to allow processing on the entire image
W_fc1 = weight_variable([7*7*64, 1024])
b_fc1 = bias_variable([1024])

h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) # reshape后的数字参数，就是多维度的行列数
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1) + b_fc1)

#-----dropout------#
# tf.nn.dropout 中参数 keep_prob :每一个元素被保存下的概率。
# tf.layer.dropout 中参数 rate :每一个元素丢弃的概率。keep_prob = 1 - rate
# tf.layers.dropout(inputs,rate=0.5,noise_shape=None,seed=None,training=False,name=None)
#To reduce overfitting, we will apply dropout before the readout layer.

#We create a placeholder for the probability that a neuron's output is kept during dropout.

#This allows us to turn dropout on during training, and turn it off during testing.

tf.nn.dropout是tensorflow常用的函数，它的作用是为了减轻过拟合带来的问题而使用的函数，它一般用在每个连接层的输出。
Dropout就是在不同的训练过程中，按照一定概率使得某些神经元停止工作。

# dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
# **x：**上一层传下载的tensor。（一般用于全连接层后面）
# keep_prob：保留keep_prob的神经元继续工作，其余的停止工作与更新。
# dropout必须设置概率keep_prob,keep_prob应初始化为占位符placeholder。
# train的时候才是dropout起作用的时候,test的时候不应该让dropout起作用。
keep_prob = tf.placeholder(tf.float32)
h_fc1_dropout = tf.nn.dropout(h_fc1, keep_prob) # 每一个元素被保存下的概率。

# 函数：tf.matmul(a,b)  表示：将矩阵 a 乘以矩阵 b, 生成a * b
W_fc2 = weight_variable([1024,10])
b_fc2 = bias_variable([10])
y_conv = tf.matmul(h_fc1_dropout, W_fc2) + b_fc2  # y = w * x + b  这里x被dropout

tf.global_variables_initializer().run()初始化变量
#------train and evaluate----#
# tf.reduce_mean（input_tensor, axis） 函数用于计算张量tensor沿着指定的数轴（tensor的某一维度）上的的平均值，
# 主要用作降维或者计算tensor（图像）的平均值。默认计算所有元素的均值、降低输出结果的维度
# 对于二维2*2的一个tensor，axis=None(得到四个数的平均)，axis=0(列方向求mean)，axis=1(行方向求mean)
# tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv)
# labels：真实标签，注意是一个onehot向量，且长度跟logits一样长，长度为类别数
# logits：模型最后一层的输出，注意不要过softmax函数，维度为[batch_size,numclass]
# 算出的结果表示真实标签和预测标签之间的差距，使用的是softmax交叉熵来进行计算
# 第一个参数logits：就是神经网络最后一层的输出，
#如果有batch的话，它的大小就是[batchsize，num_classes]，单样本的话，大小就是num_classes
# 第二个参数labels：实际的标签，大小同上

# minimize的内部存在两个操作：(1)计算各个变量的梯度 (2)用梯度更新这些变量的值
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
tf.cast()函数的作用是执行 tensorflow 中张量数据类型转换
tf.argmax(input,axis)根据axis取值的不同返回每行或者每列最大值的索引
accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y_, 1), tf.argmax(y_conv, 1)), tf.float32))
Session提供了Operation执行和Tensor求值的环境
with tf.Session() as sess:
tf.global_variables_initializer().run() # 初始化变量
# 在你构建完整个模型并在会话中加载模型后，运行这个节点。能够将所有的变量一步到位的初始化，非常的方便
for i in range(3000):
batch = mnist.train.next_batch(50) # 通过next_batch来获取下一个数据集来对我们的参数进行调整
if i % 100 == 0:
# eval() 其实就是tf.Tensor的Session.run() 的另外一种写法 用来启动计算
# eval()只能用于tf.Tensor类对象，也就是有输出的Operation。
# 对于没有输出的Operation, 可以用.run()或者Session.run()。Session.run()没有这个限制。
train_accuracy = accuracy.eval(feed_dict = {x: batch[0],
y_: batch[1],
keep_prob: 1.})
print('setp {},the train accuracy: {}'.format(i, train_accuracy))
train_step.run(feed_dict = {x: batch[0], y_: batch[1], keep_prob: 0.5}) # run session

test_accuracy = accuracy.eval(feed_dict = {x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.})
print('the test accuracy :{}'.format(test_accuracy))

saver = tf.train.Saver() # 保存和加载模型 会自动生成4个文件
path = saver.save(sess, './my_net/mnist_deep.ckpt')
print('save path: {}'.format(path))



Original: https://blog.csdn.net/hhr603894090/article/details/122072219
Author: 红颜如霜
Title: Tensorflow实现CNN

(0)

### 大家都在看

• #### 从零使用TensorFlow搭建CNN（卷积）神经网络

🍅 写在前面👨‍🎓 博主介绍：大家好，这里是hyk写算法了吗，一枚致力于学习算法和人工智能领域的小菜鸟。🔎个人主页：主页链接（欢迎各位大佬光临指导）⭐️近期专栏：机器学习与深度学习…

人工智能 2023年7月27日
0118
• #### 因果信号的傅里叶变换_常用信号的傅里叶变换对

第一部分：傅里叶变换的推导和常见信号的傅里叶变换(续) [En] The first part: the derivation of Fourier transform and t…

人工智能 2023年5月27日
0132
• #### MATLAB中text函数使用

目录 语法 说明 示例 向数据点添加文本说明 向多个数据点添加文本 显示多行文本 指定文本大小和颜色 修改现有文本 text函数的功能是向数据点添加文本说明。 语法 text(x,…

人工智能 2023年7月4日
0151
• #### NCCL基本介绍

前言 调研一下NCCL，所以在这里记录一下。 参考： NCCL DOCUMENTATIONNCCL Slide浅谈GPU通信和PCIe P2P DMA 简介 NCCL是NVIDIA…

人工智能 2023年6月15日
0168
• #### Beam Search快速理解及代码解析

Beam Search 简单介绍一下在文本生成任务中常用的解码策略Beam Search（集束搜索）。 生成式任务相比普通的分类、tagging等NLP任务会复杂不少。在生成的时候…

人工智能 2023年5月28日
0173
• #### 模式识别与图像处理课程实验二：基于UNet的目标检测网络

模式识别与图像处理课程实验二：基于UNet的目标检测网络 一、 实验原理与目的 二、 实验内容 三、 实验程序 * 3.1、导入库 3.2、创建一个解析对象 3.3、输入命令行和参…

人工智能 2023年6月17日
0155
• #### 深度学习实战：基于CNN的猫狗图像识别

公众号：尤而小屋作者：Peter编辑：Peter 大家好，我是Peter~ 本文记录了第一个基于卷积神经网络在图像识别领域的应用： 猫狗图像识别。主要内容包含： 数据处理 神经网络…

人工智能 2023年7月5日
0155
• #### Efficient Estimation of Word Representations in vector space 论文阅读

Tomas Mikolov、Kai Chen、Greg Corrado、Jeffrey Dean 第一，研究对象：词语向量表征的质量。 [En] First, the object…

人工智能 2023年5月27日
0128
• #### 【论文分享】通过图神经网络明确捕捉实体提及的关系，用于特定领域的命名实体识别

[ACL 2021] Explicitly Capturing Relations between Entity Mentions via Graph Neural Network…

人工智能 2023年5月28日
0150
• #### 自动驾驶中多模态融合检测

多模态目标检测的场景 单模态的目标检测领域，尤其是基于图像的目标检测任务在各大数据集中取得了较好的效果，其中主要分为基于CNN和基于Transformer骨干网络检测算法，尤其是基…

人工智能 2023年6月2日
0112
• #### 【读点论文】EfficientDet: Scalable and Efficient Object Detection，改进特征融合层，BiFPN双向融合特征便于框信息回归，类别分类

Abstract 在计算机视觉中，模型效率越来越重要。在本文中，本文系统地研究了目标检测的神经网络结构设计选择，并提出了几个关键的优化方法来提高效率。 首先，本文提出了 一种加权双…

人工智能 2023年7月2日
0136
• #### labview的图和图表，数据类型和连线颜色，粗细的关系

抵扣说明： 1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。 Original: https:…

人工智能 2023年7月15日
0134
• #### 未来几年人工智能会迎来哪些激动人心的改变

未来几年人工智能会迎来哪些激动人心的改变？多样性可能是目标之一。早在几年之前，关于AI多样性这个概念有过一些解释——报道说韩国人习惯于睡地铺，但扫地机器人按照之前设定好的程序，不小…

人工智能 2023年6月1日
0132
• #### 利用opencv-python 进行图像的不规则裁剪

利用opencv-python 进行图像的不规则裁剪 利用凸包进行裁剪 首先我们进行凸包裁剪，先利用 cv2.convexHull(xy) 函数得到点集xy的凸包顶点。然后利用ma…

人工智能 2023年6月18日
0170
• #### Tensorboard最详细的启动教程【适合小白】

文章目录 一、导入包 二、下载Mnist数据 三、定义神经网络模型model 四、编译模型 五、设置Tensorboard * – + * – 1. 定义T…

人工智能 2023年5月26日
0163