机器学习与Tensorflow(6)——LSTM的Tensorflow实现、Tensorboard简单实现、CNN应用
最近写的一些程序以及做的一个关于轴承故障诊断的程序
最近学习进度有些慢
而且马上假期
要去补习班
去赚下学期生活费
额。。。。
抓紧时间再多学习点
1.RNN递归神经网络Tensorflow实现程序
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = ''
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#载入数据集
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True) # 输入图片是28*28
n_inputs = 28 #输入一行,一行有28个数据
max_time = 28 #一共28行
lstm_size = 100 #隐层单元
n_classes = 10 # 10个分类
batch_size = 50 #每批次50个样本
n_batch = mnist.train.num_examples // batch_size #计算一共有多少个批次 #这里的none表示第一个维度可以是任意的长度
x = tf.placeholder(tf.float32,[None,784])
#正确的标签
y = tf.placeholder(tf.float32,[None,10]) #初始化权值
weights = tf.Variable(tf.truncated_normal([lstm_size, n_classes], stddev=0.1))
#初始化偏置值
biases = tf.Variable(tf.constant(0.1, shape=[n_classes])) #定义RNN网络
def RNN(X,weights,biases):
# inputs=[batch_size, max_time, n_inputs]
inputs = tf.reshape(X,[-1,max_time,n_inputs])
#定义LSTM基本CELL
lstm_cell = tf.contrib.rnn.core_rnn_cell.BasicLSTMCell(lstm_size)
# final_state[0]是cell state
# final_state[1]是hidden_state
outputs,final_state = tf.nn.dynamic_rnn(lstm_cell,inputs,dtype=tf.float32)
results = tf.nn.softmax(tf.matmul(final_state[1],weights) + biases)
return results #计算RNN的返回结果
prediction= RNN(x, weights, biases)
#损失函数
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y))
#使用AdamOptimizer进行优化
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
#结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置
#求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))#把correct_prediction变为float32类型
#初始化
init = tf.global_variables_initializer() with tf.Session() as sess:
sess.run(init)
for epoch in range(6):
for batch in range(n_batch):
batch_xs,batch_ys = mnist.train.next_batch(batch_size)
sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys}) acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
print ("Iter " + str(epoch) + ", Testing Accuracy= " + str(acc))
2.关于Tensorboard的简单学习(以MNIST手写数据集程序为例)
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = ''
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#载入数据集
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
#每个批次的大小(即每次训练的图片数量)
batch_size = 100
#计算一共有多少个批次
n_bitch = mnist.train.num_examples // batch_size
#参数概要
def variable_summaries(var):
with tf.name_scope('summaries'):
mean = tf.reduce_mean(var)
tf.summary.scalar('mean', mean) #平均值
with tf.name_scope('stddev'):
stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
tf.summary.scalar('stddev', stddev) #标准差
tf.summary.scalar('max', tf.reduce_max(var))
tf.summary.scalar('min', tf.reduce_min(var))
tf.summary.histogram('histogram', var)#直方图
#定义一个命名空间
with tf.name_scope('input'):
#定义两个placeholder
x = tf.placeholder(tf.float32, [None, 784], name='x_input')
y = tf.placeholder(tf.float32, [None, 10], name='y_input')
with tf.name_scope('layer'):
#创建一个只有输入层(784个神经元)和输出层(10个神经元)的简单神经网络
with tf.name_scope('weights'):
Weights = tf.Variable(tf.zeros([784, 10]), name='w')
variable_summaries(Weights)
with tf.name_scope('biases'):
Biases = tf.Variable(tf.zeros([10]), name='b')
variable_summaries(Biases)
with tf.name_scope('Wx_plus_B'):
Wx_plus_B = tf.matmul(x, Weights) + Biases
with tf.name_scope('softmax'):
prediction = tf.nn.softmax(Wx_plus_B)
#二次代价函数
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.square(y - prediction))
tf.summary.scalar('loss', loss)
#使用梯度下降法
with tf.name_scope('train'):
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
#初始化变量
init = tf.global_variables_initializer()
#结果存放在一个布尔型列表中
with tf.name_scope('accuracy'):
with tf.name_scope('correct_prediction'):
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1)) #argmax返回一维张量中最大的值所在的位置,标签值和预测值相同,返回为True
#求准确率
with tf.name_scope('correct_prediction'):
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) #cast函数将correct_prediction的布尔型转换为浮点型,然后计算平均值即为准确率 #合并所有的summary
merged = tf.summary.merge_all() #定义会话
with tf.Session() as sess:
sess.run(init)
writer = tf.summary.FileWriter('logs/', sess.graph)
#将测试集循环训练50次
for epoch in range(51):
#将测试集中所有数据循环一次
for batch in range(n_bitch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size) #取测试集中batch_size数量的图片及对应的标签值
summary,_= sess.run([merged, train_step], feed_dict={x:batch_xs, y:batch_ys}) #将上一行代码取到的数据进行训练
writer.add_summary(summary, epoch)
acc = sess.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.labels}) #准确率的计算
print('Iter : ' + str(epoch) + ',Testing Accuracy = ' + str(acc))
3. CNN应用——简单的轴承故障诊断模型
3.1数据来源及介绍
轴承、轴、齿轮是旋转机械重要组成部分,为了验证深度学习在旋转装备故障分类识别的有效性,
选取凯斯西储大学轴承数据库(Case Western Reserve University, CWRU)为验证数据。
轴承通过电火花加工设置成四种尺寸的故障直径,分别为0.007、0.014、0.021、0.028英寸。
实验中使用加速度传感器采集振动信号,传感器分别被放置在电机驱动端与风扇端。
由于驱动端采集到的振动信号数据全面,并且收到其他部件和环境噪声的干扰较少,选取驱动端采集的振动信号作为实验数据。
实验数据包括4种轴承状态下采集到的振动信号,分别为正常状态(Normal,N)、滚珠故障状态(Ball Fault,BF)、外圈故障状态(Outer Race Fault,ORF)以及内圈故障状态(Inner Race Fault,IRF),
每种状态下采集到的信号又按照故障直径与负载的大小进行分类,其中故障直径分别为0.007、0.014、0.021、0.028英寸,负载大小从0Hp-3Hp(1Hp=746W),对应转速为1797rpm、1772rpm、1750rpm、1730rpm。
选取CWRU数据集中采样频率为12k Hz的各个状态的样本,通过深度学习建立故障诊断模型,对电机轴承的四种故障进行分类识别。
由于负载的不同,转速不恒定,但采集的转速都在1800rpm左右,采样频率为12kHz,转轴转一圈,约采集400(60/1800*12000 = 400)个数据点。
由于采用原始数据切分方式,通常取稍微大于一个周期的点数比较合适,为了便于多层CNN网络的输入,以24*24=576点作为输入长度。
3.2 Matlab数据处理程序
clear all;
clc;
load DataSet;
[iType, iCondition] = size(A);
iExtSize = *;
iSampleRate = ;
iTime = ;
iOverlap = floor(iExtSize * 0.9);
iUCover = iExtSize - iOverlap;
iGetDataLen = iSampleRate*iTime + iExtSize;
iLen2 = floor((iGetDataLen-iExtSize)/iUCover) + ;
iLen1 = floor(iLen2/)*;
iGetDataLen = iLen1*iUCover + iExtSize;
fExtSamp = zeros(iType, iGetDataLen); tmp = ;
for jCnt = : iType
str1 = sprintf('%03d',A(jCnt,));
szValName = strcat('X', str1, '_DE_time');
eval(strcat('tmp=',szValName,';'));
fExtSamp(jCnt,:) = tmp(:iGetDataLen);
end
iLen = iLen1;
iSampSize = iLen * iType;
fData = zeros(iSampSize, iExtSize);
fLabel = zeros(iSampSize, ); for iCnt = ::iLen
iInterval = (iCnt -)*iUCover + (::iExtSize);
for jCnt =::iType
fData((iCnt - )*iType + jCnt,:) = fExtSamp(jCnt, iInterval);
if (jCnt ==)
fLabel((iCnt - )*iType + jCnt,:) = [ ];
end
if (jCnt >= && jCnt<=)
fLabel((iCnt - )*iType + jCnt,:) = [ ];
end
if (jCnt >= && jCnt<=)
fLabel((iCnt - )*iType + jCnt,:) = [ ];
end
if (jCnt >=)
fLabel((iCnt - )*iType + jCnt,:) = [ ];
end
end
end
save('DL_Data90.mat','fData', 'fLabel');
3.3 CNN轴承故障诊断模型
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = ''
import numpy as np
import tensorflow as tf
from tensorflow.contrib import rnn
import matplotlib.pyplot as plt nSampleSize = 20000 # 总样本数
nSig_dim = 576 # 单个样本维度
nLab_dim = 4 # 类别维度 learning_rate = 1e-3
batch_size = tf.placeholder(tf.int32, []) # 在训练和测试,用不同的 batch_size
input_size = 24 # 每个时刻的输入维数为 24
timestep_size = 24 # 时序长度为24
hidden_size = 128 # 每个隐含层的节点数
layer_num = 3 # LSTM layer 的层数
class_num = nLab_dim # 类别维数 def getdata(nSampSize=20000):
# 读取float型二进制数据
signal = np.fromfile('DLdata90singal.raw', dtype=np.float64)
labels = np.fromfile('DLdata90labels.raw', dtype=np.float64)
#由于matlab 矩阵写入文件是按照【列】优先, 需要按行读取
mat_sig = np.reshape(signal,[-1, nSampSize])
mat_lab = np.reshape(labels,[-1, nSampSize])
mat_sig = mat_sig.T # 转换成正常样式 【样本序号,样本维度】
mat_lab = mat_lab.T
return mat_sig, mat_lab def zscore(xx):
# 样本归一化到【-1,1】,逐条对每个样本进行自归一化处理
max1 = np.max(xx,axis=1) #按行或者每个样本,并求出单个样本的最大值
max1 = np.reshape(max1,[-1,1]) # 行向量 ->> 列向量
min1 = np.min(xx,axis=1) #按行或者每个样本,并求出单个样本的最小值
min1 = np.reshape(min1,[-1,1]) # 行向量 ->> 列向量
xx = (xx-min1)/(max1-min1)*2-1
return xx def NextBatch(iLen, n_batchsize):
# iLen: 样本总数
# n_batchsize: 批处理大小
# 返回n_batchsize个随机样本(序号)
ar = np.arange(iLen) # 生成0到iLen-1,步长为1的序列
np.random.shuffle(ar) # 打乱顺序
return ar[0:n_batchsize] xs = tf.placeholder(tf.float32, [None, nSig_dim])
ys = tf.placeholder(tf.float32, [None, class_num])
keep_prob = tf.placeholder(tf.float32) x_input = tf.reshape(xs, [-1, 24, 24]) # 搭建LSTM 模型
def unit_LSTM():
# 定义一层 LSTM_cell,只需要说明 hidden_size
lstm_cell = rnn.BasicLSTMCell(num_units=hidden_size, forget_bias=1.0, state_is_tuple=True)
#添加 dropout layer, 一般只设置 output_keep_prob
lstm_cell = rnn.DropoutWrapper(cell=lstm_cell, input_keep_prob=1.0, output_keep_prob=keep_prob)
return lstm_cell #调用 MultiRNNCell 来实现多层 LSTM
mLSTM_cell = rnn.MultiRNNCell([unit_LSTM() for icnt in range(layer_num)], state_is_tuple=True) #用全零来初始化state
init_state = mLSTM_cell.zero_state(batch_size, dtype=tf.float32)
outputs, state = tf.nn.dynamic_rnn(mLSTM_cell, inputs=x_input,initial_state=init_state, time_major=False)
h_state = outputs[:, -1, :] # 或者 h_state = state[-1][1] #设置 loss function 和 优化器
W = tf.Variable(tf.truncated_normal([hidden_size, class_num], stddev=0.1), dtype=tf.float32)
bias = tf.Variable(tf.constant(0.1,shape=[class_num]), dtype=tf.float32)
y_pre = tf.nn.softmax(tf.matmul(h_state, W) + bias) #损失和评估函数
cross_entropy = tf.reduce_mean(tf.reduce_sum(-ys*tf.log(y_pre),reduction_indices=[1]))
train_op = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_pre,1), tf.argmax(ys,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) mydata = getdata()
iTrainSetSize = np.floor(nSampleSize*3/4).astype(int) # 训练样本个数
iIndex = np.arange(nSampleSize) # 按照顺序,然后划分训练样本、测试样本
train_index = iIndex[0:iTrainSetSize]
test_index = iIndex[iTrainSetSize:nSampleSize] train_data = mydata[0][train_index] # 训练数据
train_y = mydata[1][train_index] # 训练标签
test_data = mydata[0][test_index] # 测试数据
test_y = mydata[1][test_index] # 测试标签 train_x = zscore(train_data) # 对训练数据进行归一化
test_x = zscore(test_data) # 对测试数据进行归一化 init = tf.global_variables_initializer() with tf.Session() as sess:
sess.run(init)
for icnt in range(1000):
_batch_size = 100
intervals = NextBatch(iTrainSetSize, _batch_size) # 每次从所有样本中随机取100个样本(序号)
xx = train_x[intervals]
yy = train_y[intervals]
if (icnt+1)%100 == 0:
train_accuracy = sess.run(accuracy, feed_dict={
xs:xx, ys: yy, keep_prob: 1.0, batch_size: _batch_size})
print("step: " + "{0:4d}".format(icnt+1) + ", train acc:" + "{:.4f}".format(train_accuracy))
sess.run(train_op, feed_dict={ xs:xx, ys: yy, keep_prob: 0.9, batch_size: _batch_size})
bsize = test_x.shape[0]
test_acc = sess.run(accuracy,feed_dict={xs:test_x, ys:test_y, keep_prob: 1.0, batch_size:bsize})
print("test acc:" + "{:.4f}".format(test_acc))
#写在后面
新的一年了
感觉开始的一塌糊涂
不过这两天好像调整过来了
让自己成为一个有计划的人
坚持健身、坚持减肥、学习理财、学习穿搭、学BEC中级、学机器学习、学Java、学Python、学深度学习框架、准备实习、积极准备找工作!
坚持早点睡觉、坚持早点起床
坚持不拖延
坚持放下手机
坚持不去抱怨生活、不去抱怨别人
坚持!做一个自律、自信的小伙郭
忙碌起来
为最好的那个自己而不断努力
不要患得患失的去迷茫明天
而是在每一个今天,都活出最精彩的一天
羡慕那些活的精致的人
我也要好好加油才好!
机器学习与Tensorflow(6)——LSTM的Tensorflow实现、Tensorboard简单实现、CNN应用的更多相关文章
- 第二十一节,使用TensorFlow实现LSTM和GRU网络
本节主要介绍在TensorFlow中实现LSTM以及GRU网络. 一 LSTM网络 Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息 ...
- 学习Tensorflow的LSTM的RNN例子
学习Tensorflow的LSTM的RNN例子 基于TensorFlow一次简单的RNN实现 极客学院-递归神经网络 如何使用TensorFlow构建.训练和改进循环神经网络
- (数据科学学习手札40)tensorflow实现LSTM时间序列预测
一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...
- 【TensorFlow】:解决TensorFlow的ImportError: DLL load failed: 动态链接库(DLL)初始化例程失败
[背景] 在scikit-learn基础上系统结合数学和编程的角度学习了机器学习后(我的github:https://github.com/wwcom614/machine-learning),意犹未 ...
- tensorflow学习笔记----tensorflow在windows的安装及TensorBoard中mnist样例
前言: ...
- tensorflow笔记:流程,概念和简单代码注释
tensorflow是google在2015年开源的深度学习框架,可以很方便的检验算法效果.这两天看了看官方的tutorial,极客学院的文档,以及综合tensorflow的源码,把自己的心得整理了一 ...
- tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)
续集请点击我:tensorflow学习笔记——使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...
- tensorflow学习笔记五:mnist实例--卷积神经网络(CNN)
mnist的卷积神经网络例子和上一篇博文中的神经网络例子大部分是相同的.但是CNN层数要多一些,网络模型需要自己来构建. 程序比较复杂,我就分成几个部分来叙述. 首先,下载并加载数据: import ...
- tensorflow笔记(三)之 tensorboard的使用
tensorflow笔记(三)之 tensorboard的使用 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7429344.h ...
随机推荐
- python argparse(参数解析)模块学习(一)
class ArgumentParser(_AttributeHolder, _ActionsContainer): """Object for parsing comm ...
- Python的基本用法
---恢复内容开始--- 一.函数 1.1 默认参数 想要计算一个数x的n次方,可以定义如下的函数.但是有时候我们仅仅只需要计算x^2,所以只想使用一个参数即power(x),这时如果仍用如下代码会报 ...
- c#: WebBrowser控件html代码注入及交互
主题仍是下载相关. 页面加载完成后,注入html元素,以使能够与主程序交互.并使WebBrowser与js交互,可以实现一些有趣的功能. 欲使WebBrowser与js交互,其所在页面类,须加上[Co ...
- Socket 多线程编程
前面一片学习了TCP/IP的基础网络编程,并给出了简单的服务端与客户端通信交互的例子.还介绍了UPC的通信例子. 这次学习TCP/IP的多线程编程.因为涉及到TCP/IP一般都是多线程,服务端会一直监 ...
- 机器学习(二)--------单变量线性回归(Linear Regression with One Variable)
面积与房价 训练集 (Training Set) Size Price 2104 460 852 178 ...... m代表训练集中实例的数量x代表输入变量 ...
- 3H - 进制转换
输入一个十进制数N,将它转换成R进制数输出. Input 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10). Outpu ...
- Python下安装MySQLdb模块
----------------------[针对Windows下python 的MySQLdb模块安装]--------------------- 一.检查MySQLdb模块是否安装,可在DOS命令 ...
- Java 装箱和拆箱
1.装箱机制 基础类型引用到其包装类型,这样就可以调用其各种方法. 例如,我们声明: Integer a = 1; 其在编译过程中会自动解释成: Integer a = Integer.valueOf ...
- c++两个类相互调用
有可能会碰到两个类之间的相互调用的问题,例如:定义了类A和类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; }; class B { A a; }; 编译器在声明A ...
- Day02 (黑客成长日记)
#用户登录次数为三代码 # i = 0 # while i < 3: # username = input('请输入账号:') # password = input('请输入密码:') # if ...