tensorflow入門の訓練簡単なニューラルネットワーク


ここ数日からtensorflowを勉強して、まず勉強の記録をします.ニューラルネットワークの問題解決手順:1.問題内のエンティティの特徴ベクトルをニューラルネットワークの入力として抽出する.すなわち,データセットを特徴工学し,各サンプルの特徴次元を知り,入力ニューロンの個数を定義する.2.ニューラルネットワークの構造を定義し、ニューラルネットワークの入力から出力する方法を定義する.すなわち、入力レイヤ、非表示レイヤ、および出力レイヤを定義します.3.ニューラルネットワークを訓練するプロセスであるトレーニングデータによってニューラルネットワークにおけるパラメータの値を調整する.一般にモデルの損失関数を定義し,交差エントロピー損失関数や勾配降下法の最適化などのパラメータ最適化法を用いる.4.訓練されたモデルを用いて未知のデータを予測する.つまりモデルの良し悪しを評価する.
二.訓練が簡単な前にニューラルネットワークを伝播して訓練するニューラルモデルは最も簡単な類で、しかも線形で(つまり活性化関数で線形話をしていない)、逆伝播の過程がなくて、ただ簡単にニューラルネットワークの仕事の流れを説明します.
import tensorflow as tf

#       ,  w     tensor(     n*m   ,n         ,m        )             ,         
w1=tf.Variable(tf.random_normal([2,3],stddev=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1))

#           ,   x  ,  shape             ,             
x=tf.placeholder(tf.float32,shape=(None,2),name="input")
#    
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)

with tf.Session() as sess:
    #                    
    init_op=tf.initialize_all_variables()
    sess.run(init_op)
    #feed_dict   y  x    ,    3 , y     3*1 tensor
    print(sess.run(y,feed_dict={x:[[0.7,0.9],[1.0,1.5],[2.1,2.3]]}))

これで、xの各次元に2層の重みを乗算した後、単一の線形ニューラルネットワークを出力することが定義される.
三.損失関数の定義と逆伝搬アルゴリズムには上記の基礎があり,損失関数と逆伝搬アルゴリズムを定義してデータにフィットすることができ,非線形データは活性化関数の線形化を定義することができる.いくつかの細部は学習率の問題で、今回は動的学習率を使用して、まず学習率を比較的大きい値に設定して、収束を加速して、それから反復回数の増加に従って、学習率は絶えず下がって、局部の最小値を逃すことを防止します.もう一つの問題は、フィットを防ぐことです.一般的なニューラルネットワークがフィッティングを防止する戦略は2つあり,1つは正規化であり,1つはdropoutであり,後者についてはしばらく議論しない
損失関数:クロスエントロピー逆伝搬アルゴリズム:勾配降下法活性化関数:relu
# -*- coding: utf-8 -*-
"""
Created on Fri Aug 18 14:02:19 2017

@author: osT
"""

import tensorflow as tf 
import numpy as np

#    ,               ,             ,0-32  33  
data=np.loadtxt('train_data.txt',dtype='float',delimiter=',')

#            
def label_change(before_label):
    label_num=len(before_label)
    change_arr=np.zeros((label_num,33))
    for i in range(label_num):
        #        0-32 ,     32   33
        if before_label[i]==33.0:
            change_arr[i,int(before_label[i]-1)]=1
        else:
            change_arr[i,int(before_label[i])]=1
    return change_arr



#             ,     1*315 ,        
INPUT_NODE=315
OUTPUT_NODE=33

#            ,  300   ,  100   
LAYER1_NODE=300
LAYER2_NODE=100

#     ,       ,    ,                
LEARNING_RATE_BASE=0.5
LEARNING_RATE_DECAY=0.99
REGULARIZATION_RATE=0.0001
TRAINING_STEPS=2000
MOVING_AVERAGE_DECAY=0.99


#           ,          ,avg_class         ,         
def inference(input_tensor,avg_class,w1,b1,w2,b2,w3,b3):
    if avg_class==None:
        #      ,                       
        layer1=tf.nn.relu(tf.matmul(input_tensor,w1)+b1)
        #      ,                     
        layer2=tf.nn.relu(tf.matmul(layer1,w2)+b2)
        #                       
        return tf.matmul(layer2,w3)+b3
    else:
        #avg_class.average()      ,             
        layer1=tf.nn.relu(tf.matmul(input_tensor,avg_class.average(w1))+avg_class.average(b1))
        layer2=tf.nn.relu(tf.matmul(layer1,avg_class.average(w2))+avg_class.average(b2))
        return tf.matmul(layer2,avg_class.average(w3))+avg_class.average(b3)

