• 假期续命充电——简单上手tesorflow2 框架


    谈到深度学习,就不得不谈到tensorflow

    在tensorflow之后出了2.0版本,相比之前有了很大的改变,趁着假期赶紧冲冲冲!

    稍微学习了一些基础,做一个自我总结,作为一些基础的知识不再过多重复,有需要的自己上网查询。

    写了一些代码,尽可能给出了必要的注释,具体的数学知识或者环境、运行问题欢迎留言讨论

    使用语言为python 3.x

    1.梯度下降

    # 深度学习中不用担心局部极值点
    # model.compile(optimizer='adam', loss='mse')中 optimizaer = 'adam'就是用了这样的优化方式

    2.线性回归

    import tensorflow as tf
    import pandas as pd
    import matplotlib.pyplot as plt

    data = pd.read_csv("education_income.csv")
    print("**** ", data)
    x = data.Education
    y = data.Income
    # 可视化数据
    plt.title('la')
    plt.xlabel("xxx")
    plt.ylabel("yyy")
    plt.plot(x, y, "ob")
    plt.show()
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(1, input_shape=(1,))) # dense里面(输出数据的维度,输入数据的形状,注意要有1,)
    model.summary() #反应这个模型的基本情况,上面这个模型就是将(1,)的数据最后输出为一维数据,即y=ax+b
    # 配置模型
    model.compile(optimizer='adam', loss='mse') #优化方法,损失函数
    # 编译模型
    history = model.fit(x, y, epochs=5000)
    # 使用模型预测现有的值
    model.predict(x)
    # 预测未知的值,输入series是所以里面写成这样
    model.predict(pd.Series([20]))

    3.多层感知器

    import tensorflow as tf
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt

    data = pd.read_csv('xxxxxx.csv')
    x = data.iloc[:, 1:-1] # 除去第一列和最后一列
    y = data.iloc[:, -1] # 取到最后一列
    # 建立模型
    model = tf.keras.Sequential([tf.keras.layers.Dense(10, input_shape=(3,),activation='relu')], )
    # dense就是隐含层,这里设置了10,inputshape是输入的数据的规格,activation是激活函数
    # 配置模型
    model.compile(optimizer='adam', loss='mse') #优化方法,损失函数
    model.fit(x,y,epochs=100) # 编译模型

    # 使用模型预测现有的值
    model.predict(x)
    # 预测未知的值,输入series是所以里面写成这样
    model.predict(pd.Series([20]))

    test = data.iloc[:10,1:-1] #设置一个test,取他的前十个
    model.predict(test) #这个是对应的预测值
    test = data.iloc[:10, -1] #这个是实际的test值

    4.逻辑回归

    '''
    平方差所惩罚的是与损失同一数量级的情形
    二对于分类问题,最好使用交叉熵损失函数(输出更大)
    tf.keras 中我们用到的是binary_crossentropy
    '''

    import tensorflow as tf
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt

    data = pd.read_csv('xxxx.csv') #一共16列前十五列是数据,这里的数据最后一列是1和-1的结果值
    data.iloc[:,-1].value_counts() #查看最后一列的数据分布情况

    x = data.iloc[:,:-1]
    y = data.iloc[:,-1].replace(-1,0) # 把最后一列的数据中的-1替换成0

    model = tf.keras.Sequential()# 顺序模型
    model.add(tf.keras.layers.Dense(4,input_shape(15,),activation='relu'))
    model.add(tf.keras.layers.Dense(4,activation='relu')) #再加上一层隐含层,不必再去输入shape的格式他会自己去推断
    model.add(tf.keras.layers.Dense(1,activation='sigmoid')) #定义了输出层的结构,输出的维度为一

    model.summary()

    # 编译模型
    model.compile(optimizer='adam',loss='binary_crossentropy',metrics='acc')
    # 这里每次进行云散时,损失函数是交叉熵,每一次计算的时候求acc(accurary准确率)

    #训练
    history = model.fit(x,y,epochs=100)

    history.history.keys()# 现实的是记录的模型数据,这里是lss和acc的值
    plt.plot(history.epoch, history.get('loss'))
    plt.plot(history.epoch, history.get('acc'))

    5.softmax分类

    '''
    平方差所惩罚的是与损失同一数量级的情形
    二对于分类问题,最好使用交叉熵损失函数(输出更大)
    tf.keras 中我们用到的是binary_crossentropy
    '''

    import tensorflow as tf
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt

    data = pd.read_csv('xxxx.csv') #一共16列前十五列是数据,这里的数据最后一列是1和-1的结果值
    data.iloc[:,-1].value_counts() #查看最后一列的数据分布情况

    x = data.iloc[:,:-1]
    y = data.iloc[:,-1].replace(-1,0) # 把最后一列的数据中的-1替换成0

    model = tf.keras.Sequential()# 顺序模型
    model.add(tf.keras.layers.Dense(4,input_shape(15,),activation='relu'))
    model.add(tf.keras.layers.Dense(4,activation='relu')) #再加上一层隐含层,不必再去输入shape的格式他会自己去推断
    model.add(tf.keras.layers.Dense(1,activation='sigmoid')) #定义了输出层的结构,输出的维度为一

    model.summary()

    # 编译模型
    model.compile(optimizer='adam',loss='binary_crossentropy',metrics='acc')
    # 这里每次进行云散时,损失函数是交叉熵,每一次计算的时候求acc(accurary准确率)

    #训练
    history = model.fit(x,y,epochs=100)

    history.history.keys()# 现实的是记录的模型数据,这里是lss和acc的值
    plt.plot(history.epoch, history.get('loss'))
    plt.plot(history.epoch, history.get('acc'))

    6.优化函数、学习速率、反向传播

    '''
    梯度下降输出响亮是损失函数增长最快的方向
    梯度就是表明损失函数相对参数的变化率

    对提督缩放的参数称为学习速率,超参数或者手工呢配置,太小会需要很多迭代,太大会跳过极值点(永远到不了)
    调整学习速率,要足够小不超调,又要足够大尽快完成学习

    多层时,反向传播返回
    逐一计算隐含层的输出,计算导数,对已经完成计算的元素进行复用

    optimizer ->传人model.compile中,也可以直接再后者中命令
    常见的优化函数:
    SGD:随即梯度下降优化器
    RNSprop: 常用语 序列化的函数,序列预测,rnn lr学习速率rho提督平方的移动平均衰减率epsilon模糊因子decay参数跟新后学习速率衰减值
    Adam :学习率建议0。001
    '''

    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate = 0.001))

    7.网络优化和超参数选择

    '''
    增加神经元或者层数(徐年速度难度大,易过拟合)

    '''

    history = model.fit(train_image,train_label_onehot,epochs=5,validation_data =(test_image,test_label_onehot)) #后面那个的作用就是再test中验证每一次循环中的准确率

    '''
    dropout避免过拟合
    参数选择原则:先开发一个过拟合(添加跟多层,每一层跟大,训练更多轮次))
    再抑制过拟合(dropout,正则化、图像增强),最好的办法还是增加训练样本
    调节超惨数(学习速率、隐藏单元数、训练轮次) 传统机器学习有特征工程、增加训练数据、交叉验证等等


    总的原则:1增大网络容量直到过拟合 2采取措施抑制过拟合 3重复第一个步骤
    '''
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Flatten(input_shape=(28,28))) # flatten的作用就是将而为的数据降到以为当中来
    model.add(tf.keras.layers.Dense(128,activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5)) #这里就是每一次丢弃50%随机丢弃
    model.add(tf.keras.layers.Dense(128,activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(128,activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(10,activation='softmax'))

    # 也可以减少网络规模(单元层),128变成32隐藏单元数
    model.add(tf.keras.layers.Dense(32,activation='relu'))


    8.函数式API

    import tensorflow as tf
    import tensorflow as keras
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt

    # fashion_mnist数据集可以直接用tensorflow加载,label用数字代表服装的类别
    (train_image,train_label),(test_image,test_label) = tf.keras.datasets.fashion_mnist.load_data

    # 归一化
    train_image = train_image/255
    test_image = test_image/255


    # 函数层API 建模
    #train_images.shape
    input = keras.Input(shape=(28,28))
    x = keras.layers.Flatten()(input)
    x = keras.layers.Dense(32,activation = 'relu')(x) # 在x上面增加一层
    x = keras.layers.Dropout(0.5)
    x = keras.layers.Dense(64,activation = 'relu')(x)
    output = keras.layers.Dense(10,activation = 'softmax')(x)

    model = keras.Model(input,outputs = output)
    # model.summary


    # 可以进行多输入 input1 input2
    input1 = keras.Input(shape=(28,28))
    input2 = keras.Input(shape=(28,28))
    x1 = keras.layers.Flatten()(input1)
    x2 = keras.layers.Flatten()(input2)
    x = keras.layers.concatenate([x1,x2])
    x = keras.layers.Dense(32,activation = 'relu')(x) # 在x上面增加一层
    x = keras.layers.Dropout(0.5)
    x = keras.layers.Dense(64,activation = 'relu')(x)
    output = keras.layers.Dense(10,activation = 'sigmold')(x) # 逻辑回归的问题用sigmold

    model = keras.Model([input1,input2],outputs = output)

    看到这里,一般对于基本的tensorflow2的用法有了一定的基础,剩下的我也还在学习

    这里给一些参考网址

     https://tensorflow.google.cn/tutorials/structured_data/time_series

    https://www.jianshu.com/p/599c79c3a537

  • 相关阅读:
    练习10.9-2
    [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )
    JAVA成员变量为什么不能在类体中先定义后赋值
    core image几个滤镜样例 oc版本号和swift版本号
    UVa 11997 K Smallest Sums 优先队列&&打有序表&&归并
    Android基础新手教程——4.4.1 ContentProvider初探
    Restore IP Addresses -- LeetCode
    Android中Intent传递类对象的方法一(Serializable)
    Effective C++:条款22:将成员变量声明为private
    javascript cookie
  • 原文地址:https://www.cnblogs.com/xingnie/p/12209762.html
Copyright © 2020-2023  润新知