TensorFlow スタディ ノート - LeNet-5 モデルによる TensorFlow の予備的理解

#LeNet-5 学習記録

TensorFlow に初めて触れたとき、先輩の講義ノート https://blog.csdn.net/LLyj_/article/details/88933773 と別の先輩の説明を読んで、ちょっとした勉強ノートを記録しました。

1. LeNet-5

1. 入力層

2.C1層
#畳み込みの最初の層を作成します
#パラメータの数は5 * 5 * 1 * 32です。各5 * 5 * 1畳み込みカーネルはチャネルを取得でき、32 5 * 5 * 1畳み込みは32チャネルを取得できます
# 合計で 32 個の畳み込みカーネルがあり、パディングのサイズは「同じ」ままであるため、特徴マップのサイズは 28 * 28 * 32 です # 活性化関数はニューラル ネットワーク モデルの非線形性を増加させ
ます

    with tf.variable_scope("C1-conv",reuse=resuse):
    	# tf.get_variable共享变量
    	# [5, 5, 1, 32]卷积核大小为5×5×1,有32个
    	# stddev正太分布的标准差
        conv1_weights = tf.get_variable("weight", [5, 5, 1, 32],
                             initializer=tf.truncated_normal_initializer(stddev=0.1))	
        # tf.constant_initializer初始化为常数,这个非常有用,通常偏置项就是用它初始化的
        conv1_biases = tf.get_variable("bias", [32], initializer=tf.constant_initializer(0.0))
        # strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4
        # padding=’SAME’,表示padding后卷积的图与原图尺寸一致,激活函数relu()
        conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[1, 1, 1, 1], padding="SAME")
        relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_biases))

S2 レイヤー #
最初のプーリング レイヤーを作成します
#2 * 2 の最大プーリングは画像サイズを半分に減らすことができます
#プーリング後、14 * 14 * 32 を取得します

    # tf.name_scope的主要目的是为了更加方便地管理参数命名。
    # 与 tf.Variable() 结合使用。简化了命名
    with tf.name_scope("S2-max_pool",):
    	# ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],
    	# 因为我们不想在batch和channels上做池化,所以这两个维度设为了1
    	# strides:窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]
        pool1 = tf.nn.max_pool(relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")

C3層
#2層目の畳み込み層を作成
#1層目の畳み込み層と操作は同じ
#64個のバイアス項目をここで初期化
#2層目の畳み込みの畳み込みカーネル数は64
#得られる特徴マップは14 * 14 * 64

    with tf.variable_scope("C3-conv",reuse=resuse):
        conv2_weights = tf.get_variable("weight", [5, 5, 32, 64],
                                     initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv2_biases = tf.get_variable("bias", [64], initializer=tf.constant_initializer(0.0))
        conv2 = tf.nn.conv2d(pool1, conv2_weights, strides=[1, 1, 1, 1], padding="SAME")
        relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_biases))

S4 レイヤー #
2 番目のプーリング レイヤーを作成します
#再度縮小して 7 * 7 * 64 を取得します
#nodes=7 * 7 * 64 = 3136
#shape[0] は自動的に計算され、常に -1 に設定されます
#行列を線形に変更します

    with tf.name_scope("S4-max_pool",):
        pool2 = tf.nn.max_pool(relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
        # get_shape()函数可以得到这一层维度信息,由于每一层网络的输入输出都是一个batch的矩阵,
        # 所以通过get_shape()函数得到的维度信息会包含这个batch中数据的个数信息
        # shape[1]是长度方向,shape[2]是宽度方向,shape[3]是深度方向
        # shape[0]是一个batch中数据的个数,reshape()函数原型reshape(tensor,shape,name)
        shape = pool2.get_shape().as_list()
        nodes = shape[1] * shape[2] * shape[3]    # nodes=3136
        reshaped = tf.reshape(pool2, [shape[0], nodes])

C5 層 #
最初の全結合層を作成
# ここでの重みパラメーターはノード * 512、つまり 3136 * 512 です
# 行列を掛けて B * 512 を取得します。B はバッチ内のデータの数を表します

    with tf.variable_scope("layer5-full1",reuse=resuse):
        Full_connection1_weights = tf.get_variable("weight", [nodes, 512],
                                      initializer=tf.truncated_normal_initializer(stddev=0.1))
        # if regularizer != None:
        tf.add_to_collection("losses", regularizer(Full_connection1_weights))
        Full_connection1_biases = tf.get_variable("bias", [512],
                                                     initializer=tf.constant_initializer(0.1))     
        if avg_class ==None:
            Full_1 = tf.nn.relu(tf.matmul(reshaped, Full_connection1_weights) + \
                                                                   Full_connection1_biases)
        else:
            Full_1 = tf.nn.relu(tf.matmul(reshaped, avg_class.average(Full_connection1_weights))
                                                   + avg_class.average(Full_connection1_biases))

F6 層
#2 番目の全結合層を作成する

 with tf.variable_scope("layer6-full2",reuse=resuse):
         Full_connection2_weights = tf.get_variable("weight", [512, 10],
                                       initializer=tf.truncated_normal_initializer(stddev=0.1))                                             
         # if regularizer != None:
         tf.add_to_collection("losses", regularizer(Full_connection2_weights))
         Full_connection2_biases = tf.get_variable("bias", [10],
                                                    initializer=tf.constant_initializer(0.1))
         if avg_class == None:
             result = tf.matmul(Full_1, Full_connection2_weights) + Full_connection2_biases
        else:
            result = tf.matmul(Full_1, avg_class.average(Full_connection2_weights)) + \
                                                  avg_class.average(Full_connection2_biases)

出力層

2. まとめ

予備的な理解が少ししかなく、知識システムを改善するためのさらなる研究が必要です. 私は最初の研究の記録を深く理解していません. 多くの概念はまだ漠然としています. 今後の改善のために記録します. .

3. コードのソースとコード内のコメント

https://blog.csdn.net/LLyj_/article/details/88933773

おすすめ

転載: blog.csdn.net/Lianhaiyan_zero/article/details/89072797