TensorflowTutorial_一维数据构造简单CNN

使用一维数据构造简单卷积神经网络

觉得有用的话,欢迎一起讨论相互学习~Follow Me

神经网络对于一维数据非常重要,时序数据集、信号处理数据集和一些文本嵌入数据集都是一维数据,会频繁的使用到神经网络。我们在此利用一组一维数据构造卷积层-最大池化层-全连接层的卷积神经网络。希望给大家使用CNN处理一维数据一些帮助。

参考代码

# Implementing Different Layers
# ---------------------------------------
#
# We will illustrate how to use different types
# of layers in TensorFlow
#
# The layers of interest are:
#  (1) Convolutional Layer卷积层
#  (2) Activation Layer激活层
#  (3) Max-Pool Layer池化层
#  (4) Fully Connected Layer 全连接层
#
# We will generate two different data sets for this
#  script, a 1-D data set (row of data) and
#  a 2-D data set (similar to picture)

import tensorflow as tf
import matplotlib.pyplot as plt
import csv
import os
import random
import numpy as np
import random
from tensorflow.python.framework import ops

ops.reset_default_graph()

# ---------------------------------------------------|
# -------------------1D-data-------------------------|
# ---------------------------------------------------|

# Create graph session 创建初始图结构
ops.reset_default_graph()
sess = tf.Session()

# parameters for the run运行参数
data_size = 25
conv_size = 5  # 卷积核宽度方向的大小
maxpool_size = 5  # 池化层核宽度方向上的大小
stride_size = 1  # 卷积核宽度方向上的步长

# ensure reproducibility 确保复现性
seed = 13
np.random.seed(seed)
tf.set_random_seed(seed)

# Generate 1D data 生成一维数据
data_1d = np.random.normal(size=data_size)

# Placeholder
x_input_1d = tf.placeholder(dtype=tf.float32, shape=[data_size])

# --------Convolution--------
def conv_layer_1d(input_1d, my_filter, stride):
    # TensorFlow‘s ‘conv2d()‘ function only works with 4D arrays:
    # [batch, height, width, channels], we have 1 batch, and
    # width = 1, but height = the length of the input, and 1 channel.
    # So next we create the 4D array by inserting dimension 1‘s.
    # 关于数据维度的处理十分关键,因为tensorflow中卷积操作只支持四维的张量,
    # 所以要人为的把数据补充为4维数据[1,1,25,1]
    input_2d = tf.expand_dims(input_1d, 0)
    input_3d = tf.expand_dims(input_2d, 0)
    input_4d = tf.expand_dims(input_3d, 3)
    # Perform convolution with stride = 1, if we wanted to increase the stride,
    # to say ‘2‘, then strides=[1,1,2,1]
    convolution_output = tf.nn.conv2d(input_4d, filter=my_filter, strides=[1, 1, stride, 1], padding="VALID")
    # Get rid of extra dimensions 去掉多余的层数,只保留数字
    conv_output_1d = tf.squeeze(convolution_output)
    return (conv_output_1d)

# Create filter for convolution.
my_filter = tf.Variable(tf.random_normal(shape=[1, conv_size, 1, 1]))
# Create convolution layer
my_convolution_output = conv_layer_1d(x_input_1d, my_filter, stride=stride_size)

# --------Activation--------
def activation(input_1d):
    return (tf.nn.relu(input_1d))

# Create activation layer
my_activation_output = activation(my_convolution_output)

# --------Max Pool--------
def max_pool(input_1d, width, stride):
    # Just like ‘conv2d()‘ above, max_pool() works with 4D arrays.
    # [batch_size=1, width=1, height=num_input, channels=1]
    # 因为在处理卷积层的结果时,使用squeeze函数对结果输出进行降维,所以此处要将最大池化层的维度提升为4维
    input_2d = tf.expand_dims(input_1d, 0)
    input_3d = tf.expand_dims(input_2d, 0)
    input_4d = tf.expand_dims(input_3d, 3)
    # Perform the max pooling with strides = [1,1,1,1]
    # If we wanted to increase the stride on our data dimension, say by
    # a factor of ‘2‘, we put strides = [1, 1, 2, 1]
    # We will also need to specify the width of the max-window (‘width‘)
    pool_output = tf.nn.max_pool(input_4d, ksize=[1, 1, width, 1],
                                 strides=[1, 1, stride, 1],
                                 padding=‘VALID‘)
    # Get rid of extra dimensions
    pool_output_1d = tf.squeeze(pool_output)
    return (pool_output_1d)

