一、DNN 简介

DNN一共可以分为三层。

  • 输入层(input layer)
  • 隐藏层(hidden layer)
  • 输出层(output layer)

DNN的前向传播即由输入经过一些列激活函数得到最终的输出

在对DNN参数求解的时候,通过反向传播,以及链式法则求得。

二、Tensorflow下的DNN实现

1、实现功能简介:

本文摘自Kaggle的一篇房价预测题目,找了一篇比较全的,当作自己的Tensorflow入门。链接:

https://www.kaggle.com/zoupet/neural-network-model-for-house-prices-tensorflow

数据和题目可以在文章开头的地址找的。

主要是给定了一个区域的房子价格以及房子特征,要预测一下房价。

2、挑选数据

 # 为了使得代码在 python2 或者3下都运行,加的 __future__包。如果是python3,下面的包可以不加。
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function import itertools import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import rcParams
import matplotlib from sklearn.model_selection import train_test_split # scaler, put the value range from min to max
from sklearn.preprocessing import MinMaxScaler import tensorflow as tf # 定义多少条记录会被当作log。
tf.logging.set_verbosity(tf.logging.INFO) # InteractiveSession 与 Session的区别是不用每一次执行命令时,前面都加一个session。可以自己查一下
sess = tf.InteractiveSession() # 文件目录
path_train = '/Users/adrian.wu/Desktop/learn/kaggle/price/data/all/train.csv' '''
首先只用数字特征进行预测,去除掉其它特征,比如类别等
'''
train = pd.read_csv(path_train) print('所有特征下,矩阵纬度:', train.shape) # 挑选出只是数字类型的特征
train = train.select_dtypes(exclude=['object'])
print('数字类型特征矩阵的纬度:', train.shape) # 去掉没用的特征Id
train.drop('Id', axis=1, inplace=True) # 处理缺失值,简单的填充0
train.fillna(0, inplace=True) print("\n特征:", list(train.columns)) '''
用Isolation Forest去掉异常值
'''
from sklearn.ensemble import IsolationForest clf = IsolationForest(max_samples=100, random_state=42)
clf.fit(train) y_noano = clf.predict(train)
print(y_noano)
y_noano = pd.DataFrame(y_noano, columns=['Top'])
# y_noano[y_noano['Top'] == 1].index.values, 等于1的不是异常值,-1为异常值 train = train.iloc[y_noano[y_noano['Top'] == 1].index.values]
train.reset_index(drop=True, inplace=True) print("异常值数量:", y_noano[y_noano['Top'] == -1].shape[0])
print("正常数据数量:", train.shape[0])

3、特征预处理

 '''
特征预处理
'''
import warnings warnings.filterwarnings('ignore') # 得到特征名字,并存为list类型
col_train = list(train.columns)
col_train_bis = list(train.columns) # 去除要预测的值,SalePrice
col_train_bis.remove('SalePrice') # 用numpy转为可操作的矩阵
mat_train = np.mat(train) mat_y = np.array(train.SalePrice).reshape((1314, 1)) # 归一化方法,把所有特征归一化到0~1之间
prepro_y = MinMaxScaler()
prepro_y.fit(mat_y) prepro = MinMaxScaler()
prepro.fit(mat_train) # 将处理过后的数据转为DataFrame
train = pd.DataFrame(prepro.transform(mat_train), columns=col_train)

4、train test数据集合处理

 '''
train test集合数据处理
''' # 把列都列出来
COLUMNS = col_train
FEATURES = col_train_bis
LABEL = "SalePrice" # 暂且理解将DataFrame的数据转为对应的输入值,因此要指定一列列的值。
feature_cols = [tf.contrib.layers.real_valued_column(k) for k in FEATURES] # 得到Feature 和 预测值
training_set = train[COLUMNS]
prediction_set = train.SalePrice # 将Train test 分为2:1分
x_train, x_test, y_train, y_test = train_test_split(training_set[FEATURES], prediction_set, test_size=0.33,
random_state=42)
# 整合特征和预测值,对train集
y_train = pd.DataFrame(y_train, columns=[LABEL])
training_set = pd.DataFrame(x_train, columns=FEATURES).merge(y_train, left_index=True, right_index=True) # 整合特征和预测值,对test集
y_test = pd.DataFrame(y_test, columns=[LABEL])
testing_set = pd.DataFrame(x_test, columns=FEATURES).merge(y_test, left_index=True, right_index=True) # 打log的,可以忽略
tf.logging.set_verbosity(tf.logging.ERROR)

