• Keras + LSTM 做回归demo


    学习神经网络

    想拿lstm 做回归, 网上找demo 基本三种: sin拟合cos 那个, 比特币价格预测(我用相同的代码和数据没有跑成功, 我太菜了)和keras 的一个例子

    我基于keras 那个实现了一个, 这里贴一下我的代码.

    import numpy as np
    np.random.seed(1337)
    from sklearn.model_selection import train_test_split
    import matplotlib.pyplot as plt
    import keras
    from keras.models import Sequential
    from keras.layers import Activation
    from keras.layers import LSTM
    from keras.layers import Dropout
    from keras.layers import Dense
    

      

    # 数据的数量
    datan = 400
    X = np.linspace(-1, 2, datan)
    np.random.shuffle(X)
    # 构造y  y=3*x + 2 并加上一个0-0.5 的随机数
    Y = 3.3 * X + 2 + np.random.normal(0, 0.5, (datan, ))
    # 展示一下数据
    plt.scatter(X, Y)
    plt.show()
    

      

    # 训练集测试集划分 2:1
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33, random_state=42)
    

      

    # 一些参数
    neurons = 128 
    activation_function = 'tanh'   # 激活函数
    loss = 'mse'  # 损失函数
    optimizer="adam"  # 优化函数      
    dropout = 0.01 
    

      

    model = Sequential()
    
    model.add(LSTM(neurons, return_sequences=True, input_shape=(1, 1), activation=activation_function))
    model.add(Dropout(dropout))
    model.add(LSTM(neurons, return_sequences=True, activation=activation_function))
    model.add(Dropout(dropout))
    model.add(LSTM(neurons, activation=activation_function))
    model.add(Dropout(dropout))
    model.add(Dense(output_dim=1, input_dim=1))
    #
    model.compile(loss=loss, optimizer=optimizer)
    

      

    # training 训练
    print('Training -----------')
    epochs = 2001
    for step in range(epochs):
        cost = model.train_on_batch(X_train[:, np.newaxis, np.newaxis], Y_train)
        if step % 30 == 0:
            print(f'{step} train cost: ', cost)
    

      

    # 测试
    print('Testing ------------')
    cost = model.evaluate(X_test[:, np.newaxis, np.newaxis], Y_test, batch_size=40)
    print('test cost:', cost)
    

      

    # 打印预测结果
    Y_pred = model.predict(X_test[:, np.newaxis, np.newaxis])
    plt.scatter(X_test, Y_test)
    plt.plot(X_test, Y_pred, 'ro')
    plt.show()
    

      


    loss_history = {}
    def run(X_train, Y_train, X_test, Y_test, epochs, activation_func='tanh', loss_func='mse', opt_func='sgd'):
        """
      这里是对上面代码的封装, 我测试了一下各种优化函数的效率
        可用的目标函数
            mean_squared_error或mse
            mean_absolute_error或mae
            mean_absolute_percentage_error或mape
            mean_squared_logarithmic_error或msle
            squared_hinge
            hinge
            categorical_hinge
            binary_crossentropy(亦称作对数损失,logloss)
            logcosh
            categorical_crossentropy:亦称作多类的对数损失,注意使用该目标函数时,需要将标签转化为形如(nb_samples, nb_classes)的二值序列
            sparse_categorical_crossentrop:如上,但接受稀疏标签。注意,使用该函数时仍然需要你的标签与输出值的维度相同,你可能需要在标签数据上增加一个维度:np.expand_dims(y,-1)
            kullback_leibler_divergence:从预测值概率分布Q到真值概率分布P的信息增益,用以度量两个分布的差异.
            poisson:即(predictions - targets * log(predictions))的均值
            cosine_proximity:即预测值与真实标签的余弦距离平均值的相反数
        优化函数
            sgd
            RMSprop
            Adagrad
            Adadelta
            Adam
            Adamax
            Nadam
        """
        mdl = Sequential()
        mdl.add(LSTM(neurons, return_sequences=True, input_shape=(1, 1), activation=activation_func))
        mdl.add(Dropout(dropout))
        mdl.add(LSTM(neurons, return_sequences=True, activation=activation_func))
        mdl.add(Dropout(dropout))
        mdl.add(LSTM(neurons, activation=activation_func))
        mdl.add(Dropout(dropout))
        mdl.add(Dense(output_dim=1, input_dim=1))
        #
        mdl.compile(optimizer=opt_func, loss=loss_func)
        #
        print('Training -----------')
        loss_history[opt_func] = []
        for step in range(epochs):
            cost = mdl.train_on_batch(X_train[:, np.newaxis, np.newaxis], Y_train)
            if step % 30 == 0:
                print(f'{step} train cost: ', cost)
                loss_history[opt_func].append(cost)
        # test
        print('Testing ------------')
        cost = mdl.evaluate(X_test[:, np.newaxis, np.newaxis], Y_test, batch_size=40)
        print('test cost:', cost)
        #
        Y_pred = mdl.predict(X_test[:, np.newaxis, np.newaxis])
        plt.scatter(X_test, Y_test)
        plt.plot(X_test, Y_pred, 'ro')
        return plt
    

      

    run(X_train, Y_train, X_test, Y_test, 2000)
    run(X_train, Y_train, X_test, Y_test, 2000, opt_func='Adagrad')
    run(X_train, Y_train, X_test, Y_test, 2000, opt_func='Nadam')
    run(X_train, Y_train, X_test, Y_test, 2000, opt_func='Adadelta')
    run(X_train, Y_train, X_test, Y_test, 2000, opt_func='RMSprop')
    run(X_train, Y_train, X_test, Y_test, 2000, opt_func='Adam')
    run(X_train, Y_train, X_test, Y_test, 2000, opt_func='Adamax')
    
    #
    arr = [i*30 for i in range(len(loss_history['sgd']))]
    plt.plot(arr, loss_history['sgd'], 'b--')
    plt.plot(arr, loss_history['RMSprop'], 'r--')
    plt.plot(arr, loss_history['Adagrad'], color='orange', linestyle='--')
    plt.plot(arr, loss_history['Adadelta'], 'g--')
    plt.plot(arr, loss_history['Adam'], color='coral', linestyle='--')
    plt.plot(arr, loss_history['Adamax'], color='tomato', linestyle='--')
    plt.plot(arr, loss_history['Nadam'], color='darkkhaki', linestyle='--')
    plt
    

    最快的是 adadelta, 最慢的sgd. 其他差不多.

  • 相关阅读:
    模块化、结构化的代码,何尝不是在讲人生
    DOS操作文件或文件夹
    OSQL
    DOS 命令大全
    Red Tea
    SetInterval_1
    SetInterval
    分库分表——Sharding-Sphere
    线上redis热key问题
    线上redis bgsave导致服务响应延迟
  • 原文地址:https://www.cnblogs.com/fadedlemon/p/10529966.html
Copyright © 2020-2023  润新知