【TensorFlow】 基于视频时序LSTM的行为动作识别

简介
本文基于LSTM来完成用户行为识别。数据集来源:https://archive.ics.uci.edu/ml/machine-learning-databases/00240/

此数据集一共有6种行为状态:

行走;
站立;
躺下;
坐下;
上楼;
下楼;
以上6种行为数据是通过传感器进行采集的。

.\data\UCI HAR Dataset\train\Inertial Signals

实现
本次实验实现的是6分类任务。

pip install -i https://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple tensorflow==1.13.1

import tensorflow as tf
import numpy as np# # 模型好坏主要由数据决定,数据决定模型上限,模型决定逼近这个上限,记录仪上的数据
def load_X(X_signals_paths):X_signals = []for signal_type_path in X_signals_paths:file = open(signal_type_path, 'r')X_signals.append([np.array(serie, dtype=np.float32) for serie in[row.replace('  ', ' ').strip().split(' ') for row in file]])file.close()return np.transpose(np.array(X_signals), (1, 2, 0))def load_y(y_path):file = open(y_path, 'r')y_ = np.array([elem for elem in [row.replace('  ', ' ').strip().split(' ') for row in file]], dtype=np.int32)file.close()return y_ - 1class Config(object):def __init__(self, X_train, X_test):self.train_count = len(X_train)  # 训练记录self.test_data_count = len(X_test)self.n_steps = len(X_train[0])  # 步长,128步self.learning_rate = 0.0025self.lambda_loss_amount = 0.0015  # 正则化惩罚粒度self.training_epochs = 300self.batch_size = 1500self.n_inputs = len(X_train[0][0])  # 每个step收集9个,数据收集维度self.n_hidden = 32  # 隐层神经元个数self.n_classes = 6  # 输出6个类别self.W = {'hidden': tf.Variable(tf.random_normal([self.n_inputs, self.n_hidden])),  # 输入到隐层'output': tf.Variable(tf.random_normal([self.n_hidden, self.n_classes]))}  # 隐层到输出self.biases = {'hidden': tf.Variable(tf.random_normal([self.n_hidden], mean=1.0)),'output': tf.Variable(tf.random_normal([self.n_classes]))}# 构造LSTM网络
def LSTM_Network(_X, config):# 数据转换,使其满足LSTM网络要求_X = tf.transpose(_X, [1, 0, 2])  # 把0 1 2调换成1 0 2,调换第一维度和第二维度_X = tf.reshape(_X, [-1, config.n_inputs])_X = tf.nn.relu(tf.matmul(_X, config.W['hidden']) + config.biases['hidden'])  # 9个神经元变为32_X = tf.split(_X, config.n_steps, 0)  # 把每一步放到RNN对应的位置# 两层LSTM堆叠在一起lstm_cell_1 = tf.contrib.rnn.BasicLSTMCell(config.n_hidden, forget_bias=1.0, state_is_tuple=True)lstm_cell_2 = tf.contrib.rnn.BasicLSTMCell(config.n_hidden, forget_bias=1.0, state_is_tuple=True)lstm_cells = tf.contrib.rnn.MultiRNNCell([lstm_cell_1, lstm_cell_2], state_is_tuple=True)outputs, states = tf.contrib.rnn.static_rnn(lstm_cells, _X, dtype=tf.float32)  # outputs:最终结果; states:中间结果print(np.array(outputs).shape)  # 查看outputs,128个输出结果lstm_last_output = outputs[-1]  # 取最终结果return tf.matmul(lstm_last_output, config.W['output']) + config.biases['output']  # 分类def one_hot(y_):y_ = y_.reshape(len(y_))n_values = int(np.max(y_)) + 1return np.eye(n_values)[np.array(y_, dtype=np.int32)]if __name__ == '__main__':# 指定九种不同输入信号,即9个文件的文件名前缀INPUT_SIGNAL_TYPES = ['body_acc_x_','body_acc_y_','body_acc_z_','body_gyro_x_','body_gyro_y_','body_gyro_z_','total_acc_x_','total_acc_y_','total_acc_z_']# 六种行为标签,行走 站立 躺下 坐下 上楼 下楼LABELS = ['WALKING','WALKING_UPSTAIRS','WALKING_DOWNSTAIRS','SITTING','STANDING','LAYING']# 指定数据路径DATA_PATH = 'data/'DATASET_PATH = DATA_PATH + 'UCI HAR Dataset/'print('\n' + 'Dataset is now located at:' + DATASET_PATH)TRAIN = 'train/'TEST = 'test/'X_train_signals_paths = [DATASET_PATH + TRAIN + 'Inertial Signals/' + signal + 'train.txt' for signal in INPUT_SIGNAL_TYPES]X_test_signals_paths = [DATASET_PATH + TEST + 'Inertial Signals/' + signal + 'test.txt' for signal inINPUT_SIGNAL_TYPES]X_train = load_X(X_train_signals_paths)X_test = load_X(X_test_signals_paths)print('X_train:', X_train.shape)  # 7352条数据,每个数据128窗口序列,每个序列记录9个不同指标print('X_test:', X_test.shape)y_train_path = DATASET_PATH + TRAIN + 'y_train.txt'y_test_path = DATASET_PATH + TEST + 'y_test.txt'y_train = one_hot(load_y(y_train_path))y_test = one_hot(load_y(y_test_path))print('y_train:', y_train.shape)  # 7352条数据,6个类别print('y_test:', y_test.shape)config = Config(X_train, X_test)print("Some useful info to get an insight on dataset's shape and normalisation:")print("features shape, labels shape, each features mean, each features standard deviation")print(X_test.shape, y_test.shape,np.mean(X_test), np.std(X_test))print('the dataset is therefore properly normalised, as expected.')X = tf.placeholder(tf.float32, [None, config.n_steps, config.n_inputs])Y = tf.placeholder(tf.float32, [None, config.n_classes])pred_Y = LSTM_Network(X, config)  # 最终预测结果# l2正则惩罚,tf.trainable_variables()(仅可以查看可训练的变量)l2 = config.lambda_loss_amount * \sum(tf.nn.l2_loss(tf_var) for tf_var in tf.trainable_variables())# 损失值cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=Y, logits=pred_Y)) + l2optimizer = tf.train.AdamOptimizer(learning_rate=config.learning_rate).minimize(cost)correct_pred = tf.equal(tf.argmax(pred_Y, 1), tf.argmax(Y, 1))accuracy = tf.reduce_mean(tf.cast(correct_pred, dtype=tf.float32))# tf.InteractiveSession():可以先构建一个session然后再定义操作(operation)# tf.Session():需要在会话构建之前定义好全部的操作(operation)然后再构建会话# tf.ConfigProto():获取到 operations 和 Tensor 被指派到哪个设备(几号CPU或几号GPU)上运行# log_device_placement=False:不会在终端打印出各项操作是在哪个设备上运行sess = tf.InteractiveSession(config=tf.ConfigProto(log_device_placement=False))init = tf.global_variables_initializer()sess.run(init)best_accuracy = 0.0for i in range(config.training_epochs):# zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表for start, end in zip(range(0, config.train_count, config.batch_size),range(config.batch_size, config.train_count + 1, config.batch_size)):sess.run(optimizer, feed_dict={X: X_train[start:end],Y: y_train[start:end]})# 也可对迭代过程进行可视化展示pred_out, accuracy_out, loss_out = sess.run([pred_Y, accuracy, cost], feed_dict={X: X_test, Y: y_test})print('traing iter: {},'.format(i) + 'test accuracy: {},'.format(accuracy_out) + 'loss:{}'.format(loss_out))best_accuracy = max(best_accuracy, accuracy_out)print('')print('final test accuracy: {}'.format(accuracy_out))print("best epoch's test accuracy: {}".format(best_accuracy))print('')


