アプリケーションテキスト分類1.tf.nn.embedding_lookup 2.saver.restore(ローディングパラメータのSES)における(データ内のデータから抽出されたインデックスデータに基づいて)フレームCNN学習の原則の深さ

1. tf.nn.embedding_lookup(W、X)W寸法は[LEN(vocabulary_list)、128]は、Xの寸法は、[?]、[8]、の組み合わせ寸法[?、8、128]

コードは説明:即ち、このようなXとしてX、の各行によれば番号に対応するWラインから抽出された128個のデータ[1、3]データ3062、すなわち、W 3062のライン128から抽出されたデータ

コードをコピー
NPのようなインポートnumpyの
TFのようなインポートtensorflow 
データ= np.array([2,1]、[3,4]、[5、6])
データ= tf.convert_to_tensor(データ)
LK = [0,1] 、[1,0]、[0,0]、[1,1] 
lookup_data = tf.nn.embedding_lookup(データ、LK)
INIT = tf.global_variables_initializer()
のSES = tf.Session()
プリント(sess.run (tf.shape(データ)))
プリント(sess.run(tf.shape(LK)))
プリント(sess.run(tf.shape(lookup_data)))
プリント(sess.run(lookup_data))
コードをコピー

2. Saver.restore(SESの、」./model/-10' )パスのSESをロード

ここだけ、あなたは最後の引数のパス名を入力ません戻って入力する必要があります

コード説明:tf.embedding_lookupを使用CNN名性別予測、(の主な用途)変換の次元変換寸法が8、128した後、元の寸法は、8であります? 

データ説明:使用csv.reader()([0、1])、csvファイルを読み込むtrain_xに名前を追加、男性、ラベルtrain_y.appendとして性別するために、セックスの女性、ラベルtrain_y.append([1 、0])

                 良い辞書に+1カウントに辞書に循環vocabulary_dict辞書の構築、各単語の単語頻度統計は、ソートキー値が良いソート後に得られ、使用してソート

                 各ワード数、使用の列挙を表すために使用され

                 サイクル毎に対応するデジタルワードを取得train_x、、及びは、リストの長さが0で満たされ、最大の長さ未満である場合、リストに追加しました

 

コード説明:コードの説明本明細書中で主に二つの部分に記載します。

パートI:データの読み出し、すなわちtrain_vec_x、生産とtrain_y

パートII:モデルの構築

パートIII:モデルトレーニング動作

 

パートI:データの読み出し、すなわち、生産train_vec_xとtrain_y

              ステップ:建設とtrain_xのtrain_yは、読み出したデータはtrain_xとtrain_yに追加されます

                        最初のステップ:オープン(「name.csv」)を使用したファイルを開くには

                        ステップ2:使用しcsv.reader(csvfile内)は、ファイルのデータを読み込みます

                        第三段階:tran_x.appendを用いて、2に等しい場合、循環データは、データのサイズが2に等しいかを判断する(行[0])

                        ステップ4:解析行[1] == 'M':train_y.append([0、1])は、それぞれの名前タグとして([0、1])人train_y.appendかもし

             ステップ2:単語頻度統計を対応する各単語の建設vocabulary_dict辞書

                        最初のステップ:名前をtrain_x、各サイクルの単語を循環させます

                        ステップ2:[名に単語を単語]トークン=を使用して、リストの中に、文字列の組み合わせの名前です。

                        第三段階:循環トークン、もしvocabulary_dictワード、vocabulary_dict [単語] + = 1、すなわち、単語頻度プラスワンの数、そうでない場合、vocabulary_dict [単語] = 1、初期を行うための等価

              第三段階:vocabulary_list = [「」] +ソートされた辞書の値に従ってソート、(vocabulary_dict、キー= vocabulary_dict.getは、=真逆)、辞書が鍵、すなわち、各ワードを返します

              ステップ4:0の各ワードに使用辞書(emurate(vocabulary_list)で(Y、X)のための(X、Y))、1 ....対応

              ステップ5:循環train_xは、マップのリストを生成します

                             最初のステップ:空のリスト構造train_vec_x、名前でリサイクルtrian_x

                             ステップ2:[名に単語のための単語] =トークンを使用してname_vec空のリスト構造は、ワードに名前のリストになります

                             第三ステップ:ワードトークンの循環、マッピング辞書単語を取得[単語]、対応するインデックス番号、name_vecに追加

                             ステップ4:長さが最大長さより小さい場合name_vecがゼロパディングをname_vec続ける、すなわち、追加(0)

                             ステップ5:train_vec_x.append(name_vec)各名前対応するデジタルマップ追加

パートII:ネットワークモデルの構築、モデル出力の予測された結果、すなわち、[なし]、[2]

            最初のステップ:ネットワークの基本的なパラメータを設定する、BATCH_SIZE、input_size、num_classes、num_batch 

            ステップ2:機能構成ネットワークモデル、入力vocabulary_size、embedding_size、及びfilter_num 

            第三段階:tf.placeholder(tf.float32、[なし]、[2])は、Yの初期設定を用いて使用tf.placeholder(tf.int32、[なし]、input_size])Xの初期設定

            ステップ4:tf.name_scope(「埋め込み」)との変更を埋め込みます

                          ステップ:W = tf.Vairbaleの構築(tf.random_normal([vocabulary_size、embedding_size])) 

                          ステップ2:tf.embedding_lookup使用(W、X)が埋め込みマッピングを繰り越さ、次いで、128 8の出力?

                          第三段階:tf.expand_dim(embedding_chars、軸= -1)次元に変換する、8、128、1を使用して? 

             ステップ5:コンボリューションコンボリューションカーネルサイズの3種類

                          ステップは:畳み込みカーネルの三次元のサイズを定義し、3、4、5、構成output_pool = []リストに分割されています

                          ステップ2:3つのサイズの畳み込みカーネルをサイクリング

                          第三段階:tf.name_scope持つ構成( 'conv_pool%D' %(conv_size))

                          第四段階:設定パラメータW、[conv_size、embedding_size、1、num_filter]、設定パラメータのB、[num_filter]のサイズの大きさ

                          ステップ5:tf.nn.relu操作をアクティブに使用して、畳み込み演算を行うtf.nn.conv2d使用します

                          ステップ6:操作をプールtf.nn.max_pool、ksize = [1、input_size - conv_filter + 1、1、1]の畳み込みのサイズであります

                          第七ステップ:output_poolリストに畳み込みの結果を追加

                          第8工程:output_pool寸法を使用して、操作をマージtf.concat

              ステップ6:寸法に合わせた変更の結果、すなわち寸法となる[ - 1、3 * 128]完全に接続の後続の動作のために

              ステップ7:tf.nn.dropoutを使用して、ドロップアウト動作のためにtf.name_scope(「ドロップアウト」)を使用します 

              ステップ8:構造全体の動作を結ぶtf.name_scope(「出力」)で使用

                           ステップ:寸法Wの構築[3 * 128、num_class]、寸法bの構成[num_class]

                           ステップ2:tf.matmulため使用tf.nn.xw_plus_b(X、W)+ B・オペレーション

                           第三段階:出力結果を返します。

 