5、DNN网络

 '''
快速创建一个DNN网络,
optimizer = tf.train.GradientDescentOptimizer( learning_rate= 0.1 )) 可以自己选优化方式
激活函数为relu
都有哪些feature
隐藏层的神经元个数,递减,200,100,50,25,12个
''' regressor = tf.contrib.learn.DNNRegressor(feature_columns=feature_cols,
activation_fn=tf.nn.relu,
hidden_units=[200, 100, 50, 25, 12]) training_set.reset_index(drop=True, inplace=True) # 定义一个函数用来train网络
def input_fn(data_set, pred=False):
if pred == False:
feature_cols = {k: tf.constant(data_set[k].values) for k in FEATURES}
labels = tf.constant(data_set[LABEL].values) return feature_cols, labels if pred == True:
feature_cols = {k: tf.constant(data_set[k].values) for k in FEATURES} return feature_cols # trainDNN网络
regressor.fit(input_fn=lambda: input_fn(training_set), steps=2000) # 估计测试集
ev = regressor.evaluate(input_fn=lambda: input_fn(testing_set), steps=1)
loss_score = ev["loss"]
print("test集的损失为: {0:f}".format(loss_score))

6、Adagrad优化器

看了下代码。这里的优化器用的是Adagrad。形式大致和SGD差不多,在其基础通过对梯度的迭代相加,对学习率进行了更新,从而控制学习率。

学习率随着梯度的和会逐渐变小。

1、迭代公式

eta也就是分子项是初始学习率。G为梯度迭代和,G旁边长的很像E的那一项是一个小常数,防止分母为0。

由上式可得到,G越大,学习率越小。

三、Tensorflow一步一步搭建一个简单DNN

1、创建网络

 import tensorflow as tf
from numpy.random import RandomState
from sklearn.model_selection import train_test_split batch_size = 8 # 定义网络
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
b1 = tf.Variable(tf.zeros([1, 3], name="bias1"))
b2 = tf.Variable(tf.zeros([1], name="bias2"))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1)) x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input')
y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')
a = tf.matmul(x, w1) + b1 # 这里一定不要写成 tf.sigmoid
y_last = tf.nn.sigmoid(tf.matmul(a, w2) + b2)

2、定义损失函数

 # 损失与准确率
loss = tf.losses.sigmoid_cross_entropy(y_, y_last)
train_step = tf.train.AdamOptimizer(0.07).minimize(loss) correct_prediction = tf.equal(tf.round(y_last), y_)
acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

3、造数据

# 造数据,X为二维数据例如:[[0.1, 0.8]], 当X的第一项和第二项相加 < 1 时 Y为1, 当X的第一项和第二项相加 >= 1时为 0
rdm = RandomState(1)
data_set_size = 128000
X = rdm.rand(data_set_size, 2)
Y = [[int(x1 + x2 < 1)] for (x1, x2) in X] X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3)

4、训练与测试

with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
STEPS = 7000
for i in range(0, 8900 - batch_size, batch_size):
start = i
sess.run(train_step, feed_dict={x: X_train[start: start + batch_size], y_: y_train[start: start + batch_size]}) if i % 800 == 0:
# 计算所有数据的交叉熵
total_cross_entropy = sess.run(loss, feed_dict={x: X, y_: Y})
# 输出交叉熵之和
# print("After %d training step(s),cross entropy on all data is %g" % (i, total_cross_entropy)) acc_ = sess.run(acc, feed_dict={x: X_test, y_: y_test})
print("accuracy on test data is ", acc_) test = sess.run(y_last, feed_dict={x: X_test, y_: y_test})

5、结果

accuracy on test data is  0.96091145