my_maxpool_output = max_pool(my_activation_output, width=maxpool_size, stride=stride_size)

# --------Fully Connected--------
def fully_connected(input_layer, num_outputs):
    # First we find the needed shape of the multiplication weight matrix:
    # The dimension will be (length of input) by (num_outputs)
    weight_shape = tf.squeeze(tf.stack([tf.shape(input_layer), [num_outputs]]))
    # squeeze函数用于去掉维度为1的维度。保留数据。

    # Initialize such weight
    # 初始化weight
    weight = tf.random_normal(weight_shape, stddev=0.1)
    # Initialize the bias
    # 初始化bias
    bias = tf.random_normal(shape=[num_outputs])
    # Make the 1D input array into a 2D array for matrix multiplication
    # 将一维的数组添加一维成为2维数组
    input_layer_2d = tf.expand_dims(input_layer, 0)
    # Perform the matrix multiplication and add the bias
    full_output = tf.add(tf.matmul(input_layer_2d, weight), bias)
    # Get rid of extra dimensions
    # 去掉多余的维度只保留数据
    full_output_1d = tf.squeeze(full_output)
    return (full_output_1d)

my_full_output = fully_connected(my_maxpool_output, 5)

# Run graph
# Initialize Variables
init = tf.global_variables_initializer()
sess.run(init)

feed_dict = {x_input_1d: data_1d}

print(‘>>>> 1D Data <<<<‘)

# Convolution Output
print(‘Input = array of length %d‘%(x_input_1d.shape.as_list()[0]))  # 25
print(‘Convolution w/ filter, length = %d, stride size = %d, results in an array of length %d:‘%
      (conv_size, stride_size, my_convolution_output.shape.as_list()[0]))  # 21
print(sess.run(my_convolution_output, feed_dict=feed_dict))

# Activation Output
print(‘\nInput = above array of length %d‘%(my_convolution_output.shape.as_list()[0]))  # 21
print(‘ReLU element wise returns an array of length %d:‘%(my_activation_output.shape.as_list()[0]))  # 21
print(sess.run(my_activation_output, feed_dict=feed_dict))

# Max Pool Output
print(‘\nInput = above array of length %d‘%(my_activation_output.shape.as_list()[0]))  # 21
print(‘MaxPool, window length = %d, stride size = %d, results in the array of length %d‘%
      (maxpool_size, stride_size, my_maxpool_output.shape.as_list()[0]))  # 17
print(sess.run(my_maxpool_output, feed_dict=feed_dict))

# Fully Connected Output
print(‘\nInput = above array of length %d‘%(my_maxpool_output.shape.as_list()[0]))  # 17
print(‘Fully connected layer on all 4 rows with %d outputs:‘%
      (my_full_output.shape.as_list()[0]))  # 5
print(sess.run(my_full_output, feed_dict=feed_dict))

# >>>> 1D Data <<<<
# Input = array of length 25
# Convolution w/ filter, length = 5, stride size = 1, results in an array of length 21:
# [-2.63576341 -1.11550486 -0.95571411 -1.69670296 -0.35699379  0.62266493
#   4.43316031  2.01364899  1.33044648 -2.30629659 -0.82916248 -2.63594174
#   0.76669347 -2.46465087 -2.2855041   1.49780679  1.6960566   1.48557389
#  -2.79799461  1.18149185  1.42146575]
#
# Input = above array of length 21
# ReLU element wise returns an array of length 21:
# [ 0.          0.          0.          0.          0.          0.62266493
#   4.43316031  2.01364899  1.33044648  0.          0.          0.
#   0.76669347  0.          0.          1.49780679  1.6960566   1.48557389
#   0.          1.18149185  1.42146575]
#
# Input = above array of length 21
# MaxPool, window length = 5, stride size = 1, results in the array of length 17
# [ 0.          0.62266493  4.43316031  4.43316031  4.43316031  4.43316031
#   4.43316031  2.01364899  1.33044648  0.76669347  0.76669347  1.49780679
#   1.6960566   1.6960566   1.6960566   1.6960566   1.6960566 ]
#
# Input = above array of length 17
# Fully connected layer on all 4 rows with 5 outputs:
# [ 1.71536088 -0.72340977 -1.22485089 -2.5412786  -0.16338299]

参考文献

TensorFlow机器学习实战指南

原文地址:https://www.cnblogs.com/cloud-ken/p/8425360.html

时间: 2024-11-05 20:28:23

