Lec-07 application and tips


Learning rate


:Gradient,チルト
:学習率と傾斜の関連関係により,学習に適したモデル値を見つけることができる.
:hyper-parameter(モデルを作成するための設定値)=モデルを作成するために最適化する方法
:どの程度の傾斜と移動距離で最適な位置を得ることができます.
Tensorflow Code
def grad(hypothesis, labels):	# 가설, 실제 답
	with tf.GradientTape() as tape:
    		loss_value = loss_fn(hypothesis, labels)	# loss_value = Cost
        return tape.gradient(loss_value, [W,b])	# 가설 값과 실제 값의 차이를 
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
optimizer.apply_gradients(grads_and_vars=zip(grads, [W,b]))	# learning_rate와 gradient값을 통해 우리가 원하는 모델의 최적의 값을 찾을 수 있음.
  • gradif:各位置に勾配値
  • がある
  • learning rate:一度にどれだけ移動するかの設定値によって、異なる値
  • が表示されます.
  • learning rate値が大きいほど移動量が大きくなり、オーバーシュート量が大きい
  • learningrate値が小さいほど、緩やかな低下に適しています.0.01を多く使う.
    3 e-4:0.0003 Adamの最適学習率.
  • Tensorflow Code
    optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.01)
    learning rate decay
    :良い学習率値が得られても、学習過程で学習率値を適切に調整することが重要です
    :学習の過程でコスト値が徐々に下がり始め、下がる過程で、ある瞬間学習できないことがある.
    :このとき学習率値を調節することで学習率を低下させるのが学習率減衰法である.
    異なる減衰方法
    1.Stepフォールオフ:N epochor validation loss->各スタッフの幅に合わせて学習速度を調整する
    2. Exponential decay
    3. 1/t decay
    Tensorflow Code
    learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step, 1000, 0.96, staircase)	# (시작 값, 전체 스탭, 몇 번째 스탭마다, 얼마만큼 learning rate값을 조절할건지)

    Data preprocessing

  • Feature Scaling
    :データ前処理方法
  • は、入力変数の大きさを一定範囲で変化させるように調整できる
  • 標準化:x値の平均値を標準偏差で割る->平均値がどれだけ下がったかを示す.
  • Normalization:実際のx値から最小値と最大最小値の差を減算->0から1までのデータを均一に分布させる.
  • Python Code(numpy)
    Standardization = (data - np.mean(data) / sqrt(np.sum((data - np.mean(data))^2) / np.count(data))
    Normarlization = (data - np.min(data, 0)) / (np.max(data, 0) - np.min(data, 0))
    :標準化と標準化により、不要なデータを同じ表面に均一に表示します.
    前処理例:不要なデータの排除(Noisy Data)
    1. Numeric
    2. NLP
    3. Face Image

    Overfitting


    :コーディネートが行き過ぎます.
    :モデルが仮定に合致するにつれて、実際のモデルを作成する過程で評価を行い、評価が進むにつれてモデルが徐々に上昇し、モデルの精度はある程度になります.
    :この場合、実際のモデルを作成する過程で、私たちが使用しているデータのみを使用して評価するため、データに基づいてモデルをよりよく作成することができますが、実際にはモデルを作成する過程で、新しいデータを作成することができます.すなわち,モデル学習に用いられていない新しいデータで学習すると,学習が深まるにつれてテスト中の精度が低下する.
    :理想的なモデルを作成する上で、最も重要なのはテストデータと評価データが最も正確であることを確保することです.
    High bias(underfit)
    :学習不足
    High variance(overfit)
    :データのみに基づいてモデルを作成します.
    :変化が大きい
    Set a feature->オーバーフィットの問題の解決方法
    :Get more training data(追加データの追加方法)
    :Smaller set of features(featureの使用が少ない):各属性の意味を明確にするために次元を縮小する(PCA)
    :追加プロパティ(追加プロパティ):モデルを最適化します.
    sklearn Code
    from sklearn.decomposition import PCA
    pca = decomposition.PCA(n_components=3)
    pca.fit(X)
    X = pca.transform(X)
    ルール(Add term to loss:特定の値を追加することで指定)
    λ--: fixes high bias (Under fitting)
    λ++: fixes high variance (overfitting)
    :ウェイト自体を学習すると同時に、正規化プロセスによってコスト値を徐々に繰り返し、termをloss値に調整して、オーバーフィットを避ける
    Tensorflow Code
    L2_loss = tf.nn.12_loss(w)	#output = sum(t ** 2) / 2
    Ovefitting Solutions
    :Feature Normalization(フィーチャーを正規化)
    :Regularization(特定の値と損失値を拡大することによってモデルの特定の重みをよりよく規範化する方法)
    :データの移動(データの強化:データの追加)
  • Color Jiltering
  • Horizontal Flips(フリップ)
  • Random Crops/Scales(サイズが適切かピッチが大きい)
  • : Dropout (0.5 is common)
    : Batch Normalization
    Tensorflow Code
    import tensorflow.contrib.eager as tfe
    tf.enable_eager_execution()

    Code(Eager)


    Data Preprocess
    xy = np.array([[828.659973, 833.450012, 908100, 828.349976, 831.659973],
    	     [823.02002, 828.070007, 1828100, 821.655029, 828.070007],
                 [819.929993, 824.400024, 1438100, 818.97998, 824.159973],
                 [816, 820.958984, 1008100, 815.48999, 819.23999],
                 [819.359985, 823, 1188100, 818.469971, 818.669983],
                 [819, 823, 1198100, 816, 820.450012],
                 [811.700012, 815.25, 1098100, 809.780029, 813.669983],
                 [809.51001, 816.659973, 1398100, 804.539978, 809.559998]])
                
    x.train = xy[:, 0:-1]
    y_train = xy[:, [-1]]
    
    def normalization(data):	# 0~1 데이터 정규화
    	numerator = data - np.min(data, 0)
        	dominator = np.max(data, 0) - np.min(data, 0)
        	return numerator / denominator
        
    xy = normalization(xy)			
    L2 Norm
    dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train).batch(len(x_train))
    
    W = tf.Variable(tf.random_normal([4, 1]), dtype=tf.float32)
    b = tf.Variable(tf.random_normal([1]), dtype=tf.float32)
    
    def linearReg_fn(features):	#Linear Regression에 맞는 hypothesis 구하기
    	hypothesis = tf.matmul(feature, W) + b
        	return hypothesis
        
    def l2_loss(loss, beta = 0.01):
    	W_reg = tf.nn.12_loss(W)	# output = sum(t ** 2) / 2
        	loss = tf.reduce_mean(loss + W_reg * beta)
        	return loss	# 정규화된 l2_loss 값을 구함. 
        
    def loss_fn(hypothesis, labels, flag = False):	#Linear Regression에 대한 cost function
    	cost = tf.reduce_mean(tf.square(hypothesis - labels))	
        	# 실제 가설과 y값의 차이를 최소화하는 구간을 cost function을 통해서 구함.
        	# flag를 통해서 l2_loss를 적용할건지 말건지를 판단
        	if(flag):
        		cost = 12_loss(cost)
        	return cost
    Learning Decay
    is_decay = True
    starter_learning_rate = 0.1
    
    if(is_decay):
    	global_step = tf.Variable(0, trainable=False)
        	learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step, 50, 0.96, staircase=True)
            optimizer = tf.train.GradientDescentOptimizer(learning_rate)
    else:
    	optimizer = tf.train.GradientDescentOptimizer(learning_rate=starter_learning_rate)
        
    def grad(features, labels, 12_flag):
    	with tf.GradientTape() as tape:
        		loss_value = loss_fn(linearReg_fn(features),labels, 12_flag)
        	return tape.gradient(loss_value, [W,b]), loss_value
            
    for step in range(EPOCHS):
    	for features, labels in tfe.Iterator(dataset):
        		features = tf.cast(features, tf.float32)
                labels = tf.cast(labels, tf.float32)
                grads, loss_Value = grad(linearReg_fn(features), features, labels, False)
                optimizer.apply_gradients(grads_and_vars=zip(grads,[W,b]), global_step=global_step)
                if step % 10 == 0:
                	print("Iter: {}, Loss: {:.4f}, Learning Rate: {:.8f}".format(step, loss_value, optimizer._learning_rate())) 
    Summary
    : Learning rate
  • Gradient#cost値最適モデル-Gradient x学習率の決定
  • Good and Bad learningrate#適切な学習率値を得ることが重要
  • Annealing the learning rate(Decay)#learning rate値の調整が重要
  • : Data preprocessing
  • 標準化/標準化#標準化
  • Noisy Data#必要なデータのみ抽出
  • : Overfitting
  • Set a Features#調整特徴値
  • Regularization#標準化
  • Data sets


    Training and Validation
    :学習に使用するデータと評価に使用するデータを整理することが最も重要です.
    Good Case
    :モデルのパフォーマンスの向上が必要
    :HyperParameterとNetwork Structureで99%のモデルを作成し、同じデータのテストを繰り返します.
    Tensorflow Code
    mnist = tf.keras.datasets.mnist
    (x_train, y_train), (x_test, y_test) = mnist.load_data()	#60,000 training / 10,000 testing images
    model.fit(x_train, y_train, validation_split=0.2, epochs=5)	# 20% Val data
    :layerを作成し、学習率を決定し、オプティマイザを宣言した後、ある程度モデルをよりよく生成できます.
    Evaluating a hypothesis
    :ある程度モデリングを選択した後、新しいデータを直接作成してモデルをテストできます.
    :ex)同じ人の異なる角度/表情を見て、よく区別します.
    :testデータ自体は学習中に検証される評価データを構成していますが、実際のモデルを新しいデータで検証するプロセスは非常に重要です.
    Tensorflow Code
    test_acc = accuracy_fn(softmax_fn(x_test), y_test)	# define hypothesis and test
    model.evaluate(x_test, y_test)	# Keras
    :学習データと評価データによるモデルの作成
    Anomaly検出(異常検出)
    :ヘルスデータを使用したモデルの作成
    :新しい、特殊なデータがある場合、モデルのデータが理想的であれば、Anomalyが検出される

    Learning


    Online vs Batch
    :オンライン学習:インターネット接続から学習へのデータの変化
    :オフラインラーニング-データが静的である場合にモデルを作成する

    Fine Tuning/Feature Extraction
    1. Original Model
    :白人を区別するモデルを作るとき、白人モデルが入ってくると、よく区別されます.
    :既存のモードでは、黄人や黒人が入ってくると区別がつかない.
    2. Fine-tunning
    :既存の顔を区別するモデルでは、黄色人と黒人のデータを入力するときによく区別できるように、既存の重み値を調整します.
    3. Feature Extraction
    :新しいタスクのみを学習します.
    Efficient Models
    :有効なモデルを作成することが重要です
    :推理時間を最大限に短縮することが重要
    :推理に大きな影響を及ぼすモデルの重み値を簡略化することが重要
    :全接続レイヤのパラメータ値が大きいため、通常は1 x 1ボリュームを使用して代わります.
    :ネットを押して、Mobilenetの論文がたくさん出てきました.
    Tensorflow Code
    tf.nn.depthwise_conv2d(input, filter, strides, padding)

    Sample Data


    Fashion MNIST-Image Classification
    #Tensorflow Code
    fashion_mnist = keras.datasets.fashion_mnist	# keras-> fashion_mnist library 제공
    (train_iamges, train labels), (test_images, test_labels) = fashion_mnist.load_data()
    
    class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Cost', 'Sandal', 'shirt', 'Sneaker', 'Bag', 'Ankle boot']	# 0~9까지 vector 변환
    
    train_images = train_images / 255.0	# (60000, 28, 28)	# 0~1까지로 정규화
    test_images = test_images / 255.0	# (10000, 28, 28)	# 0~1까지로 정규화
    
    model = keras.Sequential([
    	keras.layers.Flatten(input_shape=(28, 28)	# 학습을 위한 모델을 펴줌
        	keras.layers.Dense(128, activation=tf.nn.relu),	# 128개의 layer 선언
        	keras.layers.Dense(10, activation=tf.nn.softmax) # 10개의 클래스로 구분하는 모델 생성
    ])
    
    model.compile(optimize='adam',
    	      loss='sparse_categorical_crossentropy',
                  mertircs=['accuracy'])
                  
    model.fit(train_images, train_labels, epochs=5)	# 5번 모델 훈련
    test_loss, test_acc = model.evaluate(test_images, test_labels)
    predictions = model.predict(test_images)
    np.argmax(predictions[0])	# 9 label
    IMDB-Text Classification
    : IMDB(Internet Movie Data Base)
    :実際に映画を見たとき、映画に対する評価をよりよく分離するために、モデルを作ることができます.
    # Tensorflow Code
    imdb = keras.datasets.imdb
    (train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)	# 10000개의 단어로 구성
    word_index = imdb.get_word_index()
    # The first indices are reserved
    # 자연어 처리를 위한 전처리 과정
    word_index = {k:(v+3) for k,v in word_index.item()}
    word_index = ["<PAD>"] = 0	# 공백에 대한 값 vector로 선언
    word_index = ["<START>"] = 1	# 시작 값
    word_index = ["<UNK>"] = 2	# unknown	# 모르는 값
    word_index = ["<UNUSED>"] = 3	# 사용되지 않은 값
    reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
    
    train_data = keras.preprocessing.sequence.pad_sequences(train_data, value=word_index["<PAD>"], padding="post", maxlen=256)
    
    model = keras.Sequential()
    model.add(keras.layers.Embedding(vocab_size, 16))
    model.add(keras.layers.GlobalAveragePooling10())
    model.add(keras.layers.Dense(16, activation=tf.nn.relu))
    model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))
    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy", metrics=['accuracy'])
    
    model.fit(partial_x_train, partial_y_train, epochs=40, validation_data=(x_val, y_val))
    CIFAR-100
    from keras.datasets import cifar100
    (x_train, y_train), (x_test, y_test) = cifar100.load_data(label_mode='fine')
    # 100개의 클래스에 대해서 직접 test 가능
    Summary
    : Data sets
  • トレーニング/検証/テスト#学習用データ/評価
  • Evaluang a仮定#仮定評価
  • Anomaly Detection#異常検出
  • : Learning
  • Online Learningvs Batch Learning#リアルタイム学習/固定データ
  • Fine tuning/Feature Extraction#新しいデータを追加し、重みを微調整/既存モデルから対応する特徴を抽出し、新しい学習層
  • を作成
  • Effective Models#軽量級型番
  • : Sample Data
  • Fashion MNIST/IMDB/CIFAR-100
  • すべての人のために準備された第2四半期-TensorFlow
    すべての人のために準備された第2四半期-TensorFlow
    すべての人のために準備された第2四半期-TensorFlow
    すべての人のために準備された第2四半期-TensorFlow
    すべての人のために準備された第2四半期-TensorFlow