def train(data):
    #    
    np.random.shuffle(data)
    #  850        ,         , 250 
    data_train_x=data[:850,:315]
    data_train_y=label_change(data[:850,-1])
    data_test_x=data[850:,:315]
    data_test_y=label_change(data[850:,-1])

    #         ,None               ,y_          
    x=tf.placeholder(tf.float32,shape=[None,INPUT_NODE],name='x-input')
    y_=tf.placeholder(tf.float32,shape=[None,OUTPUT_NODE],name='y-input')

    #              ,         ,  shape     
    w1=tf.Variable(tf.truncated_normal(shape=[INPUT_NODE,LAYER1_NODE],stddev=0.1))
    b1=tf.Variable(tf.constant(0.1,shape=[LAYER1_NODE]))

    w2=tf.Variable(tf.truncated_normal(shape=[LAYER1_NODE,LAYER2_NODE],stddev=0.1))
    b2=tf.Variable(tf.constant(0.1,shape=[LAYER2_NODE]))

    w3=tf.Variable(tf.truncated_normal(shape=[LAYER2_NODE,OUTPUT_NODE],stddev=0.1))
    b3=tf.Variable(tf.constant(0.1,shape=[OUTPUT_NODE]))

    #         
    y=inference(x,None,w1,b1,w2,b2,w3,b3)

    #             
    global_step=tf.Variable(0,trainable=False)

    #        ,         global_stop                
    variable_averages=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
    #              , trainable=True   
    variable_averages_op=variable_averages.apply(tf.trainable_variables())

    #         
    average_y=inference(x,variable_averages,w1,b1,w2,b2,w3,b3)

    #          ,        label arg_max(),          ,      
    cross_entropy=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.arg_max(y_,1))
    #         ,                  
    cross_entrip_mean=tf.reduce_mean(cross_entropy)

    #       ,              
    regularizer=tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE)
    regularization=regularizer(w1)+regularizer(w2)+regularizer(w3)
    loss=cross_entrip_mean+regularization

    #       ,             
    learning_rate=tf.train.exponential_decay(LEARNING_RATE_BASE,global_step,900,LEARNING_RATE_DECAY)
    #         ,     ,     minimize   global_step
    train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
    #         ,                  
    train_op=tf.group(train_step,variable_averages_op)

    #     
    correct_prediction=tf.equal(tf.arg_max(average_y,1),tf.arg_max(y_,1))
    accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

    with tf.Session() as sess:
        #      
        tf.global_variables_initializer().run()
        #       
        validate_feed={x:data_train_x,y_:data_train_y}
        #       
        test_feed={x:data_test_x,y_:data_test_y}

        for i in range(TRAINING_STEPS):
            if i%1000==0:
                validate_acc=sess.run(accuracy,feed_dict=validate_feed)
                print("After %d training step(s),validation accuracy using average model is %g"%(i,validate_acc))
            #            ,      ,    
            sess.run(train_op,feed_dict=validate_feed)
        #            
        test_acc=sess.run(accuracy,feed_dict=test_feed)
        print("After %d training step(s),test accuracy using average model is %g"%(TRAINING_STEPS,test_acc))

train(data)

次に、クロスエントロピーを計算するときにサンプルに入力する理由を見てみましょう.まず、出力ノードが33個あることを知っています.前の重みに乗算すると、各ノードに出力があります.各出力は、各クラスに対応する確率と考えられます.この値が大きいほど、サンプルが対応するクラスだと考えられます.logitsパラメータはニューラルネットワークの直接出力、すなわちsoftmax関数で処理されていない出力であり、labelsが伝達するのは単一値、すなわち分類に対応する下付きスケールであり、これは私たちが使用するクロスエントロピーを計算する関数tfのためである.nn.sparse_softmax_cross_entropy_with_logits()が関係しています.この関数は正しい分類が1つしかないモデル計算に加速作用するが,このlabelsの入力は「この正しい分類」であり,出力に対応するノードはその下付きである.加速していないクロスエントロピー関数:tf.nn.softmax_cross_entropy_with_logis(logis=,labels=)このとき、私たちは自分のlabelsラベルに伝えるべきです.
最後に,モデルの精度を向上させる方法をまとめた.アクティブ化関数を使用します.つまり脱線形化は、このステップがほとんど必要です.2.抑制層を追加します.本例では、単隠含層300個の接点であり、精度は89%程度である.単隠含層400個の結点で、精度は93%前後である.一方、二重隠蔽層300の接点と100の接点は、精度が94%程度である.しかし、隠蔽層を増やすことは、訓練時間を増やすことを意味する.3.動的学習率を使用します.これは訓練の速度を速めるだけでなく,ニューラルネットワークがより低い極小値に収束する確率を増加させ,精度を増加させることができる.4.スムージングモデルを使用します.主にモデルの頑丈性を増加させ,その汎化能力をより強くすることができる.5.正規化またはdropoutを使用してオーバーフィットを防止します.
トレーニングセットを添付
次の記事では、モデルを保存する方法と、モデルの使用の詳細を記録します.