畳み込みニューラルネットワークを構築tensorflow使用(CNN)

  ラーニング入門

  学習ニューラルネットワークは、長期記憶ネットワークが一定の理解を持ってLSTMする通常のBPニューラルネットワークから、しばらくの間でしたが、ニューラルネットワークレコードのシステム全体の決して構造が、私はこれらのレコードは、私は少し深く助けることができると信じていますニューラルネットワークを理解します。

  簡単な紹介

  畳み込みニューラルネットワーク(畳み込みニューラルネットワーク、CNN)は畳み込み演算は、フィードフォワードニューラルネットワーク(フィードフォワードニューラルネットワーク)の深い構造を持っ含むクラスで、代表の深学習アルゴリズム(深い学習)の一つです。

  その主な構造は、入力層、中間層及び出力層に分割されています。

  tensorboardで、示すような構造。

  畳み込みニューラルネットワークの入力層、通常畳み込みニューラルネットワークの出力層のない異なるを有します。しかし、中間層は、3つの部分、すなわち、畳み込み層(入力データに対して特徴抽出)、プールされた層(特徴選択及びフィルタリング)、従来のフィードフォワードニューラルネットワークに相当する完全接続層(分割することができます隠れ層)。

  はじめに隠れ層

  1、畳み込み層

  畳み込みフィルタは、各フィルタ活性化における画像の特定の特徴の集合に、入力画像の畳み込み。

  そうのような5×5の大きさは、黒と白の画像と仮定すると:

  次を使用してコンボルバー畳み込みます:

  

例


  コンボリューション結果:

  コンボリューション処理は、特徴を抽出することができ、畳み込みニューラルネットワークの分類は、機能に基づいて行われます。

  tensorflowでは、層は、重要な機能の畳み込みであります:

  tf.nn.conv2d(入力、フィルタ、ストライド、パディング、use_cudnn_on_gpu =なし、名前=なし)、其中。

  図1に示すように、入力形状が[バッチ、高さ、幅、チャネル]は、入力された量です。;

  図2に示すように、フィルタのコンボリューションカーネルが使用されています。

  3、ストライドはステップサイズ、フォーマット[1、ステップ、ステップ1]ステップは、画像の畳み込みにおける各ステップの長い寸法を指します。

  4、パディング:「同じ」である一方のみの文字列型の量は、「有効」、SAMEは、同じ画像の畳み込み前方領域を示します。

  図2に示すように、プールされた層

  畳み込み層のための細胞層が特徴抽出後に、特徴マップは、細胞層および機能選択情報フィルタリングの出力に渡されます。

  プーリングの最大の共通プールであり、最大は最大値が重畳された後に撮影したデータをプールを指す、最大抽出することを特徴とします。

  プーリングは、ウィンドウ2X2、ステップ2を仮定する。

  元の画像は以下のとおりです。

  

例


  プールの後です。

  

