深度学习原理与框架-Tensorflow卷积神经网络-卷积神经网络mnist分类 1.tf.nn.conv2d(卷积操作) 2.tf.nn.max_pool(最大池化操作) 3.tf.nn.dropout(执行dropout操作) 4.tf.nn.softmax_cross_entropy_with_logits(交叉熵损失) 5.tf.truncated_normal(两个标准差内的正态分布)
1. tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME') # 对数据进行卷积操作
参数说明:x表示输入数据,w表示卷积核, strides表示步长,分别表示为样本数,长,宽,通道数,padding表示补零操作
2. tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') # 对数据进行池化操作
参数说明:x表示输入数据,ksize表示卷积的大小,分别表示卷积核的个数,长,框,通道数,padding表示补零操作
3. tf.nn.dropout(x, keep_prob) # 对全连接层做dropout操作
参数说明:x表示输入数据,keep_prob表示保留的比例,可以设置为0.5,
4. tf.nn.softmax_cross_entropy_with_logits(logits=scores, labels=y) # 用于构造交叉熵损失函数
参数说明:logits表示预测得分值,labels表示实际的标签值,表示是用One-hot编码的
5. tf.truncated_normal([28, 28, 1, 5], sttdv=0.1) # 生成数据和均值不大于标准差两倍的正态分布
参数说明:[28, 28, 1, 5]表示生成的为u的, sttdv表示标准差的大小
6.tf.nn.relu(x) # 进行激活操作
参数说明:x表示输入值
卷积神经网络:对于数据的输入,在tensorflow中,必须是[num_sample, width, height, C] num_sample表示样本的个数,width和height表示样本的宽和高,C表示样本的通道数,如果是黑白图,那么这里设置为1
对于卷积核的设置维度为[5, 5, 1, 64] 5和5表示的是样本的长和宽, 1表示卷积核的通道数,64表示卷积核的个数
代码:下面对mnist数据集使用卷积神经进行分类,两个卷积层,两个全连接层,卷积核使用的是5*5的,全连接层的隐藏层的个数为50
第一步:输入的读入
第二步:使用tf.nn.conv2d构造卷积函数,使用tf.nn.max_pool构造池化函数
第三步:设置超参数,即batch大小,迭代次数,分类的类别数,全连接隐藏层的个数
第四步:使用tf.placeholder设置输入的x和y, x = tf.placeholder(tf.float32, [None, 28, 28, 1])
第五步:设置卷积层的参数,为5*5*1*64的卷积,b为64的维度,使用conv2d进行卷积,使用tf.nn.relu 进行激活操作,使用max_pool进行池化操作
第六步:设置第二层卷积层的参数,为5*5*64*64,b为64的维度,进行卷积,激活,池化操作
第七步:设置全连接的参数,同时用tf.reshape([-1, 7*7*64]) 对上一层池化的结果进行维度的重构,用于进行全连接操作,使用tf.matmul进行点乘,并进行激活
第八步:构造keep_prob的输入参数,使用tf.nn.dropout构造对全连接层进行dropout操作,防止过拟合
第九步:设置最后一层全连接的参数,使用tf.matmul和激活函数
第十步:使用tf.nn.sotfmax构造损失softmax损失函数
第十一步:使用tf.train.Adaoptimzer()构造自适应的梯度优化器,对损失值进行优化
第十二步:使用tf.equal和tf.reduce_mean计算准确度
第十三步:进行循环,使用mnist.train.next_batch读取data和labels数据,并对data数据进行维度的重构,维度为[None, 28, 28, 1]进行卷积操作
第十四步:执行梯度优化,来更新参数
第十五步:如果迭代次数为100次,打印准确率和损失值
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data # 第一步:数据集的读入
mnist = input_data.read_data_sets('/data', one_hot=True)
tf.reset_default_graph()
sess = tf.InteractiveSession()
# 第二步:构建卷积函数,使用tf.nn.conv2d(), 构造池化的函数, 使用tf.nn.max_pool()
def conv2d(x, W):
return tf.nn.conv2d(input=x, filter=W, strides=[1, 1, 1, 1], padding='SAME') def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') # 第三步:设定超参数,batchsize的大小,分类的类别数,第一个全连接的数目
batchSize = 50
num_classes = 10
num_hidden = 50
trainIteration = 10000 # 第四步:使用tf.placeholder() 构造输入数据,实现数据的占位, X是一个num_data, 28, 28, 1,28和28表示维度, 1表示通道数
X = tf.placeholder('float', shape=[None, 28, 28, 1])
y_ = tf.placeholder('float', shape=[None, num_classes]) # 第五步:构造卷积层的参数,进行第一层卷积并使用relu激活函数,然后进行一次池化,压缩图片的维度
W_conv1 = tf.Variable(tf.truncated_normal([5, 5, 1, 32], stddev=0.1))
# 使用tf.constant(0.1, shape=[32])构造偏置项b
b_conv1 = tf.Variable(tf.constant(0.1, shape=[32]))
conv_h1 = tf.nn.relu(conv2d(X, W_conv1) + b_conv1)
pool_h1 = max_pool_2x2(conv_h1) # 第六步:构造第二层卷积的参数,进行卷积,tf.nn.relu激活, 然后使用池化压缩梯度
W_conv2 = tf.Variable(tf.truncated_normal([5, 5, 32, 64], stddev=0.1))
b_conv2 = tf.Variable(tf.constant(0.1, shape=[64]))
conv_h2 = tf.nn.relu(conv2d(pool_h1, W_conv2) + b_conv2)
pool_h2 = max_pool_2x2(conv_h2) # 第七步:构造第一层全连接的参数,需要将池化后的数据,进行一次拉长,即把维度变为N, 7*7&64,为了进行全连接操作
W_affine1 = tf.Variable(tf.truncated_normal([7*7*64, 1024], stddev=0.1))
b_affine1 = tf.Variable(tf.constant(0.1, shape=[1024]))
affine_x = tf.reshape(pool_h2, [-1, 7*7*64])
affine_1 = tf.nn.relu(tf.matmul(affine_x, W_affine1)+b_affine1) # 第八步:构造输入数据keep_prob,使用tf.nn.dropout进行全连接的dropout操作
keep_prob = tf.placeholder('float')
affine_1_drop = tf.nn.dropout(affine_1, keep_prob)
# 第九步:构造初始化参数,使用tf.matmul构造全连接第二层
W_affine2 = tf.Variable(tf.truncated_normal([1024, num_classes], stddev=0.1))
b_affine2 = tf.Variable(tf.constant(0.1, shape=[num_classes]))
scores = tf.matmul(affine_1_drop, W_affine2) + b_affine2 # 第十步:使用softmax构造损失值函数
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=scores))
# 第十一步:使用自适应梯度下降生成损失值的优化器
opt = tf.train.AdamOptimizer().minimize(loss)
# 第十二步:使用tf.equal判断最大值的索引位置是否相同,使用tf.reduce_mean 判断计算准确率
correct = tf.equal(tf.argmax(scores, 1), tf.argmax(y_, 1))
accr = tf.reduce_mean(tf.cast(correct, 'float')) init = tf.global_variables_initializer()
sess.run(init) for i in range(trainIteration):
# 第十三步:获得batch的数据,对输入的data数据进行维度的变换
batch = mnist.train.next_batch(batchSize)
trainInput = batch[0].reshape([batchSize, 28, 28, 1])
trainLabel = batch[1]
# 第十四步:执行梯度优化的操作,用来更新参数
sess.run(opt, feed_dict={X:trainInput, y_: trainLabel, keep_prob:0.8})
# 第十五步:每迭代一百次,就打印一个batchSize的准确率
if i % 100 == 0:
print('accr :%g'%(sess.run(accr, feed_dict={X: trainInput, y_: trainLabel, keep_prob:1.0})))
深度学习原理与框架-Tensorflow卷积神经网络-卷积神经网络mnist分类 1.tf.nn.conv2d(卷积操作) 2.tf.nn.max_pool(最大池化操作) 3.tf.nn.dropout(执行dropout操作) 4.tf.nn.softmax_cross_entropy_with_logits(交叉熵损失) 5.tf.truncated_normal(两个标准差内的正态分布)的更多相关文章
- 深度学习原理与框架-Tensorflow卷积神经网络-cifar10图片分类(代码) 1.tf.nn.lrn(局部响应归一化操作) 2.random.sample(在列表中随机选值) 3.tf.one_hot(对标签进行one_hot编码)
1.tf.nn.lrn(pool_h1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) # 局部响应归一化,使用相同位置的前后的filter进行响应归一化操作 参数 ...
- 深度学习原理与框架-Tensorflow卷积神经网络-神经网络mnist分类
使用tensorflow构造神经网络用来进行mnist数据集的分类 相比与上一节讲到的逻辑回归,神经网络比逻辑回归多了隐藏层,同时在每一个线性变化后添加了relu作为激活函数, 神经网络使用的损失值为 ...
- 深度学习原理与框架-Tensorflow基本操作-mnist数据集的逻辑回归 1.tf.matmul(点乘操作) 2.tf.equal(对应位置是否相等) 3.tf.cast(将布尔类型转换为数值类型) 4.tf.argmax(返回最大值的索引) 5.tf.nn.softmax(计算softmax概率值) 6.tf.train.GradientDescentOptimizer(损失值梯度下降器)
1. tf.matmul(X, w) # 进行点乘操作 参数说明:X,w都表示输入的数据, 2.tf.equal(x, y) # 比较两个数据对应位置的数是否相等,返回值为True,或者False 参 ...
- 深度学习原理与框架-Tensorflow基本操作-实现线性拟合
代码:使用tensorflow进行数据点的线性拟合操作 第一步:使用np.random.normal生成正态分布的数据 第二步:将数据分为X_data 和 y_data 第三步:对参数W和b, 使用t ...
- 深度学习原理与框架-Tensorflow基本操作-变量常用操作 1.tf.random_normal(生成正态分布随机数) 2.tf.random_shuffle(进行洗牌操作) 3. tf.assign(赋值操作) 4.tf.convert_to_tensor(转换为tensor类型) 5.tf.add(相加操作) tf.divide(相乘操作) 6.tf.placeholder(输入数据占位
1. 使用tf.random_normal([2, 3], mean=-1, stddev=4) 创建一个正态分布的随机数 参数说明:[2, 3]表示随机数的维度,mean表示平均值,stddev表示 ...
- 深度学习原理与框架-Tensorflow基本操作-Tensorflow中的变量
1.tf.Variable([[1, 2]]) # 创建一个变量 参数说明:[[1, 2]] 表示输入的数据,为一行二列的数据 2.tf.global_variables_initializer() ...
- 深度学习原理与框架-图像补全(原理与代码) 1.tf.nn.moments(求平均值和标准差) 2.tf.control_dependencies(先执行内部操作) 3.tf.cond(判别执行前或后函数) 4.tf.nn.atrous_conv2d 5.tf.nn.conv2d_transpose(反卷积) 7.tf.train.get_checkpoint_state(判断sess是否存在
1. tf.nn.moments(x, axes=[0, 1, 2]) # 对前三个维度求平均值和标准差,结果为最后一个维度,即对每个feature_map求平均值和标准差 参数说明:x为输入的fe ...
- 深度学习原理与框架-猫狗图像识别-卷积神经网络(代码) 1.cv2.resize(图片压缩) 2..get_shape()[1:4].num_elements(获得最后三维度之和) 3.saver.save(训练参数的保存) 4.tf.train.import_meta_graph(加载模型结构) 5.saver.restore(训练参数载入)
1.cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR) 参数说明:image表示输入图片,image_size表示变 ...
- 深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)
1. tf.nn.embedding_lookup(W, X) W的维度为[len(vocabulary_list), 128], X的维度为[?, 8],组合后的维度为[?, 8, 128] 代码说 ...
随机推荐
- 导入jar包的方法
右键项目弹出菜单,进行如下选择: 4.在配置页中,选中Libraries标签页,然后点击Add JARs选择刚才拷贝过来的jar包.最后点击apply and close. 添加完成后图标会发生变化 ...
- springboot(整合多数据源demo,aop,定时任务,异步方法调用,以及获取properties中自定义的变量值)
有这么一个需求 每个部门,需要操作的数据库不同,A部门要将数据放test数据库,B 部门数据 要放在test1数据库 同一个项目 需要整合 多个数据源 上传个demo 方便自己以后回看!!!!!!!! ...
- HDOJ 2006 求奇数的乘积
#include<iostream> #include<vector> using namespace std; int main() { int n; while (cin ...
- NPF or NPCAP service is not installed
"NPF or NPCAP service is not installed" "could not start local server process:GNS3&qu ...
- Html的本质及在web中的作用
概要 本文以一个Socket程序为例由浅及深地揭示了Html的本质问题,同时介绍了作为web开发者我们在开发网站时需要做的事情 Html的本质以及开发需要的工作 1.服务器-客户端模型 其实,对于所有 ...
- Jmeter(二十六)Jmeter-Question之“集成Jenkins”
Jenkins,最初被称为Hudson,是一个Java语言编写的开源持续集成工具.Jenkins在持续集成领域的市场份额居于主导地位,其被各种规模的团队用于各种语言和技术的项目中,比如.net.rub ...
- [UE4]根据时间、速度进行插值:Finterp to Constant
一般在“Tick”事件中使用: Current:当前值 Target:期望的目标值 Delta Time:时间变化值. Interp Speed:插值速度 返回值:从“当前值”过渡到“期望的目标值”的 ...
- servlet和jsp概述
1.servlet的作用 B/S系统:浏览器/服务器(Servlet的服务模式) Servlet是运行在web服务器或应用服务器上的java程序,它是一个中间层,负责连接来自web浏览器或其它HTTP ...
- js原生面向对象-仿layui选项卡
喜欢琢磨,给大家分享小编自己封装的仿layui的选项卡. <!DOCTYPE html> <html lang="en"> <head> < ...
- Android之socket多线程(二)
使用ServerSocket创建服务器端: public static void main(String[] args) throws IOException { // TODO Auto-gener ...