DNN网络(三)python下用Tensorflow实现DNN网络以及Adagrad优化器的更多相关文章

  1. TensorFlow使用记录 (六): 优化器

    0. tf.train.Optimizer tensorflow 里提供了丰富的优化器,这些优化器都继承与 Optimizer 这个类.class Optimizer 有一些方法,这里简单介绍下: 0 ...

  2. 莫烦大大TensorFlow学习笔记(8)----优化器

    一.TensorFlow中的优化器 tf.train.GradientDescentOptimizer:梯度下降算法 tf.train.AdadeltaOptimizer tf.train.Adagr ...

  3. 『TensorFlow』网络操作API_下

    一.优化器基类介绍 标注一点,优化器中的学习率可以是tensor,这意味着它可以feed, learning_rate: A Tensor or a floating point value. 正常使 ...

  4. TensorFlow之DNN(二):全连接神经网络的加速技巧(Xavier初始化、Adam、Batch Norm、学习率衰减与梯度截断)

    在上一篇博客<TensorFlow之DNN(一):构建“裸机版”全连接神经网络>中,我整理了一个用TensorFlow实现的简单全连接神经网络模型,没有运用加速技巧(小批量梯度下降不算哦) ...

  5. centos7下安装docker(12docker网络)

    docker 网络荣覆盖范围可分为:单个host上的容器网络和跨多个host的网络 docker 安装时会自动在host上创建三个网络,我们可以使用docker network ls查看到 1.non ...

  6. Tensorflow 中的优化器解析

    Tensorflow:1.6.0 优化器(reference:https://blog.csdn.net/weixin_40170902/article/details/80092628) I:  t ...

  7. 三分钟快速上手TensorFlow 2.0 (下)——模型的部署 、大规模训练、加速

    前文:三分钟快速上手TensorFlow 2.0 (中)——常用模块和模型的部署 TensorFlow 模型导出 使用 SavedModel 完整导出模型 不仅包含参数的权值,还包含计算的流程(即计算 ...

  8. TensorFlow之DNN(三):神经网络的正则化方法(Dropout、L2正则化、早停和数据增强)

    这一篇博客整理用TensorFlow实现神经网络正则化的内容. 深层神经网络往往具有数十万乃至数百万的参数,可以进行非常复杂的特征变换,具有强大的学习能力,因此容易在训练集上过拟合.缓解神经网络的过拟 ...

  9. python下的复杂网络编程包networkx的使用(摘抄)

    原文:http://blog.sciencenet.cn/home.php?mod=space&uid=404069&do=blog&classid=141080&vi ...

随机推荐

  1. Gym - 100989F

    You must have heard about Agent Mahone! Dr. Ibrahim hired him to catch the cheaters in the Algorithm ...

  2. 我眼中的 Docker(二)Image

    Docker 安装 如何安装 docker 详见官网: installation 或者 中文指南. 不过 linux 上我推荐用 curl 安装,因为 apt-get 中源要么没有 docker,要么 ...

  3. Arch Linux下Visual Stdio Code在格式化C代码时报错

    libtinfo.so.5: cannot open shared object file: No such file or directory Arch Linux下Visual Stdio Cod ...

  4. JQuery未来元素事件监听写法

    $(document).on('click','.div1',function(){ alert("abc"); }); 格式一致,第一个参数写事件,第二个参数给谁写事件(选择器) ...

  5. 洛谷P2486 染色

    LCT的一种姿势. 题意:给定一棵树.每次把一条路径上的点染成一种颜色,求一条路径上有多少段颜色. 解: 首先可以很轻易的用树剖解决,只不过代码量让人望而却步... 有一种难以想象的LCT做法... ...

  6. 洛谷P3338 力

    题意: 解: 介绍两种方法. 首先可以把那个最后除的qi拆掉. ①分前后两部分处理. 前一部分可以看做是个卷积.下面的平方不拆开,直接看成gi-j即可. 后一部分按照套路,把循环变量改成从0开始,反转 ...

  7. .net 调用 网易云的短信验证

    static string url = "https://api.netease.im/sms/sendcode.action"; static string appKey = & ...

  8. TestNg1. 基本介绍注解介绍和如何让在maven中引用

    1.更适合测试人员,有很多的套件. maven中引用: <!-- https://mvnrepository.com/artifact/org.testng/testng --><d ...

  9. tomcat发布项目,运行不了

    工作中经常出现项目本来运行得好好的,从SVN上面更新代码后就不行了 这个问题有时候是因为编译不成功,处理步骤如下: 1.clean整个项目,重新编译 2.如果还是不行,则把编译中认为是error的设置 ...

  10. java eclipse 安卓环境配置

    adt下载地址   http://www.runoob.com/w3cnote/android-tutorial-eclipse-adt-sdk-app.html  我的云 安卓学习 java htt ...