前言:这篇文章的内容是去年上家公司参加部门code hackthon活动上运用了一些简单的Tensorflow机器学习模型,做的一个预测磁盘性能的小工具。因为和现在所做的行业和工作内容有些一定差距,就不详述应用的详细场景。google今年的开发者大会上定位所有的方向主攻“AI First”,相信机器学习将来会越来越多的提高大家的工作效率,也希望以后能用机器学习来给业务赋能。

背景:企业级存储器在目前应用在众多银行和大企业中,目前主流的存储,底层介质依然还是性价比高的磁盘(价格便宜,容量大),不过由于flash的强势崛起,新的中高端存储会越来越多的使用flash做为其存储介质。在实际使用中,不同企业在存储数据的时候应用场景不一样,有些是频繁,小批量;有些是单次大文件;有些是无规律的写入大小数据。不同存储在这些应用场景下,性能差距会比较大。这会导致销售人员在前线了解到需求后,需要测试部门模拟相应的场景,来给出存储的具体性能数据,这种场景可能需要花费一周才能拿到性能数据。

目标:收集足够多的磁盘性能原始数据,选择合适的机器学习模型来仿真性能数据。以后销售人员在评估性能的时候,只需要将数据输入到系统中,就可以得出一个较合理的结果。

说明:影响磁盘性能有30多个因素,在初期的模型中选择了特征显著的9个参数,磁盘性能的结果也有10多个维度来表示,这里选择了2个特征值。

直接贴:

import tensorflow as tf
import numpy as np
import csv
import time
from sklearn.preprocessing import StandardScaler

input_ = []
output1_ = []
output2_ = []
data_lenth = 1000
with open('train_5.csv') as f:
f_csv = csv.reader(f)
headers = next(f_csv)
for row in f_csv:
num_row = [ float(i) for i in row ]
input_.append(num_row[0:9])
output1_.append(num_row[9:10])
output2_.append(num_row[10:11])

my_X = np.array(input_[0:data_lenth])
my_Y1 = np.array(output1_[0:data_lenth])
my_Y2 = np.array(output2_[0:data_lenth])

scaler_x = StandardScaler().fit(my_X)
scaler_y1 = StandardScaler().fit(my_Y1)
scaler_y2 = StandardScaler().fit(my_Y2)

trX = scaler_x.transform(my_X)
trY1 = scaler_y1.transform(my_Y1)
trY2 = scaler_y1.transform(my_Y2)
print(" starting normalize *")
time.sleep(2)
print(" normalize input data *")
print(trX)
print(" normalize response_time_rnd *")
print(trY1)
print(" normalize response_time_seq *")
print(trY2)

创建两个占位符,数据类型是 tf.float32

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
biases = tf.Variable(tf.zeros(1) + 0.1)

创建一个变量系数 w , 最后训练出来的值,应该接近 2

w = tf.Variable(tf.zeros([1, 9]), name = "weights")
y_model = tf.multiply(X, w)+biases

定义损失函数 (Y - y_model)^2

cost = tf.square(Y - y_model)

定义学习率

learning_rate = 0.01

使用梯度下降来训练模型,学习率为 learning_rate , 训练目标是使损失函数最小

train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

with tf.Session() as sess:

初始化所有的变量

init = tf.global_variables_initializer()
sess.run(init)

对模型训练100次

for i in range(100):
for (x, y) in zip(trX, trY1):
sess.run(train_op, feed_dict = {X: x, Y: y})

输出 w 的值

W = sess.run(w)

输出 b 的值

B = sess.run(biases)

test_input = np.transpose(np.transpose(np.array([100,5000,4000])))

test_input = np.transpose(np.transpose(np.array([50,100,5000,4000,70,20,40,90,1000000])))
W = np.transpose(W)

print(" testing response_time_rnd *")
print(W)
print(B)
print("testing data: ")
print(test_input)
test_X = scaler_x.transform(test_input)
print(test_X)
test_output = np.dot(test_X,W)+B
print("result data(response_time_rnd): ")
print(scaler_y1.inverse_transform(test_output))

