结合实例,在tensorflow中使用一维卷积对序列数据进行训练

首先要强调一点,一维卷积的含义是卷积核移动的方向是一维的,数据可以是二维的,很多初学者容易混淆这个概念
一维卷积也能对序列数据进行训练,相比于RNN网络训练速度更快并且能够达到和RNN近似的预测效果
下边结合tensorflow代码说明一下一维卷积处理序列数据的实现过程:

1. 引入依赖

from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

2. 数据预处理

读取数据(所需数据在文章结尾下载):

data = pd.read_csv('train.csv')

特征编码:

factorize函数会将特征的所有的可能值编码成数字,每一种可能值对应一个数字;函数返回两个数组
一个存储特征所有可能值的序号,一个存储所有可能值

labels=pd.factorize(data.species)[0] 
x = data[data.columns[2:]] # 前两列丢弃

划分训练集和测试集:

x = data[data.columns[2:]] # 前两列丢弃
train_x,test_x,train_y,test_y=train_test_split(x,labels)
print(train_x)

对训练集和测试集进行标准化:

1.求训练集的均值和方差,然后使用训练集的均值和方差对训练集和测试集数据进行标准化
2.然后对训练集和测试集扩充维度,使数据的每个特征都能有多个通道

mean=train_x.mean(axis=0)
std=train_x.std(axis=0)
train_x=(train_x-mean)/std
test_x=(test_x-mean)/std
train_x=np.expand_dims(train_x,-1)
test_x=np.expand_dims(test_x,-1)

3. 建立模型

模型概述:

->一维卷积层->池化层->Dropout层-> …
->一维卷积层->池化层->Dropout层->
->全局平均池化->Dropout层->
->全连接层-> … 结束

上边的网络结构大致可以分为两部分,全局平均池化之前的卷积层用于特征提取,而全局平均池化层之后的全连接层结构本质上就是一个分类器

注意:

  1. 第一个卷积结构要声明输入数据的结构
  2. 一维卷积一般使用relu激活函数
  3. 卷积核数量一般为2^n,并且逐层增加
  4. 使用dropout层防止模型过拟合
  5. 全连接层最后的输出要和分类数相同 并使用softmax对模型输出进行归一化
  6. 想要继续增加网络拟合能力,可以增加网络深度并增加残差网络结构防止网络过深导致的梯度消失问题

建立网络的代码如下:

    # 一维卷积输入格式 samples feature 每个特征的通道数
    model=keras.Sequential()
    model.add(keras.layers.Conv1D(32,7,input_shape=(train_x.shape[1:]),activation='relu',padding='same'))  # 32 为卷积核个数 7为卷积核长度
    model.add(keras.layers.Conv1D(32,7,activation='relu',padding='same'))
    model.add(keras.layers.MaxPooling1D(3))  # 讲妹每个feature map 中的三个特征合成一个
    model.add(keras.layers.Dropout(0.5))
    model.add(keras.layers.Conv1D(64,7,activation='relu',padding='same'))
    model.add(keras.layers.Conv1D(64, 7, activation='relu', padding='same'))
    model.add(keras.layers.MaxPooling1D(3))  # 讲妹每个feature map 中的三个特征合成一个
    model.add(keras.layers.Dropout(0.5))
    model.add(keras.layers.Conv1D(128,7,activation='relu',padding='same'))
    model.add(keras.layers.Conv1D(128, 7, activation='relu', padding='same'))
    model.add(keras.layers.MaxPooling1D(3))  # 讲妹每个feature map 中的三个特征合成一个
    model.add(keras.layers.Dropout(0.5))
    model.add(keras.layers.Conv1D(256,7,activation='relu',padding='same'))
    model.add(keras.layers.Conv1D(256, 7, activation='relu', padding='same'))
    model.add(keras.layers.MaxPooling1D(3))  # 讲妹每个feature map 中的三个特征合成一个
    model.add(keras.layers.Dropout(0.5))
    model.add(keras.layers.GlobalAveragePooling1D())
    model.add(keras.layers.Dropout(0.5))
    model.add(keras.layers.Dense(256))  # 讲妹每个feature map 中的三个特征合成一个
    model.add(keras.layers.Dropout(0.5))
    model.add(keras.layers.Dense(99,activation='softmax'))
    print(model.summary())
    # 可进一步增加网络深度 并使用残差网络结构避免梯度消失

4. 编译并训练模型

对于序列数据, 一般RMSprop函数作为优化函数;由于是多分累问题且标签项没有使用one-hot编码,因此使用 sparse_categorical_crossentropy(多元交叉熵)损失函数
(深入了解RMSprop函数请参考这篇文章->#深度解析# SSR,MSE,RMSE,MAE、SSR、SST、R-squared、Adjusted R-squared误差的区别)

代码如下:

 model.compile(optimizer=keras.optimizers.RMSprop(),loss='sparse_categorical_crossentropy',metrics=['acc']) #非one-hot编码使用sparse
# history = model.fit(train_x, train_y, epochs=600, batch_size=128, validation_data=(test_x, test_y))
history = model.fit(train_x, train_y, epochs=1000, validation_data=(test_x, test_y)) # 每个epoch训练所有数据
plt.plot(history.epoch,history.history['acc'],'y',label='training')
plt.plot(history.epoch,history.history['val_acc'],'b',label='test')
plt.legend()
plt.show()

5. 数据下载地址

tensorflow使用一维卷积对序列数据进行训练

  • 3
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一维卷积注意力是一种在TensorFlow使用一维卷积操作。它在处理序列数据时非常有用。一维卷积注意力的实现过程如下: 首先,我们需要搭建网络。这里以最简单的sequential为例,先是卷积层,然后是池化层,接着是全连接层。具体代码如下: ```python sequential = [ tf.keras.layers.Conv1D(2, kernel_size=1, padding='same', activation=tf.nn.relu), tf.keras.layers.MaxPool1D(pool_size=2, strides=2, padding='same'), tf.keras.layers.Conv1D(2, kernel_size=1, padding='same', activation=tf.nn.relu), tf.keras.layers.MaxPool1D(pool_size=2, strides=2, padding='same') ] layers = [ tf.keras.layers.Dense(20, activation=tf.nn.relu), tf.keras.layers.Dense(15, activation=tf.nn.sigmoid) ] model = tf.keras.Sequential() model.add(sequential) model.add(layers) model.build(input_shape=[None, 10, 10]) ``` 上述代码首先定义了一个sequential列表,其包含了两个卷积层和两个池化层。然后定义了一个layers列表,包含了两个全连接层。最后通过Sequential()创建了一个模型,并添加了sequential和layers。 这样就完成了一维卷积注意力的搭建。接下来可以编译并训练模型,根据需要进行数据预处理。具体代码和数据下载地址可以参考[2]的内容。 综上所述,一维卷积注意力是利用一维卷积操作处理序列数据的一种方法,在TensorFlow可以通过搭建网络来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于Tensorflow一维卷积用法详解](https://download.csdn.net/download/weixin_38591011/12851840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [结合实例,在tensorflow使用一维卷积序列数据进行训练](https://blog.csdn.net/lch551218/article/details/113863744)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Tensorflow2.0 一维卷积神经网络搭建](https://blog.csdn.net/Gentlezzx/article/details/107919953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

energy_百分百

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值