Keras에서 FReLU를 사용해보기

18312 단어 KerasFReLU

소개



「tf.keras로 FReLU를 구현」의 기사를 쓰고 있는 분이 계셨으므로, 그것을 사용해 보려고 생각합니다.
htps : // 코 m / 나비 t 또는 p 타이 / / ms / 26304b5 a5 401db5 바 2

MNIST의 판정을 해본다



FReLU()와 그로부터 불리는 max_unit()는 위의 기사를 그대로 사용합니다. (만약 시도하면 먼저 실행하십시오)
Functional 모델로 구현되어 있기 때문에 Functional 모델로 작성합니다.
from tensorflow.keras.layers import Input, Activation
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D
from tensorflow.keras.layers import Dense, Dropout, BatchNormalization
from tensorflow.keras.optimizers import Adam

def createModel():
  main_input = Input(shape=(28,28,1,), name='main_input')
  x = Conv2D(32, kernel_size=(3, 3), padding='same')(main_input)
  x = FReLU(x)
  x = Conv2D(32, kernel_size=(3, 3), padding='same')(x)
  x = FReLU(x)

  x = MaxPooling2D()(x)

  x = Conv2D(32, kernel_size=(3, 3), padding='same')(x)
  x = FReLU(x)
  x = Conv2D(32, kernel_size=(3, 3), padding='same')(x)
  x = FReLU(x)

  x = MaxPooling2D()(x)

  x = Conv2D(32, kernel_size=(3, 3), padding='same')(x)
  x = FReLU(x)
  x = Conv2D(32, kernel_size=(3, 3), padding='same')(x)
  x = FReLU(x)

  x = GlobalAveragePooling2D()(x)
  x = Dense(units=10, activation='softmax')(x)

  return Model(inputs=[main_input], outputs=[x])

MNIST의 데이터를 로드하고 가공합니다.
import tensorflow.keras as keras
mnist = keras.datasets.mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

import numpy as np
train_images_norm = (train_images / 255.0).astype(np.float16)
test_images_norm = (test_images / 255.0).astype(np.float16)

train_images_norm_rs = train_images_norm.reshape(-1, 28, 28, 1)
test_images_norm_rs  = test_images_norm.reshape(-1, 28, 28, 1)

train_labels_ct = keras.utils.to_categorical(train_labels, 10)
test_labels_ct = keras.utils.to_categorical(test_labels, 10)


이번에도 「Raspberry Pi로 시작하는 기계 학습 기초부터 딥 러닝까지」에 실려 있던 학습 결과의 표시용 함수를 사용합니다.
import matplotlib.pyplot as plt
def plotHistory(history):
    # 損失関数のグラフの軸ラベルを設定
    plt.xlabel('time step')
    plt.ylabel('loss')
    # グラフ縦軸の範囲を0以上と定める
    plt.ylim(0, max(np.r_[history.history['val_loss'], history.history['loss']]))
    # 損失関数の時間変化を描画
    val_loss, = plt.plot(history.history['val_loss'], c='#56B4E9')
    loss, = plt.plot(history.history['loss'], c='#E69F00')
    # グラフの凡例(はんれい)を追加
    plt.legend([loss, val_loss], ['loss', 'val_loss'])
    # 描画したグラフを表示
    plt.show()

모델 작성 및 컴파일 후 학습을 실행합니다.
from tensorflow.keras.callbacks import EarlyStopping

model = createModel()
# モデルのコンパイル
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.0001), metrics=['accuracy'])
model.summary()
# モデルの学習
early_stopping = EarlyStopping(monitor='val_loss', mode='min', patience=30)

plotHistory(
  model.fit(
    train_images_norm_rs
    ,train_labels_ct
    ,epochs=500
    ,validation_split=0.1
    ,batch_size=1000
    ,verbose=2
    ,callbacks=[early_stopping]
  ) 
)



판정을 해 봅니다.
result_pred = model.predict(test_images_norm_rs, verbose=0)

result = np.argmax(result_pred, axis=1)

print('ターゲット')
print(test_labels)
print('ディープラーニングによる予測')
print(result)

# データ数をtotalに格納
total = len(test_images_norm_rs)
# ターゲット(正解)と予測が一致した数をsuccessに格納
success = sum(result==test_labels)

# 正解率をパーセント表示
print('正解率')
print(100.0*success/total)



결과



적당하게 만든 모델이었습니다만, 99%의 정답률이 되었습니다.

좋은 웹페이지 즐겨찾기