with tf.Session() as sess:

初始化所有的变量

init = tf.global_variables_initializer()
sess.run(init)

对模型训练100次

for i in range(100):
for (x, y) in zip(trX, trY2):
sess.run(train_op, feed_dict = {X: x, Y: y})

输出 w 的值

W = sess.run(w)

输出 b 的值

B = sess.run(biases)

W = np.transpose(W)
print(" testing response_time_seq *")
print(W)
print(B)
print("testing data: ")
print(test_input)
test_X = scaler_x.transform(test_input)
print(test_X)
test_output = np.dot(test_X,W)+B
print("result data(response_time_seq): ")
print(scaler_y1.inverse_transform(test_output))

此处的入参需要做归一化处理,不做归一化,数据量达到一定量时就会出现不收敛的情况。

scaler_x = StandardScaler().fit(my_X)
scaler_y1 = StandardScaler().fit(my_Y1)
scaler_y2 = StandardScaler().fit(my_Y2)
矩阵运算的转置处理。

trX = scaler_x.transform(my_X)
trY1 = scaler_y1.transform(my_Y1)
trY2 = scaler_y1.transform(my_Y2)
这部分是模型的核心,注释说明比较清楚。

创建两个占位符,数据类型是 tf.float32

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
biases = tf.Variable(tf.zeros(1) + 0.1)

创建一个变量系数 w , 最后训练出来的值,应该接近 2

w = tf.Variable(tf.zeros([1, 9]), name = "weights")
y_model = tf.multiply(X, w)+biases

定义损失函数 (Y - y_model)^2

cost = tf.square(Y - y_model)

定义学习率

learning_rate = 0.01

使用梯度下降来训练模型,学习率为 learning_rate , 训练目标是使损失函数最小

train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

with tf.Session() as sess:
# 初始化所有的变量
init = tf.global_variables_initializer()
sess.run(init)
# 对模型训练100次
for i in range(100):

for (x, y) in zip(trX, trY1): sess.run(train_op, feed_dict = {X: x, Y: y}) 

# 输出 w 的值
W = sess.run(w)

# 输出 b 的值
B = sess.run(biases)

结果:因为对数据做了奇异值处理,所以用模型跑出来的结果八成以上是符合预期的,不过当实际存在较多奇异点的时候,准确率会下降到六至七成。而且原始数据的量还不够,也会导致现实场景奇异点较多。后续考虑用多层神经网络模型来模拟这种场景,在数据源足够的情况下,结果会更加符合预期。

附件说明:

py文件是包含QT界面的完整文件

csv文件是数据素材