パートIII:定義train_network()トレーニングモデル

            ステップ:使用neture_network(vocabulary_size = LEN(vocabulary_size))出力の出力を得ます

            ステップ2:使用tf.reduce_mean(tf.nn.softmax ... logits())損失値損失の定義

            第三段階:tf.train.Adaoptimer(1E-3)ロス低減運転train_opの.minimize(損失)値を用いて 

            ステップ4:使用tf.train.Saver(tf.global_variable())関数定義がセーバー保存されています 

            ステップ5:sess.runを(使用する、関数を実行するのSESを初期化するtf.Session()コンストラクタ)で使用した変数

            ステップ6:循環エポックがnum_batchサイクルを行い、

            ステップ7:使用tran_vec_x [iがBATCH_SIZEを*:(I + 1)*バッチ] train_yを使用して、x_batchを得た[iがBATCH_SIZEを*:(I + 1)*バッチ] y_batchを得 

            ステップ8:使用sess.run([train_op、損失]、feed_dict = {X:x_batch、Y:y_batch}) 

            ステップ9:もし反復1000年、印刷エポック、反復および損失

            ステップ10:反復2つのエポック、つまり、Saver.saveとSESのを保存()、

コード:main.py

コードをコピー
インポートAS TFのtensorflow 
NP ASインポートnumpyの
インポートCSV 

