フィズバズを解決CHANG Tensorflow問題

質問をします

ネチズンのブログは、彼が一度にインタビューを記録し、インタビュアーがホワイトボードにTensorFlowと排他的論理和(XOR)機能を実現するために、単純なネットワークを書くように頼んだ会いました。これ自体は難しいことではない、単層パーセプトロンは、XOR問題を解決することはできませんニューラルネットワークを学習常識であり、単純な二層ニューラルネットワークを容易に解決することができました。しかし、問題の難しさは、我々がTensorFlowと通常の直接接触はCNNを書くために使用、学習やその他の関連するネットワークの深さは、この単純なネットワークを実現しながら、基本的にはやったことがないということです。しかも、ホワイトボードに書かれた必要バグ無料にしたい場合は、簡単なことではああではありません。

 

データ

次のようにCHANGの教師データを分析しました

デジタル101-1000ラベリング行う、すなわちトレーニングデータxtrain.shape =(900,10)は、各番号はバイナリで表され、最初の数は101であり、バイナリで表現される、[1 0,1,0,0,1,1,0,0,0]、各々が表す1} {^ 2-N-をN- 少数の左の数を表します。場合について合計4つ、[一般に、フィズ、バズ、フィズバズ] 、 他は0(900,10)=そうy_train.shape、1で表される対応する寸法であります

データ分析

900個のサンプルは、各サンプルの数を表し、バイナリ値で表される値を有します。観察試料は、最初の数は101、1010011000のバイナリ表現であります

 

 その後、ラベルを観察します

そうでない場合には、整数3,5または同時に、元の番号が保持されます。だから、4例の合計。「元の番号、フィズ、バズ、フィズ&バズ」

inputlayer寸法は10、中間次元隠れ層100の出力は、4次元の最終出力です。、設定をコンパイル機能を使用してReLU活性化機能は、レートの最適化機能を学習し、分類を行うことです、あなたはその後、バッチサイズとエポックを設定することができ、アダムです。

 

ソース

!は/ usr / binに/のenv pythonの- * -コーディング:UTF-8 - * - @time:2019年9月13日11時12分
#1 @Author:BaoBao @Mail:[email protected] @file :test6.py.py @Software:PyCharm 

フィズの話題の问题

から keras.layers.normalizationの輸入BatchNormalization
 から keras.modelsはインポートシーケンシャルを
 から keras.layers.core 輸入高密度、ドロップアウト、アクティベーション
 から keras.optimizersの輸入SGD、アダム
 のインポートNPのようnumpyの

デフfizzbuzz(始端):
    x_train、y_train = []、[]
     のための I における範囲(開始、終了+ 1 ):
        NUM = 私は
        tmpに = [0] * 10 
        J = 0
         一方NUM:
            TMP [J] = NUM &1 
            NUM = NUM >> 1 
            J + = 1 
        x_train.append(TMP)
        であれば、I%3 == 0 及び I%5 == 0:
            y_train.append([0,0,0、 1 ])
         のelif I% 3 == 1 0:
            y_train.append([0、、0,0])
         のelif I%5 == 0:
            y_train.append([0,0、 1 、0])
         
            y_train.append([ 1 、0,0,0] )
     戻りnp.array(x_train)、np.array(y_train)

x_train、y_train = fizzbuzz(101,1000) 打标记函数 
x_test、y_test = fizzbuzz(1100 

モデル = シーケンシャル()
model.add(高密度(input_dim = 10、output_dim = 10 ))
model.add(アクティベーション(' relu ' ))
model.add(高密度(output_dim = 4 )) 
model.add(アクティベーション('ソフトマックス' ))

model.compile(損失 = ' categorical_crossentropy 'オプティマイザ= ' アダム'メトリック= [ ' 精度' ])

model.fit(x_train、y_train、BATCH_SIZE = 20、nb_epoch = 100 

の結果 = model.evaluate( x_test、y_test、BATCH_SIZE = 1000 

プリント' [ACC '、結果[1])

 

業績

Accurayは、結果は非常に良いではありません見ることができますので、我々は、このような活性化関数、または大幅に精度を改善するために改変隠しneureの変更などに対処するためのプログラム、各種のは、1000年後に見ることができます考えます

 

業績

 

---------------------------------- ------------豪華な分割線------------------------------

他のブロガーから見する一つの方法は、私は非常にシンプルな料理ああQAQを書きました

1.importモジュール

import numpy as np
import tensorflow as tf

 

2.输入数据的placeholder

具体来说,一个data,一个label

data = tf.placeholder(tf.float32, shape=(4, 2))
label = tf.placeholder(tf.float32, shape=(4, 1))

由于本例比较特殊,异或只有四种输入和对应的四个输出,所以根据需求定义固定的shape

 

3.基于输入数据的placeholder构建model

异或需要两层神经网络,每层分别需要一个weights和一个bias,所以定义如下:

with tf.variable_scope('layer1') as scope:
  weight = tf.get_variable(name='weight', shape=(2, 2))
  bias = tf.get_variable(name='bias', shape=(2,))
  x = tf.nn.sigmoid(tf.matmul(data, weight) + bias)
with tf.variable_scope('layer2') as scope:
  weight = tf.get_variable(name='weight', shape=(2, 1))
  bias = tf.get_variable(name='bias', shape=(1,))
  x = tf.matmul(x, weight) + bias

这里为了方便变量管理,以及在tensorboard上的条理性,使用了variable_scope,当然,也可以不使用。

此外,因为我们后面的loss要使用sigmoid_cross_entropy_with_logits函数,所以这里第二层网络的输出没有过sigmoid函数。如果loss使用其他函数,则可以做相应处理。

 

4.定义loss

其实这里可以灵活选用各种loss函数,比如MSE,等等。但我们还是选用了在CNN中广泛使用的cross entropy

preds = tf.nn.sigmoid(x)
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=label, logits=x))

我们这里把模型的输出x过了一下sigmoid函数,作为最终输出,以便在训练时对模型进行监视。

 

5.定义Optimizer

learning_rate = tf.placeholder(tf.float32)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

 

6.构建并输入数据,开始训练

train_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
train_label = np.array([[0], [1], [1], [0]])
with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  for step in range(10000):
    if step < 3000:
      lr = 1
    elif step < 6000:
      lr = 0.1
    else:
      lr = 0.01
    _, l, pred = sess.run([optimizer, loss, preds], feed_dict={data: train_data, label: train_label, learning_rate: lr})
    if step % 500:
      print('Step: {} -> Loss: {} -> Predictions: {}'.format(step, l, pred)

 

完整代码:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# @Time : 2019/9/13 11:24 
# @Author : BaoBao
# @Mail : [email protected] 
# @File : test7.py 
# @Software: PyCharm

#fizz buzz问题
import numpy as np
import tensorflow as tf

data = tf.placeholder(tf.float32, shape=(4, 2))
label = tf.placeholder(tf.float32, shape=(4, 1))

with tf.variable_scope('layer1') as scope:
  weight = tf.get_variable(name='weight', shape=(2, 2))
  bias = tf.get_variable(name='bias', shape=(2,))
  x = tf.nn.sigmoid(tf.matmul(data, weight) + bias)

with tf.variable_scope('layer2') as scope:
  weight = tf.get_variable(name='weight', shape=(2, 1))
  bias = tf.get_variable(name='bias', shape=(1,))
  x = tf.matmul(x, weight) + bias

preds = tf.nn.sigmoid(x)

loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=label, logits=x))

learning_rate = tf.placeholder(tf.float32)

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

train_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])

train_label = np.array([[0], [1], [1], [0]])

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  for step in range(10000):
    if step < 3000:
      lr = 1
    elif step < 6000:
      lr = 0.1
    else:
      lr = 0.01
    _, l, pred = sess.run([optimizer, loss, preds], feed_dict={data: train_data, label: train_label, learning_rate: lr})
    if step % 500:
      print('Step: {} -> Loss: {} -> Predictions: {}'.format(step, l, pred))

 

运行结果

 

 

おすすめ

転載: www.cnblogs.com/baobaotql/p/11516611.html