美文网首页
tensorflow seq2seq 预测sin(x)

tensorflow seq2seq 预测sin(x)

作者: DaydayHoliday | 来源:发表于2019-02-27 14:41 被阅读0次

    问题定义:seq2seq是否可以找到时序数据中的周期性呢?说实话刚开始感觉应该是不可以的。但实验结果表明还好。
    定义:

    T=np.arange(2000)*0.05
    X=np.sin(T)*10
    

    这样X大概长这样:


    image.png

    为了增加挑战的趣味性,我们让训练集的trainX的长度是不固定的:为[1000,1600)的随机数。trainY就是trainX接下来的200个。

    我们的目标就是看看,通过这样的训练,能否让神经网络以X的前1800个数为输入,来预测出之后的200个。

    直接上代码

    '''
    Created on 2019年2月25日
    
    @author: xiezhipu
    '''
    
    import numpy as np
    import matplotlib.pyplot as plt
    import tensorflow as tf
    from tensorflow.python.layers import core as layers_core
    import sonnet as snt
    
    config = tf.ConfigProto()
     
    # 配置GPU内存分配方式,按需增长,很关键
    config.gpu_options.allow_growth = True
     
    # 配置可使用的显存比例
    config.gpu_options.per_process_gpu_memory_fraction = 0.1
    
    T=np.arange(2000)*0.05
    X=np.sin(T)*10
    
    YLEN=200
    
    print(YLEN)
    
    def generateTrain(records=1000):
        trainXs=[]
        trainYs=[]
        XLens=[]
        YLens=[]
        for i in range(records):
            xi=X[:1800].copy()
            sepre=np.random.randint(1000,1600)
            xi[sepre::]=0
            yi=X[sepre:sepre+YLEN].copy()
            trainXs.append(np.expand_dims(xi,axis=0))
            trainYs.append(np.expand_dims(yi,axis=0))
            XLens.append(sepre)
            YLens.append(YLEN)
        trainX=np.concatenate(trainXs,axis=0)
        trainY=np.concatenate(trainYs,axis=0)
        seqLen=np.array(XLens)
        outLen=np.array(YLens)
        return (trainX,trainY,seqLen,outLen)
    
    def generateTest():
        xi=X[:1800].copy()
        yi=X[1800:1800+YLEN].copy()
        testX=np.expand_dims(xi, axis=0)
        testY=np.expand_dims(yi, axis=0)
        seqLen_test=np.array([1800])
        outLen_test=np.array([YLEN])
        return (testX,testY,seqLen_test,outLen_test)
    
    x=tf.placeholder(tf.float32, [None,1800])
    
    yTrue=tf.placeholder(tf.float32,[None,YLEN])
    
    seq_len=tf.placeholder(tf.float32,[None,])
    
    out_len=tf.placeholder(tf.int32,[None,])
    
    cell = tf.contrib.rnn.BasicLSTMCell(num_units=8)
    
    x_exp=tf.expand_dims(x,-1)
    
    outputs, encoder_state = tf.nn.dynamic_rnn(
        cell=cell,
        dtype=tf.float32,
        sequence_length=seq_len,
        inputs=x_exp)
    
    # Build RNN cell
    decoder_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=8)
    
    #output_layer = layers_core.Dense(self.num_emb, use_bias=False)
    
    decoder_emb_inp=tf.expand_dims(yTrue,-1)
    
    #decoder_lengths=tf.ones(1000)*200
    
    output_layer = layers_core.Dense(1, use_bias=True)
    
    # Helper
    helper = tf.contrib.seq2seq.TrainingHelper(
        outputs, out_len)
    # Decoder
    decoder = tf.contrib.seq2seq.BasicDecoder(
        decoder_cell, helper, encoder_state,
        output_layer=output_layer)
    # Dynamic decoding
    
    outputs = tf.contrib.seq2seq.dynamic_decode(decoder)
    
    outputs = tf.squeeze(outputs[0][0])
    
    lossfun=tf.reduce_mean(tf.square(outputs-yTrue))
    
    train_step=tf.train.AdamOptimizer(learning_rate=0.015).minimize(lossfun)
    
    #logits = outputs.rnn_output
    
    testX,testY,seqLen_test,outLen_test=generateTest()
    
    plt.ion() #开启interactive mode
    plt.plot(testY[0])
    plt.pause(1)
    #plt.show()
    
    with tf.Session(config = config) as sess:
        init = tf.global_variables_initializer()
        sess.run(init)
        for i in range(int(1e5)):
            trainX,trainY,seqLen,outLen=generateTrain()
            _,loss = sess.run([train_step,lossfun],feed_dict={x:trainX,yTrue:trainY,seq_len:seqLen,out_len:outLen})
            print(loss)
            if i%100==99:
                res,loss=sess.run([outputs,lossfun],feed_dict={x:testX,yTrue:testY,seq_len:seqLen_test,out_len:outLen_test})
                print(res.shape)
                print(res)
                print(loss)
                plt.figure()
                plt.plot(testY[0])
                plt.plot(res)
                plt.pause(1)
                plt.savefig('res'+str(i)+'.png')
    

    效果图:

    image.png

    蓝的是真实值,橙色是预测值。

    各位帮忙看看,代码有问题,或者设定有问题,请指出来,多谢

    相关文章

      网友评论

          本文标题:tensorflow seq2seq 预测sin(x)

          本文链接:https://www.haomeiwen.com/subject/whqfuqtx.html