运行结果:

Dataset is now located at:data/UCI HAR Dataset/
X_train: (7352, 128, 9)
X_test: (2947, 128, 9)
y_train: (7352, 6)
y_test: (2947, 6)
Some useful info to get an insight on dataset's shape and normalisation:
features shape, labels shape, each features mean, each features standard deviation
(2947, 128, 9) (2947, 6) 0.09913992 0.39567086
the dataset is therefore properly normalised, as expected.
WARNING:tensorflow:From D:/WorkSpace/ai/csdn/lab-lstm-activity-recognition/lstm.py:58: BasicLSTMCell.__init__ (from tensorflow.python.ops.rnn_cell_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This class is deprecated, please use tf.nn.rnn_cell.LSTMCell, which supports all the feature this cell currently has. Please replace the existing code with tf.nn.rnn_cell.LSTMCell(name='basic_lstm_cell').
(128,)
WARNING:tensorflow:From D:/WorkSpace/ai/csdn/lab-lstm-activity-recognition/lstm.py:141: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Future major versions of TensorFlow will allow gradients to flow
into the labels input on backprop by default.
See `tf.nn.softmax_cross_entropy_with_logits_v2`.
2019-12-16 19:45:10.908801: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
traing iter: 0,test accuracy: 0.4801492989063263,loss:1.9456521272659302
final test accuracy: 0.4801492989063263
best epoch's test accuracy: 0.4801492989063263traing iter: 1,test accuracy: 0.5334238409996033,loss:1.6313532590866089final test accuracy: 0.5334238409996033
best epoch's test accuracy: 0.5334238409996033
traing iter: 2,test accuracy: 0.6128265857696533,loss:1.4844205379486084
final test accuracy: 0.6128265857696533
best epoch's test accuracy: 0.6128265857696533

任何程序错误,以及技术疑问或需要解答的,请添加

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Asp.net MVC处理文件的上传下载

如果你仅仅只有Asp.net Web Forms背景转而学习Asp.net MVC的,我想你的第一个经历或许是那些曾经让你的编程变得愉悦无比的服务端控件都驾鹤西去了.FileUpload就是其中一个,而这个控件的缺席给我们带来一些小问题。这篇文章主要说如何在Asp.net MVC中上传…

Python遍历文件夹下所有文件及目录

遍历文件夹中的所有子文件夹及子文件使用os.walk()方法非常简单。 语法格式大致如下: os.walk(top[, topdownTrue[, onerrorNone[, followlinksFalse]]]) top – 根目录下的每一个文件夹(包含它自己), 产生3-元组 (dirpath, dirnames, filenames)【文件夹路径, 文…

华为交换机telnet和ftp服务开启/关闭命令

1.telnet开启/关闭 在系统视图下 启用方式如下: telnet server enable //使能telnet服务关闭方式如下: undo telnet server //关闭telnet服务2.FTP开启/关闭 通过display ftp-server查看启用状态 如果已经启用,会在查看的命令中显示&#…

为什么用Spring来管理Hibernate?

为什么用Spring来管理Hibernate?为什么要用Hibernate框架?这个在《Hibernate介绍》博客中已经提到了。既然用Hibernate框架访问管理持久层,那为何又提到用Spring来管理以及整合Hibernate呢?首先我们来看一下Hibernate进行操作的步…

Python-Pandas之两个Dataframe的差异比较

昨天在外网找到一个比较dataframe的好库,叫datacompy,它的优点有: 1、可以把对比后的信息详情打印出来,比如列是否相等,行是否相等; 2、在数据中如果有不相等列,那么就只比较相同的列&#xf…

华为交换机如何通过tftp服务器上传下载文件

温馨提示:为了防止更新交换机配置文件操作失败,操作前交换机配置文件一定要做备份,可以通过copy vrpcfg.zip vrpcfg_backup.zip 工具/原料: windows电脑: Tftpd64 SecureCRT USB转串口,串口转RJ45 console线 2米网线 华为交换机S3700一台 方法/步骤: 1.准备材料,按照下…

js节流函数和js防止重复提交的N种方法

应用情景 经典使用情景:js的一些事件,比如:onresize、scroll、mousemove、mousehover等; 还比如:手抖、手误、服务器没有响应之前的重复点击; 这些都是没有意义的,重复的无效的操作&#xff…

使用IPFS集群搭建创建私有IPFS网络

基本介绍 IPFS 网络分两类: 公有私有 对于大多数商用应用尤其是企业级解决方案而言,需要对自身数据有完全的控制,这种场合公有IPFS网络并不适用,搭建私有IPFS往往是这类应用的必要需求。 本文我们讲解创建一个私有 IPFS 网络的过程&#xf…

MongoDB基础介绍安装与使用

MongoDB已经日益成为流程和主流的数据库了,原因有两个:第一个就是技术优势,第二就是便利性,个人使用部署都很方便。 MongoDB的优缺点,以及使用场景 优点: 面向文档存储(自由读高,…

python调用cv2.findContours时报错:ValueError: not enough values to unpack (expected 3, got 2)

python调用cv2.findContours时报错:ValueError: not enough values to unpack (expected 3, got 2) OpenCV旧版,返回三个参数: im2, contours, hierarchy cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 要想返回三个参数…

优先级队列用的的数据结构

2019独角兽企业重金招聘Python工程师标准>>> 优先级队列和队列没有本质的区别 只是 每次出队列的时候出队列中优先级最高的 这里假定数字越小,优先级越高 优先级队列 是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。 通…

公网访问阿里云数据库MongoDB——填坑笔记

业务情景 两台服务器,一台阿里云ECS云服务器(专用网络),另一台是阿里云数据库MongoDB,处于安全考虑MongoDB是不运行外网连接的,那接下来就看怎么实现公网访问。 看到上面红色的网络类型描述,有…

华为S5700交换机开启telnet远程登陆配置(推荐)

实验目标: 电脑PC1经过S3700交换机,telnet远程登录到S5700交换机。 连接拓扑图如下:(测试时用实物测试) 一、配置S5700交换机。 1.交换机开启Telnet服务 <Huawei>system-view Enter system view, return user view with Ctrl+Z. [Huawei]sysname LSW1 [LSW1]

2021最新Python量化A股投资必赚策略

一、板块信息&#xff1a; 1、每隔30分钟后台自动采集一个开盘啦的板块信息&#xff08;9:15开始到15:00是股票开市时间&#xff0c;如果15点以后已经采集过数据&#xff0c;就不需要重复采集&#xff0c;避免频繁采集被网站屏蔽&#xff09;。按照codelist.txt列表&#xff0…

Ubuntu安装设置nginx和nohup常用操作

nginx安装 Ubuntu直接从常规源中安装 apt-get install nginx 安装的目录 配置文件&#xff1a;/etc/nginx/主程序文件&#xff1a;/usr/sbin/nginxWeb默认目录&#xff1a;/usr/share/nginx/http/日志目录&#xff1a;/var/log/nginx/ nginx常用命令 1、启动/停止nginx服务 1…

crontab环境变量

为什么80%的码农都做不了架构师&#xff1f;>>> 设置了一个crontab30 0 * * * cd /home/work/user/huangbx/research/getfeature/data/current; sh resample.sh &>/dev/null$sh resample.sh是可以运行的$head -5 resample.sh##对事实数据进行采样set -xg_da…

不同网段通过静态路由实现互通(强烈推荐)

实验拓扑图如下&#xff1a; 只贴出PC1到S5700链路的配置代码&#xff01; 一、华为交换机S5700配置 1.新建VLAN66 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]sysname LSW4 [LSW4]vlan 66 //新建管理VLAN [LSW4-vlan66]quit [L…

Hadoop 副本存储策略的源码修改和设置

Table of Contents BlockPlacementPolicyHadoop 提供的 BlockPlacementPolicy 实现BlockPlacementPolicyDefault 源码阅读 首先处理favoredNodes三副本选择再到具体的选择源码阅读的几个注意修改HDFS默认的副本放置机制RackAwareness 机架感知 大多数的叫法都是副本放置策略&a…

fabric.js和高级画板

本文介绍fabric.js框架使用&#xff0c;以及使用fabricjs打造一个高级画板程序. 高级画板功能介绍 全局绘制颜色选择护眼模式、网格模式切换自由绘制画箭头画直线画虚线画圆/椭圆/矩形/直角三角形/普通三角形/等边三角形文字输入图片展示及相关移动、缩放等操作删除功能 &am…

不同网段通过静态路由实现互通,华为S5700交换机开启telnet远程指定IP登陆配置(强烈推荐)

首先,不同网段通过静态路由实现互通配置方法,参考不同网段通过静态路由实现互通 在以上基础上,还需要配置 一、配置S5700交换机。 1.交换机开启Telnet服务 <Huawei>system-view Enter system view, return user view with Ctrl+Z. [Huawei]sysname LSW4 [