用Tensorflow搭建预测磁盘性能的机器学习模型相关推荐

  1. 一文讲述如何将预测范式引入到机器学习模型中

    作者 | Filip Piekniewski 编译 |ziqi zhang 随着人工智能的持续深入,深度学习技术在多智能体学习.推理系统和推荐系统上取得了很大进展. 对于多智能体来说,预测能力有着关键 ...

  2. 大讲堂 | 预测时间敏感的机器学习模型建模与优化

    雷锋网AI研习社讯:机器学习模型现在已经广泛应用在越来越多的领域比如地震监测,闯入识别,高频交易:同时也开始广泛的应用在移动设备中比如通过边缘计算.这些真实世界的应用在原有的模型精度基础之上带来很多实 ...

  3. seq2seq模型_使用Tensorflow搭建一个简单的Seq2Seq翻译模型

    1.背景 首先,这篇博文整理自谷歌开源的神经机器翻译项目Neural Machine Translation (seq2seq) Tutorial.如果你直接克隆这个项目按照Tutorial中的说明操 ...

  4. TensorFlow Serving + Docker + Tornado机器学习模型生产级快速部署

    点击上方"AI搞事情"关注我们 内容转载自知乎:https://zhuanlan.zhihu.com/p/52096200 Justin ho 〉 本文将会介绍使用TensorFl ...

  5. python模型预测_《Python机器学习——预测分析核心算法》——1.5 构建预测模型的流程...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第1章,第1.5节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  6. python计算均方根误差_如何在Python中创建线性回归机器学习模型?「入门篇」

    线性回归和逻辑回归是当今很受欢迎的两种机器学习模型. 本文将教你如何使用 scikit-learn 库在Python中创建.训练和测试你的第一个线性.逻辑回归机器学习模型,本文适合大部分的新人小白. ...

  7. 机器学习零基础?手把手教你用TensorFlow搭建图像识别系统

    [转] http://www.leiphone.com/news/201701/Y4uyEktkkwb5YhJM.html http://www.leiphone.com/news/201701/2t ...

  8. python训练手势分类器_机器学习零基础?手把手教你用TensorFlow搭建图像分类器|干货...

    编者按:Pete Warden是TensorFlow移动团队的技术负责人.曾在Jetpac担任首次技术官.Jetpac的深度学习技术经过优化,可在移动和嵌入式设备上运行.该公司已于2014年被谷歌收购 ...

  9. TensorFlow搭建CNN实现时间序列预测(风速预测)

    目录 I. 数据集 II. 特征构造 III. 一维卷积 IV. 数据处理 1. 数据预处理 2. 数据集构造 V. CNN模型 1. 模型搭建 2. 模型训练及表现 VI. 源码及数据 时间序列预测 ...

最新文章

  1. 用C++实现约瑟夫环的问题
  2. 一文搞懂 CountDownLatch 用法和源码!
  3. 大厂围城:千辛万苦杀进来,为何他们选择出逃?
  4. linux环境中,查询网卡的速度(带宽)
  5. mysql 生产实践_mysql-主从复制
  6. jquery 毫秒转换成日期_jQuery Datepicker – 如何将日期格式化为纪元时间戳(以秒为单位,而不是毫秒)...
  7. STM32 电机教程 19 - 基于ST MC Workbench 单电阻FOC
  8. python send 案例_python socket编程入门(编写server实例)+send 与sendall的区别与使用方法...
  9. 由设置body线性背景色引发的问题-----当声明文档类型时,对body设置线性背景色,页面背景色无法整体线性过渡...
  10. ZOJ - 3228 Searching the String(AC自动机求不重复子串出现次数)
  11. AS3 in FlashDevelop
  12. mysql utf8 bin设置_[mysql]修改collation为utf8_bin
  13. md5不是对称密码算法_密码学中的消息摘要算法5(MD5)
  14. Win10 JAVA安装及环境搭建(windows jdk,windows java环境配置)
  15. java怎么使两个界面联系_怎么样用java编写界面实现两个数的加法运算
  16. 数学建模论文注意事项
  17. 可以做mysql题的网站_牛客网MySQL练习题
  18. web前端大一实训 HTML+CSS+JavaScript王者荣耀(60页) web课程设计网页规划与设计 HTML期末大作业 HTML网页设计结课作业...
  19. UiPath Excel内容去重操作
  20. 60w风扇用多大电容_家里的40W电风扇怎么接电容?该用多大电容?怎么判断好坏?...

热门文章

  1. python配置文件密码管理_用户配置文件和密码配置文件,用户组管理和用户管理...
  2. crossorigin注解添加了解决不了跨域问题_springboot 处理跨域的2种方式
  3. 加密工具类 EncryptionUtils.java
  4. Ajax应用简单实例
  5. dbexception.java,mysql – org.h2.jdbc.JdbcSQLException:找不到列“ID”
  6. MyBatis3源码解析(7)TypeHandler注册与获取
  7. vbs调用c++dll_COM编程攻略(八 动态调用与IDispatch接口)
  8. 乐pad平板电脑_2020年双十一高性价比平板电脑推荐(包含苹果ipad,安卓华为,微软surface)...
  9. attrib批量显示文件夹_Windows 下彻底隐藏文件和文件夹的方法
  10. P1502 窗口的星星(扫描线入门第一题)