tensorflow入門の訓練簡単なニューラルネットワーク
11868 ワード
ここ数日からtensorflowを勉強して、まず勉強の記録をします.ニューラルネットワークの問題解決手順:1.問題内のエンティティの特徴ベクトルをニューラルネットワークの入力として抽出する.すなわち,データセットを特徴工学し,各サンプルの特徴次元を知り,入力ニューロンの個数を定義する.2.ニューラルネットワークの構造を定義し、ニューラルネットワークの入力から出力する方法を定義する.すなわち、入力レイヤ、非表示レイヤ、および出力レイヤを定義します.3.ニューラルネットワークを訓練するプロセスであるトレーニングデータによってニューラルネットワークにおけるパラメータの値を調整する.一般にモデルの損失関数を定義し,交差エントロピー損失関数や勾配降下法の最適化などのパラメータ最適化法を用いる.4.訓練されたモデルを用いて未知のデータを予測する.つまりモデルの良し悪しを評価する.
二.訓練が簡単な前にニューラルネットワークを伝播して訓練するニューラルモデルは最も簡単な類で、しかも線形で(つまり活性化関数で線形話をしていない)、逆伝播の過程がなくて、ただ簡単にニューラルネットワークの仕事の流れを説明します.
これで、xの各次元に2層の重みを乗算した後、単一の線形ニューラルネットワークを出力することが定義される.
三.損失関数の定義と逆伝搬アルゴリズムには上記の基礎があり,損失関数と逆伝搬アルゴリズムを定義してデータにフィットすることができ,非線形データは活性化関数の線形化を定義することができる.いくつかの細部は学習率の問題で、今回は動的学習率を使用して、まず学習率を比較的大きい値に設定して、収束を加速して、それから反復回数の増加に従って、学習率は絶えず下がって、局部の最小値を逃すことを防止します.もう一つの問題は、フィットを防ぐことです.一般的なニューラルネットワークがフィッティングを防止する戦略は2つあり,1つは正規化であり,1つはdropoutであり,後者についてはしばらく議論しない
損失関数:クロスエントロピー逆伝搬アルゴリズム:勾配降下法活性化関数:relu
次に、クロスエントロピーを計算するときにサンプルに入力する理由を見てみましょう.まず、出力ノードが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を使用してオーバーフィットを防止します.
トレーニングセットを添付
次の記事では、モデルを保存する方法と、モデルの使用の詳細を記録します.
二.訓練が簡単な前にニューラルネットワークを伝播して訓練するニューラルモデルは最も簡単な類で、しかも線形で(つまり活性化関数で線形話をしていない)、逆伝播の過程がなくて、ただ簡単にニューラルネットワークの仕事の流れを説明します.
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を使用してオーバーフィットを防止します.
トレーニングセットを添付
次の記事では、モデルを保存する方法と、モデルの使用の詳細を記録します.