#パートI:データの読み込み
#ステップ1:リストtrain_xを作成し、train_y、train_xに保存されたファイル名から読み込まれ、性別を使用して読み、[0、1 ]または[1,0] train_yに格納されている
train_x = []#は、リスト作成
train_yを= [] オープンファイルname.csv 
開く( 'name.csv'、 'R&LT'、エンコード= 'UTF-8')AS csvfile内:
    データを読み取る読み取りに使用#1 csv.readerは、ファーストネーム、である第2の性別として、2である
    data_csv = csv.reader(csvfile内)
    データを読み取るための#ループ
    :data_csvの行のための
        #現在の行のサイズが2である場合
        、LEN(行)== 2 IF: データの現在の行と最初の名前がtrain_xのに加え
            train_x.append(行[0]) は、現在の行は、第2のデータである場合'M'、タグが追加train_y [0 ,. 1] 
            IF行== 'M' [1]:
                train_y.append([0 ,. 1]) 
        #ではない場合、値= 1、すなわちvocabulary_dictを入れ[単語] = 1
            他:
                #タグまたはタグなしを添加しないtrain_y [1、0] 
                train_y.append([1、0]) サイズの印刷最長名
max_len_name = MAX([LEN train_xで名(名前)])
を印刷(max_len_name) 最大長はセット名である8。
max_len_name 8 =。 ステップ:語彙辞書を構築する単語頻度辞書構造
vocabulary_dict} = { 
#名循環
train_x名にするために:
    #離れワードのそれぞれの名前となりますリストに
    [名内の単語のための単語]トークン= 
    #サイクル単語リスト
    トークン内の単語のために:
        #もし値が、中に辞書語彙でこの言葉+ = 1 
        IF vocabulary_dictのワード:
            vocabulary_dict [単語] + = 1 
        他:
            vocabulary_dict [ワード] = 1。 
ステップ:値に応じた動作を選別単語頻度辞書、得られた発注後にリスト
[ ''] = vocabulary_list +ソート(vocabulary_dict、キー= vocabulary_dict.get、リバース= TRUE) 
ステップIV:単語のデジタル地図袋の構成における使用のdict(x、y)の
単語=辞書((X、Y (用) 列挙(vocabulary_list))におけるY、X)

すなわち.append循環train_x、組み合わせ番号に対応するワード名、番号のリストの長さが8未満である場合名は、デジタルtrain_xリストに変換し、(0):#第五工程
= train_vec_x [] 
train_xにおける名:
    #構成名前VEC 
    name_vec = [] 単語に名前リスト分割
    [名内の単語のための単語]トークン= 
    #サイクル単語リスト
    トークン内の単語のための:
        #辞書キー、name_vec得られた値に加えること
        name_vec.append(語彙[ワード]) 
        name_vec.append(0) 名ベクターはtrain_vec_xに組成良好に添加 
    長さが8未満である場合に8充填の(0)、長さを.append用いて、#1 name_vec
    LEN一方(name_vec)<max_len_name:
    train_vec_x.append(name_vec)

################## 
#パートII:ネットワークモデルの構築は、出力は[なし、num_class]すなわちスコア各クラスの値
#ステップ:パラメータの構築input_size、BATCH_SIZE、num_classes、num_batch 
次元input_size = max_len_name#入力された、名前はすなわち、最も長い距離である8。
BATCH_SIZE各バッチサイズ= 64の#1 
num_classes =カテゴリ#2結果
num_batch = LEN(train_vec_x)// BATCH_SIZE #のサンプル回後のいくつかのバッチ
#ステップ2:tf.placeholder構成XとY使用
X = tf.placeholder(tf.int32、[なし]、input_size])
Yをtf.placeholder =(tf.float32、[なし]、num_classes]) サイズkeep_prob入力がドロップアウト実行するように構成
dropout_keep_prob = tf.placeholder(tf.float32) 工程:入力機能構成ネットワーク
デフneture_network(vocabulary_size 、embedding_size = 128、filter_num = 128 )。 
    #第四工程:プレマッピングを埋め込む
    TFと.name_scope( '埋め込み'):
        #構成W、[vocabulary_size、embedding_size]のサイズ
        Wは、= tf.Variable(tf.random_uniform([vocabulary_size、embedding_size]、-1.0、1.0))である
        投影マップに使用#1 tf.nn.embedding_lookupは、マップサイズは[ ?、8、128] 
        (Wは、X-ある)embedding_chares tf.nn.embedding_lookup = 
        #使用tf.expand_dimsは、[それはなる寸法、寸法を増加?、8、128 ,. 1] 
        embedding_chares = tf.expand_dims(embedding_chares、軸= -1) ステップ5:畳み込み畳み込み畳み込みの3種類のサイズ、結果を合わせた
    コンボリューションカーネルサイズの#3種類である3 ,. 4 ,. 5。
    conv_sizes = [3 ,. 4 ,. 5。 ] 
    #構成されたプールされた結果リスト
    pool1_output = [] 異なるサイズの巡回畳み込みカーネル
    conv_sizesでconv_size用: 
        スコープwith.name_scope構成パラメーター#
        :( 'D CONVパディング%' %(conv_size))とtf.name_scope 
           Wは、[,. 1は、filter_num embedding_size、conv_size]畳み込み#構成パラメータ、寸法で
           Wは= tf.Variable(tf.random_uniform([conv_size 、,. 1、filter_num]))embedding_size 
           #畳み込み設定パラメータ、B、寸法[filter_num] 
           B = tf.Variable(tf.constant(0.1、形状= [filter_num])) 畳み込み演算と起動動作
           CONVをtf.nn.relu =(tf.nn.conv2d(embedding_chares、Wは、ストライドは= [1 ,. 1 ,. 1 ,. 1]、パディング= '有効')+ B) 最大値プール操作、ksize = [1 、input_size = conv_size + 1、1 、1] の中間寸法が畳み込ま前記中間層の2つの寸法が
           プール= tf.nn.max_pool(CONV、ksize = [1、input_size - conv_size + 1、1、1 ]、ストライド= [1、1、1、1]、パディング= 'VALID')
           プーリング[位サイズの寸法?、1、1、128] 
           pool1_output.append(プール)
    #合わせ寸法、動作をオーバーラップする、すなわち、寸法[* 128?、1、13]
    = tf.concat FCIN(pool1_output、軸= 3) ステップ6:完全に接続の後続の動作のために、寸法を変化
    FCIN = tf.reshape(FCIN、形状= [ - 1 ,. 3 * 128])
    の# 7つのステップ:ドロップアウト動作が行わ
    tf.name_scope(「ドロップアウト」)と:
        fc_dropout = tf.nn.dropout(FCIN、keep_prob = dropout_keep_prob) 第8のステップ:全体の最終的な動作に参加する、計算のカテゴリスコア
    とtf.name_scope( '出力'):
        Wは[* 128 3 2]は、完全に接続されたコンフィギュレーション#1の寸法であり
        、Wが= tf.Variable(tf.random_uniform([* 128 3、num_classes]、-1.0、1.0))である
        # B、完全な寸法を構成する接続[2] 
        B = tf.Variable(tf.constant(0.1、形状= [num_classes])) 最終出力スコア得る
        出力= tf.nn.xw_plus_b(fc_dropout、W、 
トレーニング動作モデル:#パートIII 
)(デフtrain_networkを:スコア値を返します
    出力リターン
    #ステップ:出力結果の出力得るneture_network呼び出す
    出力= neture_network(vocabulary_size = LEN(vocabulary_list))
    損失の損失の値を取得するために使用tf.reduce_mean(tf.nn.softmax _... logits):#ステップ2を
    損失tf.reduce_mean =(tf.nn.softmax_cross_entropy_with_logits(logits =出力、ラベル= Y)) ステップ:損失値を適応損失の操作を使用して低減されるtrain_op 
    train_op = tf.train.AdamOptimizer(-1E 3).minimize(損失)
    #第四工程:tf.train.SaverのSES用いて構成されたストレージ
    セーバー= tf.train.Saver(tf.global_variables()) ステップ5:tf.Session()関数は、SESのを取得するために行われ、パラメータの初期化されています操作
    :セッション数AS tf.Session()と
        #パラメータの初期化動作
        sess.run(tf.global_variables_initializer()) 第6工程:循環エポック、サイクルnum_batch
        (11)用のEにおける範囲 
            私のためのレンジ(num_batch)で:
                #第七工程:インデックス値と設定batch_x batch_y 
                batch_x train_vec_x = [IはBATCH_SIZEを*:(I + 1)* BATCH_SIZE] 
                batch_y train_y = [IはBATCH_SIZEを*:(I + 1)* BATCH_SIZE] 第8工程:train_opはsess.runと損失用いて行わ
                _、_loss sess.run =([train_op、損失] = {:batch_x、Y:batch_y、dropout_keep_prob 0.7 X-feed_dict}) ステップ9:もし反復印刷結果1000年
                IF I == 0%1000年:
                    印刷( 'エポック'、E 'ITER'、I '損失:'、_loss)
            それは反復する場合#は2の結果を保存する
            場合に電子%2 == 0 :
                saver.save(sess。viの'./model/epoch'、global_step = E)


train_network()
コードをコピー

次に、結果は同じネットワークであるので、パラメトリック試験コンストラクタtest_sex訓練された、上述した2つの部分を変更する必要がない、第三の部分のみtest_sex(NAME_LIST)、変更される必要があります

最初のステップ:モデル予測構造のtest_sex、リストの名前を入力します。

ステップ2:デジタル地図、設定さtrain_x 

             最初のステップ:空のリスト構造train_x

             ステップ2:循環NAME_LIST、名を取得

             第三段階:名前リストに単語を分割する[名前のワードに対するワード] =トークンを使用して、構成name_vec

             第四段階:循環トークン、name_vec.append(vocan [ワード])、デジタルワードワードに変換されます

             ステップ5:長さ(0)ゼロパディング操作を.append用いて、すなわち最大長name_vec 8未満である場合

             ステップ6:リスト作成train_xをtrain_xするname_vecを追加 

ステップ3:出力を得るために)(neture_networkを呼び出します

ステップ4:使用tf.argmax(出力軸= 1)は、スコア値を取得した指標値、カテゴリのすなわち大きい値であります

ステップ5:セーバーを保存取得するために使用tf.train.Saver()関数 

ステップ6:のSESのSESのコンストラクタ関数としてtf.Session()で使用

ステップ7:使用Saver.restore(SESの」./model/-10' )負荷のSES

ステップ8:使用sess.run(y_pred、feed_dict = {X:train_x、keep_prob = 1.0})予測結果を得ます

ステップ9:サイクルの予測、および結果は、男性のための印刷カテゴリ1である場合、結果のインデックス値が0であれば、女性のための印刷カテゴリ

コードをコピー
ステップ#:モデル予測のために構成さtest_sex、入力NAME_LISTの
DEFのtest_sex(NAME_LIST): ステップ:train_xのために構成された
   X格納するように構成された#
    X = [] 循環リストの名前を、名前が得られ
    NAME_LIST名で:
        #name_vec構成リスト、名称記憶するためのベクター
        name_vecは= [] 名は単語のリストに分割
        = [名内の単語のための単語]トークン
        ワード当たり#サイクル
        トークン内の単語のために:
            #単語の名前に付加番号のベクトルに対応する袋デジタルワード
            name_vec.append(語彙[ワード])
        位名前が8未満の数のベクトルである場合、0を加算し
        つつLEN(name_vec)<max_len_name:
            name_vec.append(0)
        #ベクトルにデジタル単語ベクトルの名前を追加します
        x.append(name_vec) ステップ3:コールモデルは、出力を得ます
    = neture_network出力(vocabulary_size = LEN(vocabulary_list)) ステップIV:使用が最大インデックス値をtf.argmax、または0.1 
    y_pred tf.argmax =(出力、軸= 1) ステップ5:tf.train .Saver()コンストラクタ関数セーバー
    セーバー= tf.train.Saver(tf.global_variables()) ステップ6:tf.Session()コンストラクタ関数が実行される
    tf.Session(と)のSES AS: ステップ7:負荷SESの関数
        saver.restore(SESの、 './model/epoch') 第8のステップ:sess.runはy_predを用いて行うが、実際の予測を得る
        y_pred_ = sess.run(y_pred、feed_dict = {X:X、dropout_keep_prob。 1.0}) ステップ9:予測ループインデックス値が1の場合、男性の印刷は、NOは、印刷された女性である
        :範囲(LEN(y_pred_))でIため
            IF y_pred_ [I] == 1:
                プリント(NAME_LIST [i]は、 'M') 
            他:
                プリント(NAME_LIST [i]は、 '女')
コードをコピー

おすすめ

転載: www.cnblogs.com/jfdwd/p/11184257.html