これは、パラメータを変更することなく、複数で試験の精度は、98%に99.1%まで変化形而上
参考リンク:「シンプルで、粗Tensorflow」、ブラスタ
tensorflowインポートAS TF インポートnumpyのAS NP クラスMNISTLoader(): DEF __init __(自己): MNIST = tf.keras.datasets.mnist (self.train_data、self.train_label)、(self.test_data、self.test_label) = MNIST。 LOAD_DATA() #のMNIST画像のデフォルトがuint8(0 -255数)。それらの0-正規化された次のコードは、浮動小数点数1とカラー次元チャンネルとして最後に追加間 self.train_data = np.expand_dims(self.train_data.astype(np.float32)/ 255.0、軸= - 1)#[ 60000、28、28、1 ] self.test_data = np.expand_dims(self.test_data.astype(np.float32)/ 255.0、軸= - 。1)#[ 10000、28、28、1。] self.train_label = self.train_label.astype(np.int32) #[ 60000 ] self.test_label = self.test_label.astype(np.int32)#[ 10000 ] self.num_train_data、self.num_test_data = self.train_data.shape [ 0 ]、self.test_data.shape [ 0 ] DEF get_batch(セルフ、BATCH_SIZE): データ戻るからランダムに採取#濃縮BATCH_SIZE要素 インデックス= np.random.randint(0、np.shape(self.train_data)[ 0 ]、BATCH_SIZE) 戻りself.train_data [インデックス、:]、self.train_label [インデックス] #tf.keras.layers.Conv2D( #フィルタ、kernel_size、ストライド =(1、1)、パディング= ' 有効'、DATA_FORMAT = なし、 #dilation_rate =(1、1)、活性化=なし、use_bias = 真、 #kernel_initializer = ' glorot_uniform '、bias_initializer = ' ゼロ' 、 #kernel_regularizer =なし、bias_regularizer =なし、activity_regularizer = なし、 #kernel_constraint =なし、bias_constraint =なし、** kwargsから #) #フィルタ:整数、空間の次元フィルタの出力(出力IEザ・ナンバーでコンボリューション)。 #kernel_size:整数受容野またはアンタプルの/リスト2つの整数、ウィンドウ2D畳み込みの高さと幅を指定する。 #ストライド:垂直方向と水平方向のストライド #パディング:有効:廃棄されるコンボリューションカーネルのサイズのブロックを表していません。それは同じの大きさは、ブロック0、同じ形状の出力と入力作るのに十分ではありません畳み込みカーネルを表す クラス:CNN(tf.keras.Model) DEF __init __(自己を): スーパー()__ .__のinit() self.conv1 =tf.keras.layers.Conv2D( フィルタ、 = 32 、#ニューロン畳み込み(コンボリューション)数 kernel_size = [ 5、5 ]、#受容野サイズの パディング = ' と同じ' 、#パディングポリシー(又はvaild同じ) 活性化 = tf.nn.relu#活性化関数 ) self.pool = tf.keras.layers.MaxPool2D(POOL_SIZE = [ 2、2 ]、ストライド= 2 ) self.conv2 = tf.keras.layers.Conv2D( フィルタ = 64 = [ kernel_size 5、5 ]、 パディング = ' 同じ' 、 活性化 = tf.nn.relu ) self.flatten = tf.keras.layers.Reshape(target_shape =(7 * 7 * 64 )) self.dense1 = tf.keras .layers.Dense(単位= 1024、活性化= tf.nn.relu) self.dense2 = tf.keras.layers.Dense(単位= 10 ) DEF(自己、入力)呼び出し: X = self.conv1(入力)# [バッチサイズ、28、28、32 ] X = self.pool(X)#[BATCH_SIZE、14、14、32 ] X = self.conv2(X)#[BATCH_SIZE、14、14、64 ] X = self.pool(X)#[ BATCH_SIZE、7、7、64 ] X = self.flatten(X)#[BATCH_SIZE、7 * 7 * 64 ] X= self.dense1(X)#[BATCH_SIZE、1024 ] X = self.dense2(X)#[BATCH_SIZE、10 ] 出力 = tf.nn.softmax(X) リターン出力 num_epochs = 5 BATCH_SIZE = 50 learning_rate = 0.001 モデル = CNN() data_loader = MNISTLoader() オプティマイザ = tf.keras.optimizers.Adam(learning_rate = learning_rate) num_batches = INT(data_loader.num_train_data //* num_epochs BATCH_SIZE) 用 batch_index における範囲(num_batches): X-、Y = data_loader.get_batch(BATCH_SIZE)#は、ランダムデータからデータセットの部分を選択 tf.GradientTape()とAS :テープ y_pred = 予測値#与えるモデル(X-) 損失 tf.keras.losses.sparse_categorical_crossentropy =(Y = y_true、y_pred = y_pred)#損失算出 損失 = tf.reduce_mean(損失) プリント(" バッチ%のD:損失%F "%(batch_index、loss.numpy())) GrADSの = tape.gradient(損失、model.variables)#calc卒業生 optimizer.apply_gradientsは(grads_and_varsは =ZIP(GrADSの、model.variables))#update GrADSの #tf.keras.metrics.SparseCategoricalAccuracy推定器 #は理解していない理由をチェックバッチ予測値 sparse_categorical_accuracy = tf.keras.metrics.SparseCategoricalAccuracy() num_batches = INT(data_loader.num_test_data // BATCH_SIZE) 用 batch_index における範囲(num_batches): START_INDEX、END_INDEX = batch_index BATCH_SIZE *、(+ batch_index 。1)* BATCH_SIZEの #model.predictテストデータ入力、及び出力予測結果 y_pred = model.predict (data_loader.test_data [START_INDEX:END_INDEX]) sparse_categorical_accuracy.update_state(y_true = data_loaderを。 test_label [START_INDEX:END_INDEX] y_pred =y_pred) プリント(" 試験精度:%F "%のsparse_categorical_accuracy.result())