根据第九步学习的算法,解一CNN网络,在以前做的全连接层前增加一卷积层。

注意:在误差反馈计算过程中,用“FULL”卷积计算误差的传递、用“VALID”相关(tf特有的卷积,计算卷积时核不翻转180)计算卷积层的权重灵敏度,仅适用于前馈采用“VALID”的CNN。理解CNN的概念比记住公式要重要的多!

开始卷积时,FULL核内边界对齐,SAME核中心对齐,VALID核外边界对齐。

另外,深层网络,开始训练时,速度很慢!

# coding=utf-8
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只显示 warning 和 Error import numpy as np
import tensorflow as tf
import scipy.signal as signallogs_path=r'c:/temp/log_mnist_softmax'
learning_rate=5 #当>0.05时误差很大
training_epochs=200trainData_in=np.array([[1.0,1.0,0.0,0.0],\[0.0,0.0,0.0,0.0]])
trainData_out=np.array([[0.0,1.0],\[1.0,0.0]])
testData_in=np.array([[0.0,0.0,0.0,1.0]])
testData_out=np.array([[1.0,0.0]])trainData_in=np.reshape(trainData_in,[-1,2,2,1])#np not tf
testData_in=np.reshape(testData_in,[-1,2,2,1])#print(np.shape(trainData_in))
print(np.shape(trainData_out))###CNN:
def dsigmoid(z):dsigmoid=tf.nn.sigmoid(z)*(1-tf.nn.sigmoid(z))return dsigmoid
def weight_variable(shape):initial=tf.truncated_normal(shape,stddev=0.1)return tf.Variable(initial)def bias_variable(shape):initial=tf.constant(0.0,shape=shape)return tf.Variable(initial)def conv2d(x,w):return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='VALID')def max_pool_2X2(x):return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='VALID')def get_deltai(k,i,j,deltaj,kij):deltaj=deltaj[k,:,:,j]kij=kij[:,:,i,j]return signal.convolve2d(deltaj, kij,'full')def nabla_kij(k,i,j,xi,deltaj):deltaj=deltaj[k,:,:,j]deltaj=np.reshape(deltaj,[list(deltaj.shape)[0],list(deltaj.shape)[1],1,1])xi=xi[k:k+1,:,:,i:i+1]return tf.nn.conv2d(xi,deltaj,strides=[1,1,1,1],padding='VALID')#define placeholder for inputs to network:
x_input=tf.placeholder(tf.float32, [None,2,2,1], name='x_input')
y_desired=tf.placeholder(tf.float32,[None,2],name='y_desired')#net:
#conv1 layer:
w_conv1=weight_variable([1,1,1,2])#注意节点数!
b_conv1=bias_variable([2])#注意节点数
z_conv1=conv2d(x_input,w_conv1)+b_conv1
conv1=tf.nn.sigmoid(z_conv1)#(None,2,2,2)!!!sigmoid 对0和1输出差别很小,开始学习慢!#full_connect layer:
#flat::
w_fuc1=weight_variable([2*2*2,3])#注意节点数!
b_fuc1=bias_variable([3])
conv1_flat=tf.reshape(conv1,[-1,w_fuc1.get_shape().as_list()[0]])#注意节点数!
z_fuc1=tf.matmul(conv1_flat,w_fuc1)+b_fuc1##
fuc1=tf.nn.sigmoid(z_fuc1)#full connect output layer:
w_fuco=weight_variable([3,2])
b_fuco=bias_variable([2])
z_fuco=tf.matmul(fuc1,w_fuco)+b_fuco#?fuc1_drop
y_output=tf.nn.softmax(z_fuco,name='y_output')#cost:
lossFun_crossEntropy=-tf.reduce_mean(y_desired*tf.log(y_output)) #交叉熵均值feed_dict_trainData={x_input:trainData_in,\y_desired:trainData_out,\}
feed_dict_testData={x_input:testData_in,\y_desired:testData_out,\}###
#train_step=tf.train.AdamOptimizer(0.05).minimize(lossFun_crossEntropy)
###
tf.summary.scalar('cost',lossFun_crossEntropy)
summary_op=tf.summary.merge_all()with tf.Session() as sess:sess.run(tf.global_variables_initializer())logs_writer=tf.summary.FileWriter(logs_path,graph=tf.get_default_graph())for epoch in range(training_epochs):####_,summary=sess.run([train_step,summary_op],feed_dict=feed_dict_trainData)#print('Epoch',epoch)#print('Cost_trainData:',lossFun_crossEntropy.eval\#      (feed_dict=feed_dict_trainData))####cross-entropy+softmax BP:wconv1_temp,bconv1_temp,zconv1_temp,conv1_temp,conv1_flat_temp,\wfuc1_temp,bfuc1_temp,zfuc1_temp,fuc1_temp,\wfuco_temp,bfuco_temp,zfuco_temp,y_output_temp,cost_temp=\sess.run([w_conv1,b_conv1,z_conv1,conv1,conv1_flat,\w_fuc1,b_fuc1,z_fuc1,fuc1,\w_fuco,b_fuco,z_fuco,y_output,lossFun_crossEntropy],\feed_dict=feed_dict_trainData)delta=y_output_temp-trainData_out  #BP1        nabla_b=delta.sum(axis=0)#在列方向上求和delta #BP3        nabla_w=np.dot(fuc1_temp.transpose(),delta) #BP4        dSigmod_z1=sess.run(dsigmoid(zfuc1_temp))        delta=np.dot(delta,wfuco_temp.transpose())*dSigmod_z1 #BP2!!!        nabla_b1=delta.sum(axis=0)#在列方向上求和delta #BP3        nabla_w1=np.dot(conv1_flat_temp.transpose(),delta)  #BP4####conv,nabla:dSigmoid_z_conv1flat=sess.run(dsigmoid(zconv1_temp.reshape([-1,w_fuc1.get_shape().as_list()[0]])))#注意节点数!delta=np.dot(delta,wfuc1_temp.transpose())*dSigmoid_z_conv1flatdelta=delta.reshape(list(zconv1_temp.shape))nabla_b_conv1=np.sum(delta,(0,1,2))nabla_k=np.zeros(list(wconv1_temp.shape))for k in range(len(delta)):for i in range(list(nabla_k.shape)[2]):for j in range(list(nabla_k.shape)[3]):nablakij=sess.run(nabla_kij(k,i,j,trainData_in,delta))nabla_k[:,:,i,j]+=nablakij[0,:,:,0]      ####m,n=np.shape(trainData_out)update_w1=tf.assign(w_fuc1,wfuc1_temp-learning_rate/m/n*nabla_w1)update_b1=tf.assign(b_fuc1,bfuc1_temp-learning_rate/m/n*nabla_b1)update_w=tf.assign(w_fuco,wfuco_temp-learning_rate/m/n*nabla_w)update_b=tf.assign(b_fuco,bfuco_temp-learning_rate/m/n*nabla_b)update_bconv1=tf.assign(b_conv1,bconv1_temp-learning_rate/m/n*nabla_b_conv1)update_wconv1=tf.assign(w_conv1,wconv1_temp-learning_rate/m/n*nabla_k)sess.run(update_wconv1)sess.run(update_bconv1)      sess.run(update_w1)sess.run(update_b1)sess.run(update_w)sess.run(update_b)#####summary=sess.run(summary_op,feed_dict=feed_dict_trainData)logs_writer.add_summary(summary,epoch)print('Epoch',epoch)print('Cost_trainData:',lossFun_crossEntropy.eval\(feed_dict=feed_dict_trainData))print('Cost_testData:',lossFun_crossEntropy.eval\(feed_dict=feed_dict_testData))print('Done')try_input=testData_in[0] try_desired=testData_out[0]  print(try_desired)print(y_output.eval(feed_dict={x_input:[try_input]}))