TensorflowTutorial_一维数据构造简单CNN的相关文章

TensorflowTutorial_二维数据构造简单CNN

使用二维数据构造简单卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 图像和一些时序数据集都可以用二维数据的形式表现,我们此次使用随机分布的二位数据构造一个简单的CNN-网络卷积-最大池化-全连接 参考代码 # Implementing Different Layers # --------------------------------------- # # We will illustrate how to use different types # of layers

LeetCode总结 -- 一维数据合并篇

合并是一维数据结构中很常见的操作, 通常是排序, 分布式算法中的子操作. 这篇总结主要介绍LeetCode中关于合并的几个题目: Merge Two Sorted ListsMerge Sorted ArraySort ListMerge k Sorted Lists 我们先来看看两个有序一维数据的合并, 这里主要是要介绍链表的合并操作, 不过因为一维数组的合并也比较简单, 而且与链表有比较性, 就顺便在这里列举一下. Merge Two Sorted Lists就是要求合并两个有序链表, 一般

Hive数据导入——数据存储在Hadoop分布式文件系统中,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中!

转自:http://blog.csdn.net/lifuxiangcaohui/article/details/40588929 Hive是基于Hadoop分布式文件系统的,它的数据存储在Hadoop分布式文件系统中.Hive本身是没有专门的数据存储格式,也没有为数据建立索引,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据.所以往Hive表里面导入数据只是简单的将数据移动到表所在的目录中! Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中

事件与委托更新父窗体数据,简单比较

1.委托更新父窗页面. 例如,功能:父窗体A,子窗体B,由A打开B窗体,更新A窗体数据 A窗体代码: public delegate void reflshPassenger();//声明委托 private void btnAddPassenger_Click(object sender, EventArgs e)//打开B窗体按钮,并把委托窗体给B窗体        {            reflshPassenger reflshData = getPassengers;       

php一维数据转多维

今天在论坛里看到有个朋友的需求,见证csdn的版主都不愧是大牛的角色存在啊!!!保存起来,方便以后需要的时候使用. 字符串为: 1 = 光电鼠标 2 = 机械鼠标 3 = 没有鼠标 1.1 = 黑色光电鼠标 1.2 = 红色光电鼠标 1.2.1 = 蓝牙红色光电鼠标 版主解答为: <?php $s =<<< TXT 1 = 光电鼠标 2 = 机械鼠标 3 = 没有鼠标 1.1 = 黑色光电鼠标 1.2 = 红色光电鼠标 1.2.1 = 蓝牙红色光电鼠标 TXT; $res = ar

每天一点数据库之-----Day 4 数据的简单查询

每天一点数据库之-----Day 4 数据的增改删 ----转载请注明出处:coder-pig 本节引言: 本节介绍的是最简单的数据检索(查询),就是SELECT的最基本用法~ 针对本节查询,我们先建立一个工作人员表,以及录入一些几条记录: 包括,人员id,人员姓名,年龄,性别,工资,以及部门名称: 建表SQL: CREATE TABLE T_Worker ( FId INTEGER , FName VARCHAR ( 20), FAge INTEGER , FSex VARCHAR (10),

RapidMiner的基本使用(一个医疗数据的简单决策树算法分析)

RapidMiner的基本使用(一个医疗数据的简单决策树算法分析) 需要分析的文件: 右键分别创建读取excel数据,选择属性,设置对象,决策树算法这几个过程,然后连接起来 读取excel数据:[Insert Operator]->[Import]->[Data]->[Read Excel] 选择属性:[Insert Operator]->[Data Transformation]->[Attribute Set Reduction and Transformation]-&

利用PHP实现MySQL表数据的简单分页

PHP实现MySQL表数据的简单分页 <?php  $conn=mysql_connect("127.0.0.1","root",'123456') or die("数据库连接失败"); mysql_select_db("ym"); mysql_query("set names utf8"); //获取数据的行数 $all=mysql_num_rows(mysql_query("select

iOS 中级数据持久化——简单的数据库(Sqlite3)

sqlite是嵌入式的和轻量级的sql数据库.sqlite是由c实现的.广泛用于包括浏览器(支持html5的大部分浏览器,ie除外).ios.android以及一些便携需求的小型web应用系统. 数据库无非就是增,删,改,查四种.除了查询以为,其他的三种方法比较类似 //使用数据库之前,打开数据库 - (void)openDB { if (db != nil) { return; } //数据库存储在沙河中的caches文件夹下 NSString * cachesPath = [NSSearch