例


  tensorflowでは、細胞層は重要な機能です。

  tf.nn.max_pool(値、ksize、進歩、パディング、DATA_FORMAT、名前)

  1、値:入力セルの層、通常は細胞層畳み込み、シェイプ[バッチ、高さ、幅、チャネル]のバックコンタクト層です。

  2、ksize:プール、典型的にはウィンドウのサイズは、4次元ベクトルを取って、[1、in_height、in_width、1]。

  3、ストライド:畳み込みなど、各スライディングステップの窓寸法は、[1、ストライド、ストライド、1]。

  4、パディング:コンボリューションなどは、「有効」または「SAME」かかる場合があります。

  この接続構造はtensorboard畳み込み層とプールされた層です。

  図3に示すように、全体の接続層

  示したのと同じ一般的な構造は、完全に接続されたニューラルネットワークの層:

  特定の実装コード

  コンボリューション層、完全な実装コード層の接続層をプールします

  DEF(X、W、ステップ、パッド)conv2d:畳み込みを実行するため位コンボリューションカーネルであるwは、xは、入力値であります

  tf.nn.conv2d返す(X、W、ストライド= [1、ステップ、ステップ1]、パディング=パッド)

  max_pool_2X2(X、ステップ、パッド)DEF:プーリングため#、xは入力値であり、ステップは、ステップ数であります

  戻りtf.nn.max_pool(X、ksize = [1,2,2,1]、ストライド= [1、ステップ、ステップ1]、パディング=パッド)

  DEF(形状)weight_variable:Wを得るため#

  切断型で正規分布からの初期= tf.truncated_normal(形状、STDDEV = 0.1)#ランダムな値を出力

  tf.Variable(初期)を返します

  デフbias_variable(形状):#1获得バイアス

  初期= tf.constant(0.1、形状=形状)#値無地生成

  tf.Variable(初期)を返します

  デフadd_layer(入力、IN_SIZE、OUT_SIZE、n_layer、activation_function =なし、keep_prob = 1):

  レイヤーは完全に#を追加するために接続されています

  LAYER_NAME = 'layer_%s' は%n_layer

  tf.name_scope(LAYER_NAME)と:

  tf.name_scope( "ウェイト")と:

  重み= tf.Variable(tf.truncated_normal([IN_SIZE、OUT_SIZE]、STDDEV = 0.1)、名前= "重み")

  tf.summary.histogram(LAYER_NAME + "/重み"、重み)

  tf.name_scope( "偏見")と:

  バイアス= tf.Variable(tf.zeros([1、OUT_SIZE])+ 0.1、NAME = "バイアス")

  tf.summary.histogram(LAYER_NAME + "/偏見"、偏見)

  tf.name_scope( "Wx_plus_b")と:

  Wx_plus_b = tf.matmul(入力、重み)+バイアス

  tf.summary.histogram(LAYER_NAME + "/ Wx_plus_b"、Wx_plus_b)

  activation_function ==なしの場合:

  出力= Wx_plus_b

  他:

  出力= activation_function(Wx_plus_b)

  印刷(activation_function)

  出力= tf.nn.dropout(出力、keep_prob)

  tf.summary.histogram(LAYER_NAME + "/出力" の出力)

  リターン出力

  デフadd_cnn_layer(入力、in_z_dim、out_z_dim、n_layer、conv_step = 1、pool_step = 2、パディング= "SAME"):

  細胞層と層を生成するための#1コンボリューション

  LAYER_NAME = 'layer_%s' は%n_layer

  tf.name_scope(LAYER_NAME)と:

  tf.name_scope( "ウェイト")と:

  W_conv = weight_variable([5,5、in_z_dim、out_z_dim])

  tf.name_scope( "偏見")と:

  b_conv = bias_variable([out_z_dim])

  tf.name_scope( "CONV")と:

  #コンボリューション層

  h_conv = tf.nn.relu(conv2d(入力、W_conv、conv_step、パディング)+ b_conv)

  tf.name_scopeで( "プール"):

  #プーリング層

  h_pool = max_pool_2X2(h_conv、pool_step、パディング)

  h_pool戻ります

  すべてのコード

  TFとしてインポートtensorflow

  tensorflow.examples.tutorials.mnist輸入INPUT_DATAから

  mnist = input_data.read_data_sets( "MNIST_data"、one_hot = "真")

  デフconv2d(X、W、ステップ、パッド):

  tf.nn.conv2d返す(X、W、ストライド= [1、ステップ、ステップ1]、パディング=パッド)

  DEF max_pool_2X2(X、ステップ、パッド):

  戻りtf.nn.max_pool(X、ksize = [1,2,2,1]、ストライド= [1、ステップ、ステップ1]、パディング=パッド)

  デフweight_variable(形状):

  切断型で正規分布からの初期= tf.truncated_normal(形状、STDDEV = 0.1)#ランダムな値を出力

  tf.Variable(初期)を返します

  デフbias_variable(形状):

  初期= tf.constant(0.1、形状=形状)#値無地生成

  tf.Variable(初期)を返す病院の無錫の流れをhttp://www.0510bhyy.com/

  デフadd_layer(入力、IN_SIZE、OUT_SIZE、n_layer、activation_function =なし、keep_prob = 1):

  LAYER_NAME = 'layer_%s' は%n_layer

  tf.name_scope(LAYER_NAME)と:

  tf.name_scope( "ウェイト")と:

  重み= tf.Variable(tf.truncated_normal([IN_SIZE、OUT_SIZE]、STDDEV = 0.1)、名前= "重み")

  tf.summary.histogram(LAYER_NAME + "/重み"、重み)

  tf.name_scope( "偏見")と:

  バイアス= tf.Variable(tf.zeros([1、OUT_SIZE])+ 0.1、NAME = "バイアス")

  tf.summary.histogram(LAYER_NAME + "/偏見"、偏見)

  tf.name_scope( "Wx_plus_b")と:

  Wx_plus_b = tf.matmul(入力、重み)+バイアス

  tf.summary.histogram(LAYER_NAME + "/ Wx_plus_b"、Wx_plus_b)

  activation_function ==なしの場合:

  出力= Wx_plus_b

  他:

  出力= activation_function(Wx_plus_b)

  印刷(activation_function)

  出力= tf.nn.dropout(出力、keep_prob)

  tf.summary.histogram(LAYER_NAME + "/出力" の出力)

  リターン出力

  デフadd_cnn_layer(入力、in_z_dim、out_z_dim、n_layer、conv_step = 1、pool_step = 2、パディング= "SAME"):

  LAYER_NAME = 'layer_%s' は%n_layer

  tf.name_scope(LAYER_NAME)と:

  tf.name_scope( "ウェイト")と:

  W_conv = weight_variable([5,5、in_z_dim、out_z_dim])

  tf.name_scope( "偏見")と:

  b_conv = bias_variable([out_z_dim])

  tf.name_scope( "CONV")と:

  h_conv = tf.nn.relu(conv2d(入力、W_conv、conv_step、パディング)+ b_conv)

  tf.name_scopeで( "プール"):

  h_pool = max_pool_2X2(h_conv、pool_step、パディング)

  h_pool戻ります

  デフcompute_accuracy(x_data、y_data):

  グローバル予測

  y_pre = sess.run(予測、feed_dict = {XS:x_data、keep_prob:1})

  correct_prediction = tf.equal(tf.arg_max(y_data、1)、tf.arg_max(y_pre、1))

  精度= tf.reduce_mean(tf.cast(correct_prediction、tf.float32))

  結果= sess.run(精度、feed_dict = {XS:batch_xs、YS:batch_ys、keep_prob:1})

  リターン結果

  keep_prob = tf.placeholder(tf.float32)

  XS = tf.placeholder(tf.float32、[なし]、[784])

  YS = tf.placeholder(tf.float32、[なし]、[10])

  x_image = tf.reshape(XS、[ - 1,28,28,1])

  h_pool1 = add_cnn_layer(x_image、in_z_dim = 1、out_z_dim = 32、n_layer = "CNN1")

  h_pool2 = add_cnn_layer(h_pool1、in_z_dim = 32、out_z_dim = 64、n_layer = "cnn2")

  h_pool2_flat = tf.reshape(h_pool2、[ - 1,7 * 7 * 64])

  h_fc1_drop = add_layer(h_pool2_flat、7 * 7 * 64、1024年、 "レイヤ1"、activation_function = tf.nn.relu、keep_prob = keep_prob)

  予測= add_layer(h_fc1_drop 1024、10、 "レイヤ2"、activation_function = tf.nn.softmax、keep_prob = 1)

  tf.name_scope( "損失")を持ちます:

  損失= tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(ラベル= YS、logits =予測)、名= '損失')

  tf.summary.scalar( "損失"、損失)

  列車= tf.train.AdamOptimizer(1E-4).minimize(損失)

  INIT = tf.initialize_all_variables()

  マージされた= tf.summary.merge_all()

  SESのようtf.Session()を持ちます:

  sess.run(イン)

  書き込み= tf.summary.FileWriter( "ログ/"、sess.graph)

  範囲(5000)でのiについて:

  batch_xs、batch_ys = mnist.train.next_batch(100)

  sess.run(列車、feed_dict = {XS:batch_xs、YS:batch_ys、keep_prob:0.5})

  私%100 == 0の場合:

  印刷(compute_accuracy(mnist.test.images、mnist.test.labels))

おすすめ

転載: blog.51cto.com/14335413/2434185