TensorFlow第十步CNN BP 编程求解相关推荐

  1. TensorFlow第九步CNN BP算法学习

    花了两天时间,基本明白了CNN BP的算法. 可把conv看成局部全连接的堆砌,以全连接BP的思路推导. https://www.cnblogs.com/tornadomeet/p/3468450.h ...

  2. tensorflow第十一步CNN表情识别

    fer2013图片库. 模型训练结束,保存,下次可接着继续训练. 注意windows的路径输入,最后的"\"不知怎么处理好,只好用LOGS_PATH=os.path.normcas ...

  3. 走进tensorflow第十步——手写数字识别中的input_data模块

    本来想来个综合的大程序,刚写了点发现东西较多,那就一点点整吧,东西太杂容易懵圈.. 在前几篇中的手写数字识别中一开始都有这么两句代码: from tensorflow.examples.tutoria ...

  4. 《C和C++游戏趣味编程》 第8章 十步万度

    没想到前几天新书预告中(童晶:<C和C++游戏趣味编程>新书预告),有这么多朋友对实现十步万度游戏感兴趣,下面提前开源最终代码. 这个案例使用VS 2010 + EasyX开发,感兴趣的朋 ...

  5. 第8章 十步万度(《C和C++游戏趣味编程》配套教学视频)

    (图书介绍:童晶:<C和C++游戏趣味编程>新书预告) 本章我们将编写十步万度游戏,效果如图所示.鼠标点击任意一个小圆圈,其指针顺时针旋转90度,后续被指向的圆圈指针也依次旋转,所有圆圈的 ...

  6. TensorFlow第五步:返回起点、深挖坑,解刨一个麻雀。

    一.设计最简单的数字识别问题 二.设计最简单的神经网络,仅含一隐藏层,4X3X2,激活函数:sigmod+softmax:损失函数:(均值)交叉熵cross-entropy 三.利用梯度下降法和BP算 ...

  7. 遗传+BP神经网络 求解故障诊断问题(python)

    遗传+BP神经网络 求解拖拉机齿轮箱故障诊断问题(python3) 通过学习书籍<matlab智能优化算法30个案例分析(第2版)>中有关神经网络算法的编程知识,初步了解神经网络的编码思想 ...

  8. matlab两个多项式相除,C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  9. 十步让你成为一名优秀的 Web开发人员

    2019独角兽企业重金招聘Python工程师标准>>> 如果你已经是一名优秀的Web开发人员,那请路过即 可.如果你还是一个准备入行或刚入行的菜鸟,那本文倒值得一读.要成为一名优秀的 ...

