3.2TensorFlowデータモデル-テンサー
- テンソルの3つの最も重要な属性:名前(名前)、寸法(形状)、タイプ(dtype)
3.3TensorFlow実行モデルセッション
- ConfigProtoには2つの最も重要なパラメーターがあり、1つ目はallow_soft_placementです。Trueの場合、次の条件のいずれかがTrueの場合、CPUでGPU操作を実行できます。
- 計算はGPUでは実行できません。
- GPUリソースはありません。
- 操作入力には、CPU計算結果への参照が含まれます。
もう1つのパラメーターはlog_device_placementです。Trueの場合、ログには、デバッグを容易にするために各ノードが配置されているデバイスが記録されます。
import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
a = tf.Variable(tf.constant([1.0]), name = 'a')
b = tf.Variable(tf.constant([2.0]), name = 'b')
result = a + b
config = tf.ConfigProto(allow_soft_placement=True,
log_device_placement=True) # 配置config
with tf.Session(config = config) as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(result))
3.4TensorFlowはニューラルネットワークを実装します
ニューラルネットワークと順方向および逆方向の伝播に関する理論的知識はここでは繰り返されません。主な焦点はTensorFlowのプログラミングと使用です。
プログラミングプロセスの一般的な機能
- テンソルフローランダムナンバー生成機能
関数名 | ランダムな数の分布 | 主なパラメータ |
---|---|---|
tf.random_normal | 正規分布 | 平均、標準偏差、値のタイプ |
tf.truncated_normal | 通常は分布していますが、ランダム値が平均から2標準偏差を超えて逸脱している場合、数値は再びランダム化されます | 平均、標準偏差、値のタイプ |
tf.random_uniform | 均等に分散 | 最小値、最大値、値のタイプ |
tf.random_gamma | ガンマ分布 | 形状パラメータアルファ、スケールパラメータベータ、値タイプ |
- テンソルフロー定数生成関数
関数名 | 特徴 | サンプル |
---|---|---|
tf.Variable | すべて0の配列を生成します | tf.zeros([2,3]、int32)-> [[0,0,0]、[0,0,0]] |
tf.ones | すべて0の配列を生成します | tf.ones([2,3]、int32)-> [[1,1,1]、[1,1,1]] |
tf.fill | 指定されたすべての数値の配列を生成します | tf.fill([2,3]、9)-> [[9,9,9]、[9,9,9]] |
tf.constant | 指定された値の定数を生成します | tf.constant([1,2,3])-> [1,2,3] |
- Tensorflow変数生成関数
関数名 | 特徴 | サンプル |
---|---|---|
tf.Variable | コンテナで初期化できる変数を生成します | tf.Variable(tf.constant([1.0])) |
tf.placeholder | プレースホルダー機能 | tf.placeholder(shape = [None、784]、dtype = 'float') |
- テンソルフロー操作機能
関数名 | 特徴 | サンプル |
---|---|---|
tf.matmul | テンソルを乗算すると、テンソルの寸法はマトリックス乗算と同じ要件を満たします | tf.matmul(a、b) |
tf.sigmoid | シグモイド機能 | tf.sigmoid(x) |
… | … | … |
- Tensorflowオプティマイザー
一般的なオプティマイザ |
---|
tf.train.GradientDescentOptimizer() |
tf.train.AdamOptimizer() |
tf.train.MomentumOptimizer() |
単純なニューラルネットワークを実装するためのプログラミング
プロセスを簡単に言えば、このコードは本に正確に基づいているわけではありません。私はそれを自分で変更し、簡単なバッチを追加しました。
-
データセットのサイズを10000として定義し、2つの特徴を持つ10000のサンプルをランダムに生成し、2つの特徴の合計に従ってサンプルを分類します。
-
ネットワーク構造を定義します。このネットワークは比較的単純で、入力レイヤー、非表示レイヤー、出力レイヤーのみがあります。隠れ層のニューロン数は20に設定されており、隠れ層はreluアクティベーション機能を使用しており、勾配が消えるのを効果的に防ぐことができます。同時に、出力層はシグモイド活性化機能を採用しており、出力値の範囲は[0,1]であり、1に分類される確率を示しています。
-
出力値と実際の分類結果を使用して、クロスエントロピーを計算します。
損失= − ∑ 1 N(pilogpi ′+(1 − pi)log(1 − pi′))loss =-\ sum_1 ^ {N)(p_ilogp_i ^ {')+(1-p_i)log(1-p_i ^ {'}))l o s s=−1∑N(p私l o g p私"+(1−p私)l o g (1−p私"))ここでpi p_ip私本当の結果です、pi′p_i ^ {'}p私"ネットワーク出力値、つまり分類確率です。 -
Adamアルゴリズムを使用して、損失関数を最適化します。
-
合計20,000回の反復が実行され、batchSizeサンプルが反復ごとにトレーニングされます。プログラムによって設定されたbatchSizeは2000です。これは、完全なトレーニングセットが5回の反復ごとに取得され、繰り返されることを意味します。
コード
import tensorflow.compat.v1 as tf
import numpy as np
tf.disable_eager_execution()
dataNum = 10000 # 数据集大小为10000
batchSize = 2000 # 每次训练的batch为2000
trainData = np.random.randn(dataNum, 2) # 产生有两个特征的数据集, shape为(10000, 2)
trainLabel = np.array([int(x+y>0) for (x,y) in trainData]).reshape(-1, 1) # 若x+y>0归为1类, 否则归为0类
x = tf.placeholder(dtype='float', shape=[None, 2]) # 输入数据用占位函数,特征维度为2,None根据输入的batch自动判定
trueY = tf.placeholder(dtype='float', shape=[None, 1]) # 输出数据用占位函数
# 第一层全连接层
wFc1 = tf.Variable(tf.truncated_normal(shape=(2, 20), stddev=0.1)) # 初始化第一层的w,第一层神经元个数为20
bFc1 = tf.Variable(tf.constant(0.1, shape=[20])) # 初始化第一层的b
hFc1 = tf.nn.relu(tf.matmul(x, wFc1) + bFc1) # 激活函数选用relu函数
# 第二层全连接层
wFc2 = tf.Variable(tf.truncated_normal(shape=(20, 1), stddev=0.1)) # 初始化第二层的w,输出维度为1
bFc2 = tf.Variable(tf.constant(0.1, shape=[1])) # 初始化第二层的的b
predY = tf.nn.sigmoid(tf.matmul(hFc1, wFc2) + bFc2) # 输出选用sigmoid函数,把结果压缩到[0,1]区间,表示分类为1的概率值
# 定义损失函数,loss采用binary_cross_entropy(二值交叉熵)
# tf.clip_by_value(y, min, max)为剪枝函数,小于min取min,大于max取max,其余保持不变,防止log中出现0
loss = -tf.reduce_mean((trueY * tf.log(tf.clip_by_value(predY, 1e-10, 1))+ (1-trueY) * tf.log(tf.clip_by_value(1-predY, 1e-10, 1))))
trainStep = tf.train.AdamOptimizer(1e-3).minimize(loss) # 定义优化器优化目标
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 初始化所有变量
iters = 20000 # 迭代次数为20000次
for i in range(iters):
x_ = trainData[(i % 5) * batchSize:((i % 5) + 1) * batchSize, :] # 每次取batchSize个训练样本,每5次迭代重复整个训练集
y_ = trainLabel[(i % 5) * batchSize:((i % 5) + 1) * batchSize, :]
trainStep.run(feed_dict={
x: x_, trueY: y_}) # 拿batchSize个样本进行训练
if(i % 1000 == 0):
crossEntropy = loss.eval(feed_dict={
x: trainData, trueY: trainLabel}) # 每一千次迭代输出在整个训练集上的loss
print('iter:%d, loss: %g' % (i, crossEntropy))
運用結果
iter:0, loss: 0.669061
iter:1000, loss: 0.0590102
iter:2000, loss: 0.0314588
iter:3000, loss: 0.0210427
iter:4000, loss: 0.0154069
iter:5000, loss: 0.0118919
iter:6000, loss: 0.00953395
iter:7000, loss: 0.00789001
iter:8000, loss: 0.00671841
iter:9000, loss: 0.00586595
iter:10000, loss: 0.00523055
iter:11000, loss: 0.00474468
iter:12000, loss: 0.00436347
iter:13000, loss: 0.00405675
iter:14000, loss: 0.00380408
iter:15000, loss: 0.00359156
iter:16000, loss: 0.00340953
iter:17000, loss: 0.00325123
iter:18000, loss: 0.00311178
iter:19000, loss: 0.0029876
結果から、反復回数が増えると、トレーニングセット上のニューラルネットワークのトレーニングエラーがますます小さくなり、プログラム設定が正しいことがわかります。
総括する
ニューラルネットワークをトレーニングするプロセスは、次の3つのステップに分けることができます。
- ニューラルネットワーク構造と順方向伝搬の出力結果を定義します。
- 損失関数と逆伝播の最適化アルゴリズムを定義します。
- セッションを生成し、トレーニングデータに対して逆伝播最適化アルゴリズムを繰り返し実行します。
結論:上記のコンテンツとコードには、独自の考えと検証が追加されています。不適切な点がある場合は、訂正してください。
再版へようこそ、ソースを示してください。