[Python人工智能] 十四.循环神经网络LSTM RNN回归案例之sin曲线预测
从本专栏开始,作者正式开始研究Python深度学习、神经网络及人工智能相关知识。前一篇文章详细讲解了如何评价神经网络,绘制训练过程中的loss曲线,并结合图像分类案例讲解精确率、召回率和F值的计算过程。本篇文章将分享循环神经网络LSTM RNN如何实现回归预测,通过sin曲线拟合实现如下图所示效果。本文代码量比较长,但大家还是可以学习下的。基础性文章,希望对您有所帮助!
本专栏主要结合作者之前的博客、AI经验和相关视频(强推"莫烦大神"视频)及论文介绍,后面随着深入会讲解更多的Python人工智能案例及应用。基础性文章,希望对您有所帮助,如果文章中存在错误或不足之处,还请海涵~作者作为人工智能的菜鸟,希望大家能与我在这一笔一划的博客中成长起来。写了这么多年博客,尝试第一个付费专栏,但更多博客尤其基础性文章,还是会继续免费分享,但该专栏也会用心撰写,望对得起读者,共勉!
代码下载地址:https://github.com/eastmountyxz/AI-for-TensorFlow
CSDN下载地址:
PS:百度网盘链接总被下线,需要的私聊我,或从CSDN、Github下载。
文章目录
- 一.RNN和LSTM前文回顾
- 1.RNN
- 2.LSTM
- 二.LSTM RNN回归案例说明
- 三.代码实现
- 四.完整代码及可视化展示
- 五.预测及曲线拟合
- 六.总结
同时推荐前面作者另外三个Python系列文章。从2014年开始,作者主要写了三个Python系列文章,分别是基础知识、网络爬虫和数据分析。2018年陆续增加了Python图像识别和Python人工智能专栏。
- Python基础知识系列:Python基础知识学习与提升
- Python网络爬虫系列:Python爬虫之Selenium+Phantomjs+CasperJS
- Python数据分析系列:知识图谱、web数据挖掘及NLP
- Python图像识别系列:Python图像处理及图像识别
- Python人工智能系列:Python人工智能及知识图谱实战
前文:
[Python人工智能] 一.TensorFlow2.0环境搭建及神经网络入门
[Python人工智能] 二.TensorFlow基础及一元直线预测案例
[Python人工智能] 三.TensorFlow基础之Session、变量、传入值和激励函数
[Python人工智能] 四.TensorFlow创建回归神经网络及Optimizer优化器
[Python人工智能] 五.Tensorboard可视化基本用法及绘制整个神经网络
[Python人工智能] 六.TensorFlow实现分类学习及MNIST手写体识别案例
[Python人工智能] 七.什么是过拟合及dropout解决神经网络中的过拟合问题
[Python人工智能] 八.卷积神经网络CNN原理详解及TensorFlow编写CNN
[Python人工智能] 九.gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算
[Python人工智能] 十.Tensorflow+Opencv实现CNN自定义图像分类案例及与机器学习KNN图像分类算法对比
[Python人工智能] 十一.Tensorflow如何保存神经网络参数
[Python人工智能] 十二.循环神经网络RNN和LSTM原理详解及TensorFlow编写RNN分类案例
[Python人工智能] 十三.如何评价神经网络、loss曲线图绘制、图像分类案例的F值计算
最后希望大家帮我CSDN博客之星投投票,每天可以投5票喔,谢谢大家!八年,在CSDN分享了410篇文章,15个专栏,400多万人次浏览,包括Python人工智能、数据挖掘、网络爬虫、图象处理、网络安全、JAVA网站、Android开发、LAMP/WAMP、C#网络编程、C++游戏、算法和数据结构、面试总结、人生感悟等。当然还有我和你的故事,感恩一路有你,感谢一路同行,希望通过编程分享帮助到更多人,也希望学成之后教更多学生。因为喜欢,所以分享,且看且珍惜,加油!我的学生们,等我学成归来~
投票地址:http://m234140.nofollow.ax.mvote.cn/opage/ed8141a0-ed19-774b-6b0d-39c3aaf89dde.html?from=singlemessage
一.RNN和LSTM前文回顾
在编写代码之前,我们再回归下RNN和LSTM的原理知识,因为部分博友可能没看过之前 第十二篇文章。
1.RNN
(1) RNN原理
循环神经网络英文是Recurrent Neural Networks,简称RNN。假设有一组数据data0、data1、data2、data3,使用同一个神经网络预测它们,得到对应的结果。如果数据之间是有关系的,比如做菜下料的前后步骤,英文单词的顺序,如何让数据之间的关联也被神经网络学习呢?这就要用到——RNN。
假设存在ABCD数字,需要预测下一个数字E,会根据前面ABCD顺序进行预测,这就称为记忆。预测之前,需要回顾以前的记忆有哪些,再加上这一步新的记忆点,最终输出output,循环神经网络(RNN)就利用了这样的原理。
首先,让我们想想人类是怎么分析事物之间的关联或顺序的。人类通常记住之前发生的事情,从而帮助我们后续的行为判断,那么是否能让计算机也记住之前发生的事情呢?
在分析data0时,我们把分析结果存入记忆Memory中,然后当分析data1时,神经网络(NN)会产生新的记忆,但此时新的记忆和老的记忆没有关联,如上图所示。在RNN中,我们会简单的把老记忆调用过来分析新记忆,如果继续分析更多的数据时,NN就会把之前的记忆全部累积起来。
RNN结构如下图所示,按照时间点t-1、t、t+1,每个时刻有不同的x,每次计算会考虑上一步的state和这一步的x(t),再输出y值。在该数学形式中,每次RNN运行完之后都会产生s(t),当RNN要分析x(t+1)时,此刻的y(t+1)是由s(t)和s(t+1)共同创造的,s(t)可看作上一步的记忆。多个神经网络NN的累积就转换成了循环神经网络,其简化图如下图的左边所示。
总之,只要你的数据是有顺序的,就可以使用RNN,比如人类说话的顺序,电话号码的顺序,图像像素排列的顺序,ABC字母的顺序等。在前面讲解CNN原理时,它可以看做是一个滤波器滑动扫描整幅图像,通过卷积加深神经网络对图像的理解。
而RNN也有同样的扫描效果,只不过是增加了时间顺序和记忆功能。RNN通过隐藏层周期性的连接,从而捕获序列化数据中的动态信息,提升预测结果。
(2) RNN应用
RNN常用于自然语言处理、机器翻译、语音识别、图像识别等领域,下面简单分享RNN相关应用所对应的结构。
- RNN情感分析: 当分析一个人说话情感是积极的还是消极的,就用如下图所示的RNN结构,它有N个输入,1个输出,最后时间点的Y值代表最终的输出结果。
- RNN图像识别: 此时有一张图片输入X,N张对应的输出。
- RNN机器翻译: 输入和输出分别两个,对应的是中文和英文,如下图所示。
2.LSTM
接下来我们看一个更强大的结构,称为LSTM。
(1) 为什么要引入LSTM呢?
RNN是在有序的数据上进行学习的,RNN会像人一样对先前的数据发生记忆,但有时候也会像老爷爷一样忘记先前所说。为了解决RNN的这个弊端,提出了LTSM技术,它的英文全称是Long short-term memory,长短期记忆,也是当下最流行的RNN之一。
假设现在有一句话,如下图所示,RNN判断这句话是红烧排骨,这时需要学习,而“红烧排骨“在句子开头。
"红烧排骨"这个词需要经过长途跋涉才能抵达,要经过一系列得到误差,然后经过反向传递,它在每一步都会乘以一个权重w参数。如果乘以的权重是小于1的数,比如0.9,0.9会不断地乘以误差,最终这个值传递到初始值时,误差就消失了,这称为梯度消失或梯度离散。
反之,如果误差是一个很大的数,比如1.1,则这个RNN得到的值会很大,这称为梯度爆炸。
梯度消失或梯度爆炸:
在RNN中,如果你的State是一个很长的序列,假设反向传递的误差值是一个小于1的数,每次反向传递都会乘以这个数,0.9的n次方趋向于0,1.1的n次方趋向于无穷大,这就会造成梯度消失或梯度爆炸。
这也是RNN没有恢复记忆的原因,为了解决RNN梯度下降时遇到的梯度消失或梯度爆炸问题,引入了LSTM。
(2) LSTM
LSTM是在普通的RNN上面做了一些改进,LSTM RNN多了三个控制器,即输入、输出、忘记控制器。左边多了个条主线,例如电影的主线剧情,而原本的RNN体系变成了分线剧情,并且三个控制器都在分线上。
- 输入控制器(write gate): 在输入input时设置一个gate,gate的作用是判断要不要写入这个input到我们的内存Memory中,它相当于一个参数,也是可以被训练的,这个参数就是用来控制要不要记住当下这个点。
- 输出控制器(read gate): 在输出位置的gate,判断要不要读取现在的Memory。
- 忘记控制器(forget gate): 处理位置的忘记控制器,判断要不要忘记之前的Memory。
LSTM工作原理为:如果分线剧情对于最终结果十分重要,输入控制器会将这个分线剧情按重要程度写入主线剧情,再进行分析;如果分线剧情改变了我们之前的想法,那么忘记控制器会将某些主线剧情忘记,然后按比例替换新剧情,所以主线剧情的更新就取决于输入和忘记控制;最后的输出会基于主线剧情和分线剧情。
通过这三个gate能够很好地控制我们的RNN,基于这些控制机制,LSTM是延缓记忆的良药,从而带来更好的结果。
二.LSTM RNN回归案例说明
前面我们讲解了RNN、CNN的分类问题,这篇文章将分享一个回归问题。在LSTM RNN回归案例中,我们想要用蓝色的虚线预测红色的实线,由于sin曲线是波浪循环,所以RNN会用一段序列来预测另一段序列。
代码基本结构包括:
- (1) 生成数据的函数get_batch()
- (2) 主体LSTM RNN
- (3) 三层神经网络,包括input_layer、cell、output_layer,和之前分类RNN的结构一样。
def add_input_layer(self,):pass
def add_cell(self):pass
def add_output_layer(self):pass
- (4) 计算误差函数 computer_cost
- (5) 误差weight和偏置biases
- (6) 主函数建立LSTM RNN模型
- (7) TensorBoard可视化神经网络模型,matplotlib可视化拟合曲线、
最后再补充下BPTT,就开始我们的代码编写。
(1) 普通RNN
假设我们训练含有1000000个数据的序列,如果全部训练的话,整个的序列都feed进RNN中,容易造成梯度消失或爆炸的问题。所以解决的方法就是截断反向传播 (Truncated Backpropagation,BPTT) ,我们将序列截断来进行训练(num_steps)。
一般截断的反向传播是:在当前时间t,往前反向传播num_steps步即可。如下图,长度为6的序列,截断步数是3,Initial State和Final State在RNN Cell中传递。
(2) TensorFlow版本的BPTT
但是Tensorflow中的实现并不是这样,它是将长度为6的序列分为了两部分,每一部分长度为3,前一部分计算得到的final state用于下一部分计算的initial state。如下图所示,每个batch进行单独的截断反向传播。此时的batch会保存Final State,并作为下一个batch的初始化State。
参考:深度学习(07)RNN-循环神经网络-02-Tensorflow中的实现 - 莫失莫忘Lawlite
三.代码实现
第一步,打开Anaconda,然后选择已经搭建好的“tensorflow”环境,运行Spyder。
第二步,导入扩展包。
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
第三步,编写生成数据的函数get_batch(),它生成了sin曲线的序列。
# 获取批量数据
def get_batch():global BATCH_START, TIME_STEPS# xs shape (50batch, 20steps)xs = np.arange(BATCH_START, BATCH_START+TIME_STEPS*BATCH_SIZE).reshape((BATCH_SIZE, TIME_STEPS)) / (10*np.pi)seq = np.sin(xs)res = np.cos(xs)BATCH_START += TIME_STEPS # 显示原始曲线plt.plot(xs[0, :], res[0, :], 'r', xs[0, :], seq[0, :], 'b--')plt.show()# 返回序列seq 结果res 输入xsreturn [seq[:, :, np.newaxis], res[:, :, np.newaxis], xs]
此时的输出结果如下图所示,注意它只是模拟的预期曲线,还不是我们神经网络学习的结构。
第四步,编写LSTMRNN类,它用于定义我们的循环神经网络结构,初始化操作和所需变量。
初始化init()函数的参数包括:
- n_steps表示batch中的步骤,共有3步。
- input_size表示传入batch data时,每个input的长度,该实例中input_size和output_size均为1。如下图所示,假设我们batch长度为一个周期(0-6),每个input是线的x值,input size表示每个时间点有多少个值,只有一个点故为1。
- output_size表示输出的值,输出对应input线的y值,其大小值为1。
- cell_size表示RNN Cell的个数,其值为10。
- batch_size表示一次性传给神经网络的batch数量,设置为50。
该部分代码如下,注意xs和ys的形状。同时,我们需要使用Tensorboard可视化RNN的结构,所以调用tf.name_scope()设置各神经层和变量的命名空间名称,详见 第五篇文章。
#----------------------------------定义参数----------------------------------
BATCH_START = 0
TIME_STEPS = 20
BATCH_SIZE = 50 # BATCH数量
INPUT_SIZE = 1 # 输入一个值
OUTPUT_SIZE = 1 # 输出一个值
CELL_SIZE = 10 # Cell数量
LR = 0.006
BATCH_START_TEST = 0#----------------------------------LSTM RNN----------------------------------
class LSTMRNN(object):# 初始化操作def __init__(self, n_steps, input_size, output_size, cell_size, batch_size):self.n_steps = n_stepsself.input_size = input_sizeself.output_size = output_sizeself.cell_size = cell_sizeself.batch_size = batch_size# TensorBoard可视化操作使用name_scopewith tf.name_scope('inputs'): #输出变量self.xs = tf.placeholder(tf.float32, [None, n_steps, input_size], name='xs')self.ys = tf.placeholder(tf.float32, [None, n_steps, output_size], name='ys')with tf.variable_scope('in_hidden'): #输入层self.add_input_layer()with tf.variable_scope('LSTM_cell'): #处理层self.add_cell()with tf.variable_scope('out_hidden'): #输出层self.add_output_layer()with tf.name_scope('cost'): #误差self.compute_cost()with tf.name_scope('train'): #训练self.train_op = tf.train.AdamOptimizer(LR).minimize(self.cost)
第五步,接着开始编写三个函数(三层神经网络),它是RNN的核心结构。
# 输入层
def add_input_layer(self,):pass
# cell层
def add_cell(self):pass
# 输出层
def add_output_layer(self):pass
这三个函数也是增加在LSTMRNN的Class中,核心代码及详细注释如下所示:
#--------------------------------定义核心三层结构-----------------------------
# 输入层
def add_input_layer(self,):# 定义输入层xs变量 将xs三维数据转换成二维# [None, n_steps, input_size] => (batch*n_step, in_size)l_in_x = tf.reshape(self.xs, [-1, self.input_size], name='2_2D')# 定义输入权重 (in_size, cell_size)Ws_in = self._weight_variable([self.input_size, self.cell_size])# 定义输入偏置 (cell_size, )bs_in = self._bias_variable([self.cell_size,])# 定义输出y变量 二维形状 (batch * n_steps, cell_size)with tf.name_scope('Wx_plus_b'):l_in_y = tf.matmul(l_in_x, Ws_in) + bs_in# 返回结果形状转变为三维# l_in_y ==> (batch, n_steps, cell_size)self.l_in_y = tf.reshape(l_in_y, [-1, self.n_steps, self.cell_size], name='2_3D')# cell层
def add_cell(self):# 选择BasicLSTMCell模型# forget初始偏置为1.0(初始时不希望forget) 随着训练深入LSTM会选择性忘记lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(self.cell_size, forget_bias=1.0, state_is_tuple=True)# 设置initial_state全为0 可视化操作用name_scopewith tf.name_scope('initial_state'):self.cell_init_state = lstm_cell.zero_state(self.batch_size, dtype=tf.float32)# RNN循环 每一步的输出都存储在cell_outputs序列中 cell_final_state为最终State并传入下一个batch中# 常规RNN只有m_state LSTM包括c_state和m_stateself.cell_outputs, self.cell_final_state = tf.nn.dynamic_rnn(lstm_cell, self.l_in_y, initial_state=self.cell_init_state, time_major=False)# 输出层 (类似输入层)
def add_output_layer(self):# 转换成二维 方能使用W*X+B# shape => (batch * steps, cell_size) l_out_x = tf.reshape(self.cell_outputs, [-1, self.cell_size], name='2_2D')Ws_out = self._weight_variable([self.cell_size, self.output_size])bs_out = self._bias_variable([self.output_size, ])# 返回预测结果# shape => (batch * steps, output_size)with tf.name_scope('Wx_plus_b'):self.pred = tf.matmul(l_out_x, Ws_out) + bs_out
注意,上面调用了reshape()进行形状更新,为什么要将三维变量改成二维呢?因为只有变成二维变量之后,才能计算W*X+B。
第六步,定义计算误差函数。
这里需要注意:我们使用了seq2seq函数。它求出的loss是整个batch每一步的loss,然后把每一步loss进行sum求和,变成了整个TensorFlow的loss,再除以batch size平均,最终得到这个batch的总cost,它是一个scalar数字。
# 定义误差计算函数
def compute_cost(self):# 使用seq2seq序列到序列模型# tf.nn.seq2seq.sequence_loss_by_example()losses = tf.contrib.legacy_seq2seq.sequence_loss_by_example([tf.reshape(self.pred, [-1], name='reshape_pred')],[tf.reshape(self.ys, [-1], name='reshape_target')],[tf.ones([self.batch_size * self.n_steps], dtype=tf.float32)],average_across_timesteps=True,softmax_loss_function=self.msr_error,name='losses')# 最终得到batch的总cost 它是一个数字with tf.name_scope('average_cost'):# 整个TensorFlow的loss求和 再除以batch sizeself.cost = tf.div(tf.reduce_sum(losses, name='losses_sum'),self.batch_size,name='average_cost')tf.summary.scalar('cost', self.cost)
后面的文章我们会详细写一篇机器翻译相关的内容,并使用seq2seq模型。
Seq2Seq模型是输出的长度不确定时采用的模型,这种情况一般是在机器翻译的任务中出现,将一句中文翻译成英文,那么这句英文的长度有可能会比中文短,也有可能会比中文长,所以输出的长度就不确定了。如下图所,输入的中文长度为4,输出的英文长度为2。
在网络结构中,输入一个中文序列,然后输出它对应的中文翻译,输出的部分的结果预测后面,根据上面的例子,也就是先输出“machine”,将"machine"作为下一次的输入,接着输出"learning",这样就能输出任意长的序列。
机器翻译、人机对话、聊天机器人等等,这些都是应用在当今社会都或多或少的运用到了我们这里所说的Seq2Seq。
第七步,定义msr_error计算函数、误差计算函数和偏置计算函数。
# 该函数用于计算
# 相当于msr_error(self, y_pre, y_target) return tf.square(tf.sub(y_pre, y_target))
def msr_error(self, logits, labels):return tf.square(tf.subtract(logits, labels))
# 误差计算
def _weight_variable(self, shape, name='weights'):initializer = tf.random_normal_initializer(mean=0., stddev=1.,)return tf.get_variable(shape=shape, initializer=initializer, name=name)
# 偏置计算
def _bias_variable(self, shape, name='biases'):initializer = tf.constant_initializer(0.1)return tf.get_variable(name=name, shape=shape, initializer=initializer)
写到这里,整个Class就定义完成。
第八步,接下来定义主函数,进行训练和预测操作,这里先尝试TensorBoard可视化展现。
#----------------------------------主函数 训练和预测----------------------------------
if __name__ == '__main__':# 定义模型并初始化model = LSTMRNN(TIME_STEPS, INPUT_SIZE, OUTPUT_SIZE, CELL_SIZE, BATCH_SIZE)sess = tf.Session()merged = tf.summary.merge_all()writer = tf.summary.FileWriter("logs", sess.graph)sess.run(tf.initialize_all_variables())
四.完整代码及可视化展示
该阶段的完整代码如下,我们先尝试运行下代码:
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 9 20:44:56 2020
@author: xiuzhang Eastmount CSDN
"""
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt#----------------------------------定义参数----------------------------------
BATCH_START = 0
TIME_STEPS = 20
BATCH_SIZE = 50 # BATCH数量
INPUT_SIZE = 1 # 输入一个值
OUTPUT_SIZE = 1 # 输出一个值
CELL_SIZE = 10 # Cell数量
LR = 0.006
BATCH_START_TEST = 0# 获取批量数据
def get_batch():global BATCH_START, TIME_STEPS# xs shape (50batch, 20steps)xs = np.arange(BATCH_START, BATCH_START+TIME_STEPS*BATCH_SIZE).reshape((BATCH_SIZE, TIME_STEPS)) / (10*np.pi)seq = np.sin(xs)res = np.cos(xs)BATCH_START += TIME_STEPS # 返回序列seq 结果res 输入xsreturn [seq[:, :, np.newaxis], res[:, :, np.newaxis], xs]#----------------------------------LSTM RNN----------------------------------
class LSTMRNN(object):# 初始化操作def __init__(self, n_steps, input_size, output_size, cell_size, batch_size):self.n_steps = n_stepsself.input_size = input_sizeself.output_size = output_sizeself.cell_size = cell_sizeself.batch_size = batch_size# TensorBoard可视化操作使用name_scopewith tf.name_scope('inputs'): #输出变量self.xs = tf.placeholder(tf.float32, [None, n_steps, input_size], name='xs')self.ys = tf.placeholder(tf.float32, [None, n_steps, output_size], name='ys')with tf.variable_scope('in_hidden'): #输入层self.add_input_layer()with tf.variable_scope('LSTM_cell'): #处理层self.add_cell()with tf.variable_scope('out_hidden'): #输出层self.add_output_layer()with tf.name_scope('cost'): #误差self.compute_cost()with tf.name_scope('train'): #训练self.train_op = tf.train.AdamOptimizer(LR).minimize(self.cost)#--------------------------------定义核心三层结构-----------------------------# 输入层def add_input_layer(self,):# 定义输入层xs变量 将xs三维数据转换成二维# [None, n_steps, input_size] => (batch*n_step, in_size)l_in_x = tf.reshape(self.xs, [-1, self.input_size], name='2_2D')# 定义输入权重 (in_size, cell_size)Ws_in = self._weight_variable([self.input_size, self.cell_size])# 定义输入偏置 (cell_size, )bs_in = self._bias_variable([self.cell_size,])# 定义输出y变量 二维形状 (batch * n_steps, cell_size)with tf.name_scope('Wx_plus_b'):l_in_y = tf.matmul(l_in_x, Ws_in) + bs_in# 返回结果形状转变为三维# l_in_y ==> (batch, n_steps, cell_size)self.l_in_y = tf.reshape(l_in_y, [-1, self.n_steps, self.cell_size], name='2_3D')# cell层def add_cell(self):# 选择BasicLSTMCell模型# forget初始偏置为1.0(初始时不希望forget) 随着训练深入LSTM会选择性忘记lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(self.cell_size, forget_bias=1.0, state_is_tuple=True)# 设置initial_state全为0 可视化操作用name_scopewith tf.name_scope('initial_state'):self.cell_init_state = lstm_cell.zero_state(self.batch_size, dtype=tf.float32)# RNN循环 每一步的输出都存储在cell_outputs序列中 cell_final_state为最终State并传入下一个batch中# 常规RNN只有m_state LSTM包括c_state和m_stateself.cell_outputs, self.cell_final_state = tf.nn.dynamic_rnn(lstm_cell, self.l_in_y, initial_state=self.cell_init_state, time_major=False)# 输出层 (类似输入层)def add_output_layer(self):# 转换成二维 方能使用W*X+B# shape => (batch * steps, cell_size) l_out_x = tf.reshape(self.cell_outputs, [-1, self.cell_size], name='2_2D')Ws_out = self._weight_variable([self.cell_size, self.output_size])bs_out = self._bias_variable([self.output_size, ])# 返回预测结果# shape => (batch * steps, output_size)with tf.name_scope('Wx_plus_b'):self.pred = tf.matmul(l_out_x, Ws_out) + bs_out#--------------------------------定义误差计算函数----------------------------- def compute_cost(self):# 使用seq2seq序列到序列模型# tf.nn.seq2seq.sequence_loss_by_example()losses = tf.contrib.legacy_seq2seq.sequence_loss_by_example([tf.reshape(self.pred, [-1], name='reshape_pred')],[tf.reshape(self.ys, [-1], name='reshape_target')],[tf.ones([self.batch_size * self.n_steps], dtype=tf.float32)],average_across_timesteps=True,softmax_loss_function=self.msr_error,name='losses')# 最终得到batch的总cost 它是一个数字with tf.name_scope('average_cost'):# 整个TensorFlow的loss求和 再除以batch sizeself.cost = tf.div(tf.reduce_sum(losses, name='losses_sum'),self.batch_size,name='average_cost')tf.summary.scalar('cost', self.cost)# 该函数用于计算# 相当于msr_error(self, y_pre, y_target) return tf.square(tf.sub(y_pre, y_target))def msr_error(self, logits, labels):return tf.square(tf.subtract(logits, labels))# 误差计算def _weight_variable(self, shape, name='weights'):initializer = tf.random_normal_initializer(mean=0., stddev=1.,)return tf.get_variable(shape=shape, initializer=initializer, name=name)# 偏置计算def _bias_variable(self, shape, name='biases'):initializer = tf.constant_initializer(0.1)return tf.get_variable(name=name, shape=shape, initializer=initializer)#----------------------------------主函数 训练和预测----------------------------------
if __name__ == '__main__':# 定义模型并初始化model = LSTMRNN(TIME_STEPS, INPUT_SIZE, OUTPUT_SIZE, CELL_SIZE, BATCH_SIZE)sess = tf.Session()merged = tf.summary.merge_all()writer = tf.summary.FileWriter("logs", sess.graph)sess.run(tf.initialize_all_variables())
此时会在Python文件目录下新建一个“logs”文件夹和events的文件,如下图所示。
接下来尝试打开它。首先调出Anaconda Prompt,并激活TensorFlow,接着去到events文件的目录,调用命令“tensorboard --logdir=logs运行即可,如下图所示。注意,这里只需要指引到文件夹,它就会自动索引到你的文件。
activate tensorflow
cd\
cd C:\Users\xiuzhang\Desktop\TensorFlow\blog
tensorboard --logdir=logs
此时访问网址“http://localhost:6006/”,选择“Graphs”,运行之后如下图所示,我们的神经网络就出现了。
神经网络结构如下图所示,包括输入层、LSTM层、输出层、cost误差计算、train训练等。
详细结构如下图所示:
通常我们会将train部分放置一边,选中“train”然后鼠标右键点击“Remove from main graph”。核心结构如下,in_hidden是接受输入的第一层,之后是LSTM_cell,最后是输出层out_hidden。
- in_hidden: 包括了权重Weights和biases,计算公式Wx_plus_b。同时,它包括了reshape操作,2_2D和2_3D。
- out_hidden: 包括了权重weights、偏置biases、计算公式Wx_plus_b、二维数据2_2D,并且输出结果为cost。
- cost: 计算误差。
- 中间是LSTM_cell: 包括RNN循环神经网络,初始化initial_state,之后会被state更新替换。
注意版本问题,读者可以结合自己的TensorFlow版本进行适当修改运行。作者版本版本信息为:Python3.6、Anaconda3、Win10、Tensorflow1.15.0。
如果您报错 AttributeError: module ‘tensorflow._api.v1.nn’ has no attribute ‘seq2seq’,这是TensorFlow 版本升级,方法调用更改。解决方式:
旧版 | 新版 |
---|---|
tf.nn.seq2seq.sequence_loss_by_example() | tf.contrib.legacy_seq2seq.sequence_loss_by_example |
如果您报错 TypeError: msr_error() got an unexpected keyword argument ‘labels’,msr_error() 函数得到一个意外的关键参数 ‘lables’。其解决方式:定义msr_error() 函数时,使用 labels,logits 指定,将
def msr_error(self, y_pre, y_target):return tf.square(tf.subtract(y_pre, y_target))
改为:
def msr_error(self, logits, labels):return tf.square(tf.subtract(logits, labels))
如果您报错 ValueError: Variable in_hidden/weights already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? ,则重新启动kernel即可运行。
五.预测及曲线拟合
最后,我们在主函数中编写RNN训练学习和预测的代码。
首先我们来测试cost学习的结果。代码如下,if判断中cell_init_state为前面已初始化的state,之后更新state(model.cell_init_state: state ),其实就是将Final State换成下一个batch的Initial State,从而符合我们定义的结构。
#----------------------------------主函数 训练和预测----------------------------------
if __name__ == '__main__':# 定义模型并初始化model = LSTMRNN(TIME_STEPS, INPUT_SIZE, OUTPUT_SIZE, CELL_SIZE, BATCH_SIZE)sess = tf.Session()merged = tf.summary.merge_all()writer = tf.summary.FileWriter("logs", sess.graph)sess.run(tf.initialize_all_variables())# Tensorboard可视化展现神经网络结果#------------------------------RNN学习------------------------------------- # 训练模型 for i in range(200):# 用seq预测res (序列-seq 结果-res 输入-xs)seq, res, xs = get_batch()# 第一步赋值 之后会更新cell_init_stateif i == 0:feed_dict = {model.xs: seq,model.ys: res,# create initial state (前面cell_init_state已初始化state)}else:feed_dict = {model.xs: seq,model.ys: res,model.cell_init_state: state # use last state as the initial state for this run}# state为final_state _, cost, state, pred = sess.run([model.train_op, model.cost, model.cell_final_state, model.pred], feed_dict=feed_dict)# 每隔20步输出结果if i % 20 == 0:print('cost: ', round(cost, 4))
每隔20步输出结果,如下所示,误差从最初的33到最后的0.335,神经网络在不断学习,误差在不断减小。
cost: 33.1673
cost: 9.1332
cost: 3.8899
cost: 1.3271
cost: 0.2682
cost: 0.4912
cost: 1.0692
cost: 0.3812
cost: 0.63
cost: 0.335
接下来增加matplotlib可视化的sin曲线动态拟合过程,最终完整代码如下所示:
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 9 20:44:56 2020
@author: xiuzhang Eastmount CSDN
"""
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt#----------------------------------定义参数----------------------------------
BATCH_START = 0
TIME_STEPS = 20
BATCH_SIZE = 50 # BATCH数量
INPUT_SIZE = 1 # 输入一个值
OUTPUT_SIZE = 1 # 输出一个值
CELL_SIZE = 10 # Cell数量
LR = 0.006
BATCH_START_TEST = 0# 获取批量数据
def get_batch():global BATCH_START, TIME_STEPS# xs shape (50batch, 20steps)xs = np.arange(BATCH_START, BATCH_START+TIME_STEPS*BATCH_SIZE).reshape((BATCH_SIZE, TIME_STEPS)) / (10*np.pi)seq = np.sin(xs)res = np.cos(xs)BATCH_START += TIME_STEPS # 显示原始曲线# plt.plot(xs[0, :], res[0, :], 'r', xs[0, :], seq[0, :], 'b--')# plt.show()# 返回序列seq 结果res 输入xsreturn [seq[:, :, np.newaxis], res[:, :, np.newaxis], xs]#----------------------------------LSTM RNN----------------------------------
class LSTMRNN(object):# 初始化操作def __init__(self, n_steps, input_size, output_size, cell_size, batch_size):self.n_steps = n_stepsself.input_size = input_sizeself.output_size = output_sizeself.cell_size = cell_sizeself.batch_size = batch_size# TensorBoard可视化操作使用name_scopewith tf.name_scope('inputs'): #输出变量self.xs = tf.placeholder(tf.float32, [None, n_steps, input_size], name='xs')self.ys = tf.placeholder(tf.float32, [None, n_steps, output_size], name='ys')with tf.variable_scope('in_hidden'): #输入层self.add_input_layer()with tf.variable_scope('LSTM_cell'): #处理层self.add_cell()with tf.variable_scope('out_hidden'): #输出层self.add_output_layer()with tf.name_scope('cost'): #误差self.compute_cost()with tf.name_scope('train'): #训练self.train_op = tf.train.AdamOptimizer(LR).minimize(self.cost)#--------------------------------定义核心三层结构-----------------------------# 输入层def add_input_layer(self,):# 定义输入层xs变量 将xs三维数据转换成二维# [None, n_steps, input_size] => (batch*n_step, in_size)l_in_x = tf.reshape(self.xs, [-1, self.input_size], name='2_2D')# 定义输入权重 (in_size, cell_size)Ws_in = self._weight_variable([self.input_size, self.cell_size])# 定义输入偏置 (cell_size, )bs_in = self._bias_variable([self.cell_size,])# 定义输出y变量 二维形状 (batch * n_steps, cell_size)with tf.name_scope('Wx_plus_b'):l_in_y = tf.matmul(l_in_x, Ws_in) + bs_in# 返回结果形状转变为三维# l_in_y ==> (batch, n_steps, cell_size)self.l_in_y = tf.reshape(l_in_y, [-1, self.n_steps, self.cell_size], name='2_3D')# cell层def add_cell(self):# 选择BasicLSTMCell模型# forget初始偏置为1.0(初始时不希望forget) 随着训练深入LSTM会选择性忘记lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(self.cell_size, forget_bias=1.0, state_is_tuple=True)# 设置initial_state全为0 可视化操作用name_scopewith tf.name_scope('initial_state'):self.cell_init_state = lstm_cell.zero_state(self.batch_size, dtype=tf.float32)# RNN循环 每一步的输出都存储在cell_outputs序列中 cell_final_state为最终State并传入下一个batch中# 常规RNN只有m_state LSTM包括c_state和m_stateself.cell_outputs, self.cell_final_state = tf.nn.dynamic_rnn(lstm_cell, self.l_in_y, initial_state=self.cell_init_state, time_major=False)# 输出层 (类似输入层)def add_output_layer(self):# 转换成二维 方能使用W*X+B# shape => (batch * steps, cell_size) l_out_x = tf.reshape(self.cell_outputs, [-1, self.cell_size], name='2_2D')Ws_out = self._weight_variable([self.cell_size, self.output_size])bs_out = self._bias_variable([self.output_size, ])# 返回预测结果# shape => (batch * steps, output_size)with tf.name_scope('Wx_plus_b'):self.pred = tf.matmul(l_out_x, Ws_out) + bs_out#--------------------------------定义误差计算函数----------------------------- def compute_cost(self):# 使用seq2seq序列到序列模型# tf.nn.seq2seq.sequence_loss_by_example()losses = tf.contrib.legacy_seq2seq.sequence_loss_by_example([tf.reshape(self.pred, [-1], name='reshape_pred')],[tf.reshape(self.ys, [-1], name='reshape_target')],[tf.ones([self.batch_size * self.n_steps], dtype=tf.float32)],average_across_timesteps=True,softmax_loss_function=self.msr_error,name='losses')# 最终得到batch的总cost 它是一个数字with tf.name_scope('average_cost'):# 整个TensorFlow的loss求和 再除以batch sizeself.cost = tf.div(tf.reduce_sum(losses, name='losses_sum'),self.batch_size,name='average_cost')tf.summary.scalar('cost', self.cost)# 该函数用于计算# 相当于msr_error(self, y_pre, y_target) return tf.square(tf.sub(y_pre, y_target))def msr_error(self, logits, labels):return tf.square(tf.subtract(logits, labels))# 误差计算def _weight_variable(self, shape, name='weights'):initializer = tf.random_normal_initializer(mean=0., stddev=1.,)return tf.get_variable(shape=shape, initializer=initializer, name=name)# 偏置计算def _bias_variable(self, shape, name='biases'):initializer = tf.constant_initializer(0.1)return tf.get_variable(name=name, shape=shape, initializer=initializer)#----------------------------------主函数 训练和预测----------------------------------
if __name__ == '__main__':# 定义模型并初始化model = LSTMRNN(TIME_STEPS, INPUT_SIZE, OUTPUT_SIZE, CELL_SIZE, BATCH_SIZE)sess = tf.Session()merged = tf.summary.merge_all()writer = tf.summary.FileWriter("logs", sess.graph)sess.run(tf.initialize_all_variables())# Tensorboard可视化展现神经网络结果#------------------------------RNN学习------------------------------------- # 交互模式启动plt.ion()plt.show()# 训练模型 for i in range(200):# 用seq预测res (序列-seq 结果-res 输入-xs)seq, res, xs = get_batch()# 第一步赋值 之后会更新cell_init_stateif i == 0:feed_dict = {model.xs: seq,model.ys: res,# create initial state (前面cell_init_state已初始化state)}else:feed_dict = {model.xs: seq,model.ys: res,model.cell_init_state: state # use last state as the initial state for this run}# state为final_state _, cost, state, pred = sess.run([model.train_op, model.cost, model.cell_final_state, model.pred], feed_dict=feed_dict)# plotting# 获取第一批数据xs[0,:] 获取0到20区间的预测数据pred.flatten()[:TIME_STEPS]plt.plot(xs[0, :], res[0].flatten(), 'r', xs[0, :], pred.flatten()[:TIME_STEPS], 'b--')plt.ylim((-1.2, 1.2))plt.draw()plt.pause(0.3)# 每隔20步输出结果if i % 20 == 0:print('cost: ', round(cost, 4))# result = sess.run(merged, feed_dict)# writer.add_summary(result, i)
写道这里,这篇文章终于写完了。文章非常长,但希望对您有所帮助。LSTM RNN通过一组数据预测另一组数据。预测效果如下图所示,红色的实线表示需要预测的线,蓝色的虚线表示RNN学习的线,它们在不断地逼近,蓝线学到了红线的规律,最终将蓝线基本拟合到红线上。
六.总结
本文介绍完了,更多TensorFlow深度学习文章会继续分享,接下来我们会分享监督学习、GAN、机器翻译、文本识别、图像识别、语音识别等内容。如果读者有什么想学习的,也可以私聊我,我去学习并应用到你的领域。
最后,希望这篇基础性文章对您有所帮助,如果文章中存在错误或不足之处,还请海涵~作为人工智能的菜鸟,我希望自己能不断进步并深入,后续将它应用于图像识别、网络安全、对抗样本等领域,指导大家撰写简单的学术论文,一起加油!
希望大家帮我CSDN博客之星投投票,每天可以投5票喔,谢谢大家!八年,在CSDN分享了410篇文章,15个专栏,400多万人次浏览,包括Python人工智能、数据挖掘、网络爬虫、图象处理、网络安全、JAVA网站、Android开发、LAMP/WAMP、C#网络编程、C++游戏、算法和数据结构、面试总结、人生感悟等。当然还有我和你的故事,感恩一路有你,感谢一路同行,希望通过编程分享帮助到更多人,尤其初学者,也希望学成之后回贵州教更多学生。因为喜欢,所以分享,且看且珍惜,加油!等我学成归来~(微信、QQ、微博扫二维码即可投票)
PS:这是作者的第一个付费专栏,会非常用心的去撰写,写了八年的免费文章,这也算知识付费的一个简单尝试吧!毕竟读博也不易,写文章也花费时间和精力,但作者更多的文章会免费分享。如果您购买了该专栏,有Python数据分析、图像处理、人工智能、网络安全的问题,我们都可以深入探讨,尤其是做研究的同学,共同进步~
(By:Eastmount 2020-01-10 中午13点夜于珞珈山 http://blog.csdn.net/eastmount/ )
作者theano人工智能系列:
[Python人工智能] 一.神经网络入门及theano基础代码讲解
[Python人工智能] 二.theano实现回归神经网络分析
[Python人工智能] 三.theano实现分类神经网络及机器学习基础
[Python人工智能] 四.神经网络和深度学习入门知识
[Python人工智能] 五.theano实现神经网络正规化Regularization处理
[Python人工智能] 六.神经网络的评价指标、特征标准化和特征选择
[Python人工智能] 七.加速神经网络、激励函数和过拟合
参考文献:
[1] 杨秀璋, 颜娜. Python网络数据爬取及分析从入门到精通(分析篇)[M]. 北京:北京航天航空大学出版社, 2018.
[2] “莫烦大神” 网易云视频地址
[3] https://study.163.com/course/courseLearn.htm?courseId=1003209007
[4] https://github.com/siucaan/CNN_MNIST
[5] https://github.com/eastmountyxz/AI-for-TensorFlow
[6]《机器学习》周志华
[7] Seq2Seq模型概述 - 骆旺达
[8] TensorFlow报错:TypeError: msr_error() got an unexpected keyword argument ‘labels’ - 痴迷、淡然
[9] 深度学习(07)RNN-循环神经网络-02-Tensorflow中的实现 - 莫失莫忘Lawlite
[10] http://www.lawlite.me/2018/10/16/Triplet-Loss原理及其实现/ - 强推 大神
[11] http://www.lawlite.me/2018/02/28/风格迁移Style-transfer/ - 强推 大神
[12] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.56.7941&rep=rep1&type=pdf
[13] https://github.com/lawlite19/DeepLearning_Python
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- Java基础-Map集合(HashMap,)
HashMap 注:底层是由数组和链表组合构成的数据结构,数组中每一个元素都是key-value形式且数组长度是有限的,在有限的长度里面我们使用哈希,哈希本身就存在概率性,就存在hash冲突问题,出现冲突时采用链表的方式把hash冲突的元素链接起来,每一个节点都会保存自身的hash、k…...
2024/4/12 2:48:37 - 20180330_Tomcat 报 The valid characters are defined in RFC 7230 and RFC 3986
经了解,这个问题是高版本tomcat中的新特性:就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # […...
2024/5/2 16:18:18 - 洛谷 P3377 【模板】左偏树(可并堆) 左偏树
https://www.luogu.com.cn/problem/P3377 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数在用一个堆内,则无视此操作) 操作2: 2 x 输出…...
2024/4/20 9:14:22 - 安装配置elasticsearch及kibana使用
1 es相关介绍1 搜索引擎elasticSearch6(和elasticSearch5的区别在于,root用户权限、一个库能否建立多个表)2 搜索引擎文本搜索(以空间换时间算法)于同类产品相比(solr、hermes),和solr一样都是基于lucene(apache),默认以集群方式工作搜索引擎(以百度和goole为例)的工作原理…...
2024/3/29 12:22:31 - mysql主从复制之半同步复制模式
mysql主从复制之半同步复制模式1.异步复制1、逻辑上MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从库上,如果此时,强…...
2024/3/29 12:22:30 - ie10图片有蓝色的边框
设置img:{border:0} 就可以完美的解决这个问题。...
2024/3/29 12:22:29 - TextCNN(文本分类)
TextCNN网络结构如图所示:利用TextCNN做文本分类基本流程(以句子分类为例):(1)将句子转成词,利用词建立字典(2)词转成向量(word2vec,Glove,bert,nn.embedding)(3)句子补0操作变成等长(4)建TextCNN模型,训练,测试TextCNN按照流程的一个例子。1,预测结果不是…...
2024/4/7 1:29:30 - vue: 新修改element-ui的样式
element-ui样式是很难修改的。修改表格滚动条样式<el-table:data="tableData"height="250"borderclass="your-table"style="width: 100%"><el-table-columnprop="date"label="日期"width="180"…...
2024/4/17 13:18:35 - 显卡驱动与cuda、cudnn之间的关系
概述,需要注意以下几个问题:(1)NVIDIA的显卡驱动程序和CUDA完全是两个不同的概念哦!CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。CUDA的本质是一个工具包…...
2024/5/1 4:41:27 - mysql连接错误 springboot yml java.sql.SQLException: com.mysql.jdbc.Driver
在springboot中配置yml文件时,配置了数据库mysql的连接,结果启动报错:java.sql.SQLException: com.mysql.jdbc.Driverorg.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLNonTransientConnection…...
2024/4/27 12:16:20 - vsCode离线安装remote-ssh插件搭建远程开发环境
https://mp.weixin.qq.com/s/n7zyDFOeHd9K5oSKz7Zg9Q...
2024/4/7 1:44:50 - Centos7开放及查看端口
1、开放端口 firewall-cmd --zone=public --add-port=5672/tcp --permanent # 开放5672端口 firewall-cmd --zone=public --remove-port=5672/tcp --permanent #关闭5672端口 firewall-cmd --reload # 配置立即生效2、查看防火墙所有开放的端口 firewall-cmd --zone=publi…...
2024/4/21 1:27:01 - BOM操作笔记6:使用document对象(JavaScript)
访问文档对象 浏览器在加载文档时,会自动构建文档对象模型,把文档中同类元素对象对象映射到一个集合中,然后以document对象属性的形式允许用户访问。 这些集合都是HTMLCollection对象,为访问文档常用对象提供了快捷方式。document.anchors:返回文档中所有Anchor对象,即所…...
2024/3/29 7:51:43 - .net core不支持gb2312编码的问题
在用net core写爬虫的时候,发现默认不再支持gb2312编码了:解决方案如下:1,引入System.Text.Encoding.CodePages:2,在需要的地方注册EncodingProvider的方法;3,调用 Encoding.GetEncoding("GB2312").GetString(pageSource);public void CityCrawler(string al…...
2024/3/29 7:51:44 - (多核DSP快速入门)1.创建简单的多核DSP项目HelloWorld
原创文章 转载请注册来源http://blog.csdn.net/tostq教程目录:http://blog.csdn.net/tostq/article/details/51245979 本节我们将运行第一个多核DSP程序,熟悉CCS开发环境,学会使用CCS调试工具,主要内容如下: (1)新建CCS项目 (2)导入Target 仿真模块 (3)使用调试工具…...
2024/4/27 21:46:40 - token验证机制
https://www.cnblogs.com/mahmud/p/11444180.html...
2024/3/29 7:51:40 - IDEA显示多项目启动service界面
在workspace.xml文件中增加/替换RunDashboard即可显示service界面...
2024/3/29 8:07:10 - Java8 Stream,List转Map遇到key冲突问题-java.lang.IllegalStateException: Duplicate key
在使用Stream把List转化为Map的时候,抛出了java.lang.IllegalStateException: Duplicate key异常,原因在于生成Map的key出现冲突。查看如下代码:当我们根据猫的名字创建名称Map的时候,发现有2个相同的cat2,导致了产生IllegalStateException异常package com.bytrees.test;i…...
2024/4/20 2:59:10 - 6-2 多项式求值 (15分)
本题要求实现一个函数,计算阶数为n,系数为a[0] … a[n]的多项式f(x)=∑ i=0 n (a[i]x i ) 在x点的值。 函数接口定义: double f( int n, double a[], double x );其中n是多项式的阶数,a[]中存储系数,x是给定点。函数须返回多项式f(x)的值。 裁判测试程序样…...
2024/4/30 20:18:11 - oracle数据库查看树结构
select *from wd_dept connect by prior id=parent_dept_id start with id=‘4028810a6d13c741016d13e9c9410003’;//父取子 select *from wd_dept connect by prior id=parent_dept_id start with parent_dept_id=‘4028810a6d13c741016d13e9c9410003’; select *from wd_dept…...
2024/3/29 12:22:20
最新文章
- Docker的存储管理详解
引言 Docker的存储管理涉及容器数据的持久化、卷(Volumes)的使用、存储驱动的选择以及容器数据的备份与恢复等方面。在构建和运行Docker容器时,理解和管理容器的存储是非常重要的,因为它直接关系到数据的安全性、可移植性和容器的…...
2024/5/2 18:26:12 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - java学习之线程池
java线程池优点: 降低线程创建和销毁的开销,提高系统性能。 提高线程的利用率和系统的吞吐量。 统一线程的管理和监控,避免线程泄漏和线程安全问题。 支持任务队列和拒绝策略等机制,提供灵活的任务调度和任务处理能力。 并不…...
2024/4/30 7:48:43 - vue3项目运行正常但vscode红色波浪线报错
以下解决办法如不生效,可尝试 重启 vscode 一、Vetur插件检测问题 vetur 是一个 vscode 插件,用于为 .vue 单文件组件提供代码高亮以及语法支持。但 vue 以及 vetur 对于 ts 的支持,并不友好。 1、原因 如下图:鼠标放到红色波浪…...
2024/5/1 13:10:52 - python爬取B站视频
参考:https://cloud.tencent.com/developer/article/1768680 参考的代码有点问题,请求头需要修改,上代码: import requests import re # 正则表达式 import pprint import json from moviepy.editor import AudioFileClip, Vid…...
2024/5/2 17:25:40 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/1 17:30:59 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/2 16:16:39 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/2 9:28:15 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/2 15:04:34 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/2 9:07:46 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57