最新文章

  1. Linux 终端访问 FTP 及 上传下载 文件
  2. ssh整合webservice cxf采用注解的方式+andriod客户端
  3. 瑞士银行开户条件有哪些,瑞士银行开户的流程及注意事项是什么?
  4. android软件开发考试,Android软件工程师笔试题(全选择题)【0-1年经验】
  5. 洛谷P2751 [USACO4.2]工序安排Job Processing
  6. 小试牛刀:文本处理工具之grep、egrep详解
  7. JavaScript中常用变量介绍
  8. 【Java】课程设计—学生在线考试系统
  9. Microsoft Visual Studio 2010 注册码
  10. 洛谷P5385 [Cnoi2019]须臾幻境
  11. 2021iGEM感想
  12. 关于“产品经理的方法论都是自上而下提出的,缺少形而上学的认知”此观点的讨论
  13. upload-labs靶场通关指南(16-17关)
  14. 手动压缩Outlook PST和OST文件
  15. Do you kown Asp.Net Core -- 配置Kestrel端口
  16. leJOS EV3 Eclipse Mac 总结
  17. 回望2018,这6家AI+教育公司亮了!| AI最佳掘金案例榜...
  18. 创建Oracle数据库和表
  19. App 瘦身最佳实践
  20. java初级工作总结_【Java初级程序员工作总结_Java初级程序员个人年终总结】-看准网...

热门文章

  1. 面试精讲之面试考点及大厂真题 - 分布式专栏 17 ElasticSearch解决大数据量检索难题
  2. CentOS 7安装TigerVNC Server
  3. 创建设计模式 - 抽象工厂设计模式
  4. php周日,PHP减去一周周日
  5. sqlmap源码阅读系列检查是否满足依赖
  6. coddenomicon工具
  7. firebase登录验证_如何使用Firebase通过三步向身份验证本机添加身份验证
  8. 排列公式和组合公式_排列与组合:排列公式与组合公式之间有什么区别?
  9. 127_Power PivotPower BI DAX计算订单商品在库时间(延伸订单仓储费用)
  10. 关于simulink中参数传递到工作空间