以下是自己学习莫烦Python中的笔记

构建自己的神经网络

import tensorflow as tf
import numpy as npdef add_layer(inputs, in_size, out_size, activation_function=None):      # activation_function=None表示默认线性函数Weights = tf.Variable(tf.random_normal([in_size, out_size]))         # 设置权重矩阵,in_size行,out_size列的矩阵,推荐用随机变量,比全0好biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)                  # 定义偏置项Wx_plus_b = tf.matmul(inputs, Weights) + biases                      # 未被激活if activation_function is None:                                      # 线性的不需要激活函数output = Wx_plus_belse:output = activation_function(Wx_plus_b)                          # 需要激活函数return output'''构建数据'''
x_data = np.linspace(-1, 1, 300)[:, np.newaxis]                            # newaxis = None,添加维度,变成矩阵的形式
noise = np.random.normal(0, 0.05, x_data.shape)                          # 添加噪点,让它不完全拟合原来的函数
y_data = np.square(x_data) + 0.5 + noise                                 # 定义的y'''定义一个输入层(1个神经元),隐藏层(10个神经元),输出层(1个神经元)的简单神经网络'''
'''xs,ys存在的意义是可配置,不把程序写死,解耦,这样可以改变模型的输入值,直接传不方便封装,模型就只能对x_data,y_data进行预测'''
xs = tf.placeholder(tf.float32, (None, 1))                                 # 输给train_step的值,xs,ys,这里的None后面就是batch_size,None表示随意什么值
ys = tf.placeholder(tf.float32, (None, 1))                                 # placeholder的作用是用来穿数据的,1是x_data,y_data的属性是1
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
# 定义layer 1,调用添加层函数,传入数据:输入数据,输如神经元个数,输出神经元个数(从第一层进入隐藏层,一个进去,10个出来)
# 定义激活函数relu,相当于用10条直线去拟合一个抛物线
prediction = add_layer(l1, 10, 1, activation_function=None)
# 定义输出层,也就是预测曾,传入从隐藏层输出的10个神经元,传出prediction层输出的1个神经元,激活函数默认线性'''定义损失函数'''
loss = tf.reduce_mean(tf.reduce_sum(tf.square(y_data-prediction),        # 真实值减去预测数据的平方求和再平均reduction_indices=[1]))              # reduction_indices=[1]表示结果压缩的方向,1表示列方向压缩
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(loss)
# 采用梯度下降的优化算法以0.1的学习率(优化的步长取值)每训练一次,对误差进行更正或提升,下次会有更好的结果'''所有变量初始化,并启用会话设置'''
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)for i in range(10000):                                                    # train_step10000次# 这里我们可以采用小步骤执行,一次不处理全部的数据,可以解决并行数据量大sess.run(train_step, feed_dict={xs: x_data, ys: y_data})if i % 100 == 0:print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))'''
运行结果:
0.5493656
0.0107342955
0.0070284773
0.006592798
0.0063318294
0.006061059
0.005771474
0.005488769
0.005196031
0.0044501587
0.0042058867
0.004073246
0.003959596
0.0038633016
0.0037791408
0.0036934523
0.0036113774
0.0035319463
0.003464909
0.0034044054
0.0033475696
0.0032985774
0.0032570336
0.0032204872
0.0031877018
0.0031564569
0.0031279041
0.003102748
0.0030788844
0.0030579553
0.0030362464
0.0030177354
0.0030016755
0.002987475
0.0029756082
0.0029649814
0.0029550295
0.0029448003
0.0029357218
0.0029277373
0.0029169486
0.0029066761
0.0028959094
0.0028867824
0.0028785528
0.002870171
0.0028620618
0.0028546161
0.002847477
0.0028404433
0.002833517
0.0028268904
0.0028205125
0.0028145504
0.002808905
0.0028017273
0.0027929782
0.0027851863
0.0027749557
0.0027644003
0.0027537593
0.0027437778
0.0027352145
0.0027273197
0.0027202086
0.0027134544
0.0027047154
0.0026974839
0.002690782
0.0026839096
0.0026774737
0.0026713694
0.0026650357
0.0026573725
0.0026495687
0.0026424658
0.0026353367
0.0026287038
0.002622738
0.0026163943
0.002610145
0.002604464
0.002599055
0.0025937355
0.0025889135
0.0025844388
0.0025796301
0.0025742496
0.0025692824
0.002564779
0.0025596002
0.0025547268
0.0025502879
0.002546214
0.0025425574
0.0025390468
0.0025354468
0.0025319364
0.002528599
0.002525389
'''

训练结果可视化

'''结果可视化'''
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as pltdef add_layer(inputs, in_size, out_size, activation_function=None):      # activation_function=None表示默认线性函数Weights = tf.Variable(tf.random_normal([in_size, out_size]))         # 设置权重矩阵,in_size行,out_size列的矩阵,推荐用随机变量,比全0好biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)                  # 定义偏置项Wx_plus_b = tf.matmul(inputs, Weights) + biases                      # 未被激活if activation_function is None:                                      # 线性的不需要激活函数output = Wx_plus_belse:output = activation_function(Wx_plus_b)                          # 需要激活函数return output'''构建数据'''
x_data = np.linspace(-1, 1, 300)[:, np.newaxis]                            # newaxis = None,添加维度,变成矩阵的形式
noise = np.random.normal(0, 0.05, x_data.shape)                          # 添加噪点,让它不完全拟合原来的函数
y_data = np.square(x_data) + 0.5 + noise                                 # 定义的y'''定义一个输入层(1个神经元),隐藏层(10个神经元),输出层(1个神经元)的简单神经网络'''
'''xs,ys存在的意义是可配置,不把程序写死,解耦,这样可以改变模型的输入值,直接传不方便封装,模型就只能对x_data,y_data进行预测'''
xs = tf.placeholder(tf.float32, (None, 1))                                 # 输给train_step的值,xs,ys,这里的None后面就是batch_size,None表示随意什么值
ys = tf.placeholder(tf.float32, (None, 1))                                 # placeholder的作用是用来穿数据的,1是x_data,y_data的属性是1
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
# 定义layer 1,调用添加层函数,传入数据:输入数据,输如神经元个数,输出神经元个数(从第一层进入隐藏层,一个进去,10个出来)
# 定义激活函数relu,相当于用10条直线去拟合一个抛物线
prediction = add_layer(l1, 10, 1, activation_function=None)
# 定义输出层,也就是预测曾,传入从隐藏层输出的10个神经元,传出prediction层输出的1个神经元,激活函数默认线性'''定义损失函数'''
loss = tf.reduce_mean(tf.reduce_sum(tf.square(y_data-prediction),        # 真实值减去预测数据的平方求和再平均reduction_indices=[1]))              # reduction_indices=[1]表示结果压缩的方向,1表示列方向压缩
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(loss)
# 采用梯度下降的优化算法以0.1的学习率(优化的步长取值)每训练一次,对误差进行更正或提升,下次会有更好的结果'''所有变量初始化,并启用会话设置'''
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)fig = plt.figure()                          # 生成一个图片框
ax = fig.add_subplot(1, 1, 1)               # 给图片添加编号
ax.scatter(x_data, y_data)                  # 把原图生成散点图
plt.ion()                                   # show之后不暂停
plt.show()                                  # 显示for i in range(10000):                                                    # train_step10000次# 这里我们可以采用小步骤执行,一次不处理全部的数据,可以解决并行数据量大sess.run(train_step, feed_dict={xs: x_data, ys: y_data})if i % 100 == 0:# print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))       这个是显示真实值try:ax.lines.remove(lines[0])                                     # 先抹除第一条线,如果没有再继续进行下面的except Exception:passprediction_value = sess.run(prediction, feed_dict={xs: x_data})   # 预测值lines = ax.plot(x_data, prediction_value, 'r-', lw=5)             # 把x_data和prediction_value用红色的线显示出来,宽度为5'''但是动态生成一次要抹掉一次,否则就会一直保存在图上'''plt.pause(0.1)                                                    # 暂停0.1秒再继续

优化器加速神经网络训练

'''优化器Optimizer加速神经网络训练'''
'''
计算量太大了最基础的方法是---Stochatic Gradient Descent(SGD)随机梯度下降一次训练全部数据数据量太大,所以采用mini batch,每次使用一小部分训练数据调参1.传统的权重W = W(原始的)+(-Learning rate)*dx(校正值)2.Momentum的更新方法:m = b1*m-Learning rate * dx  ;  W = W + m3.AdaGrad的方法: v = v + dx^2 , W = W - Learning rate*dx/v^(1/2),依赖于学习率,每次会有不同的学习率4.RMSProp的更新方法:Momentum(m=b1*m-Learning rate*dx)+AdaGrad(v=v+dx^2)---> v=b1*v+(1-b1)*dx^2 ; W = W-Learning rate*dx/v^(1/2)5.Adam优化器:m = b1 * m + (1-b1) * dx --------> Momentum(下坡属性)v = b2 * v + (1-b2) * dx^2-------> AdaGard(阻力属性)W = W - Learning rate * m/v^(1/2)--->m和v同时考虑在内迅速收敛
'''

怎么解决overfitting

Overfitting 也被称为过度学习,过度拟合。 它是机器学习中常见的问题。 举个Classification(分类)的例子。

图中黑色曲线是正常模型,绿色曲线就是overfitting模型。尽管绿色曲线很精确的区分了所有的训练数据,但是并没有描述数据的整体特征,对新测试数据的适应性较差。

举个Regression (回归)的例子,

第三条曲线存在overfitting问题,尽管它经过了所有的训练点,但是不能很好的反应数据的趋势,预测能力严重不足。 TensorFlow提供了强大的dropout方法来解决overfitting问题。

代码:

import tensorflow as tf
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer# load data
digits = load_digits()
X = digits.data
y = digits.target
y = LabelBinarizer().fit_transform(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3)def add_layer(inputs, in_size, out_size, layer_name, activation_function=None, ):# add one more layer and return the output of this layerWeights = tf.Variable(tf.random_normal([in_size, out_size]))biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, )Wx_plus_b = tf.matmul(inputs, Weights) + biases'''here to dropout'''Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob)if activation_function is None:outputs = Wx_plus_belse:outputs = activation_function(Wx_plus_b, )tf.summary.histogram(layer_name + '/outputs', outputs)return outputs# define placeholder for inputs to network
keep_prob = tf.placeholder(tf.float32)
xs = tf.placeholder(tf.float32, [None, 64])  # 8x8
ys = tf.placeholder(tf.float32, [None, 10])# add output layer
l1 = add_layer(xs, 64, 50, 'l1', activation_function=tf.nn.tanh)
prediction = add_layer(l1, 50, 10, 'l2', activation_function=tf.nn.softmax)# the loss between prediction and real data
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),reduction_indices=[1]))  # loss
tf.summary.scalar('loss', cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)sess = tf.Session()
merged = tf.summary.merge_all()
# summary writer goes in here
train_writer = tf.summary.FileWriter("logs/train", sess.graph)
test_writer = tf.summary.FileWriter("logs/test", sess.graph)# tf.initialize_all_variables() no long valid from
# 2017-03-02 if using tensorflow >= 0.12
if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:init = tf.initialize_all_variables()
else:init = tf.global_variables_initializer()
sess.run(init)
for i in range(500):# here to determine the keeping probabilitysess.run(train_step, feed_dict={xs: X_train, ys: y_train, keep_prob: 0.5})if i % 50 == 0:# record losstrain_result = sess.run(merged, feed_dict={xs: X_train, ys: y_train, keep_prob: 1})test_result = sess.run(merged, feed_dict={xs: X_test, ys: y_test, keep_prob: 1})train_writer.add_summary(train_result, i)test_writer.add_summary(test_result, i)

训练中keep_prob=1时,就可以暴露出overfitting问题。keep_prob=0.5时,dropout就发挥了作用。 我们可以两种参数分别运行程序,对比一下结果。

当keep_prob=1时,模型对训练数据的适应性优于测试数据,存在overfitting,输出如下: 红线是 train 的误差, 蓝线是 test 的误差.

当keep_prob=0.5时效果好了很多,输出如下:
如果dropout之后还是不够理想可以尝试改小梯度下降的学习率。

莫烦Python--Tensorflow Day2相关推荐

  1. CNN识别手写数字-莫烦python

    搭建一个 CNN识别手写数字 前面跟着莫烦python/tensorflow教程完成了神经网络识别手写数字的代码,这一part是cnn识别手写数字的 import tensorflow as tf f ...

  2. 莫烦python教程部分代码

    GitHub资源整理 莫烦python教程部分代码 莫烦python教程部分代码 整理了一部分莫烦Python教程中的代码,并对代码进行了详细的注释.由于莫烦大佬在做TensorFlow教程时使用的0 ...

  3. tkinter 笔记 checkbutton 勾选项 (莫烦python笔记)

    和前面radiobutton的区别在于,radiobutton 各选项只能勾选一个,checkbutton可以勾选多个,也可以不勾选 1 主体框架 还是一样的 import tkinter as tk ...

  4. tkinter笔记:scale 尺度 (莫烦python笔记)

    1 主题框架 还是一样的 import tkinter as tkwindow = tk.Tk() #创建窗口window.title('my window') #窗口标题window.geometr ...

  5. tkinter 笔记: radiobutton 选择按钮(莫烦python笔记)

    1 主体框架还是那个主体框架 window = tk.Tk() window.title('my window') window.geometry('500x500') 2 设置tkinter的文字变 ...

  6. tkinter 笔记:列表部件 listbox (莫烦python 笔记)

    1  主体框架 主体框架部分还是 import tkinter as tkwindow = tk.Tk() #创建窗口window.title('my window') #窗口标题window.geo ...

  7. tkinter 笔记:创建输入框并显示结果 (莫烦python笔记)

    1 主体框架 主题框架部分还是一样的 tkinter 笔记 :主体框架&窗口内容_UQI-LIUWJ的博客-CSDN博客 import tkinter as tkwindow = tk.Tk( ...

  8. tkinter笔记:通过点击button 控制标签的显示 (莫烦python笔记)

    tkinter 笔记 :主体框架&窗口内容_UQI-LIUWJ的博客-CSDN博客 中,我们知道了tkinter的主体框架 现在我们需要做这么一个操作:每点一次按钮,标签变化一次 1 首先是和 ...

  9. 莫烦python简历_Matplotlib画图教程

    目录 1 Matplotlib 简介 -----1.1 为什么用Matplotlib? -----1.2 Matplotlib 安装 2 基本使用 -----2.1 基本用法 -----2.2 fig ...

  10. tkinter message_【莫烦Python】Tkinter 做简单的窗口视窗lt;学习笔记(2)gt;

    接(1) 还有五个苹果:[莫烦Python]Tkinter 做简单的窗口视窗<学习笔记>​zhuanlan.zhihu.com 登录窗口小例子(pickle存取) import

最新文章

  1. fMRI在认知心理学上的研究
  2. linux Firefox汉化
  3. java hh mm ss_【Java基础】比较时间大小(以HH:mm:ss格式为例)
  4. react(97)--分支切换
  5. 睡眠声音识别中的准确率问题(二)--测试结果及分析
  6. 程序员养生(01) -- 心态
  7. latex图片_Latex使用图片、文献、模板——自定义与路径指定
  8. python url解析path_Django(CBV解析、模板层)
  9. adb工具的下载及配置
  10. 【考研复习】《操作系统原理》孟庆昌等编著课后习题+答案——第四章
  11. Github 常见缩写含义 WIP/LGTM/AFAIK
  12. 【noip模拟赛1】古韵之鹊桥相会(最短路)
  13. 文献小镇--国内外文献免费下载!
  14. dwa_planner解读
  15. 推荐几款图形转代码的工具
  16. k8s之kafka集群重启耗时太长问题
  17. 对当下很火的两大短视频平台 抖音 和 微视进行竞品分析
  18. attachment和inline的区别
  19. 将Excel表格数据转为SQL语句
  20. IDEA翻译插件 : Translation 安装及使用 解决Google翻译不能使用【保姆级教学】

热门文章

  1. [spark]spark资源分配
  2. 前端想自学后找个小公司混口饭吃,需要学到什么程度?
  3. java面向对象(封装、重载、构造、继承)
  4. 计算机专业自我介绍结尾,计算机专业面试自我介绍怎么结尾
  5. Maven导入依赖时jar包出现unknown
  6. Rasa 3.x 学习系列-Rasa X 社区版(免费版) 更改
  7. YOLOX训练自己的VOC数据集
  8. netbeans8 EBJ模块中JPA部署问题
  9. FE_CSS 页面布局之定位
  10. TMC2240步进电机驱动芯片