TensorFlow 2.0 keras 트레이닝 모델 사용의 실현

1. 일반적인 모델 구조, 훈련, 테스트 절차


#  
inputs = keras.Input(shape=(784,), name='mnist_input')
h1 = layers.Dense(64, activation='relu')(inputs)
h1 = layers.Dense(64, activation='relu')(h1)
outputs = layers.Dense(10, activation='softmax')(h1)
model = keras.Model(inputs, outputs)
# keras.utils.plot_model(model, 'net001.png', show_shapes=True)

model.compile(optimizer=keras.optimizers.RMSprop(),
    loss=keras.losses.SparseCategoricalCrossentropy(),
    metrics=[keras.metrics.SparseCategoricalAccuracy()])

#  
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') /255
x_test = x_test.reshape(10000, 784).astype('float32') /255

x_val = x_train[-10000:]
y_val = y_train[-10000:]

x_train = x_train[:-10000]
y_train = y_train[:-10000]

#  
history = model.fit(x_train, y_train, batch_size=64, epochs=3,
   validation_data=(x_val, y_val))
print('history:')
print(history.history)

result = model.evaluate(x_test, y_test, batch_size=128)
print('evaluate:')
print(result)
pred = model.predict(x_test[:2])
print('predict:')
print(pred)


2. 사용자 정의 손실 및 지표


사용자 정의 지표는 Metric 클래스를 계승하고 함수를 다시 쓰기만 하면 된다
_init_(self), 초기화.
update_state(self, y_true, y_pred, sample_weight = None), 대상 y_ 사용true 및 모델 예측 y_pred로 상태 변수를 업데이트합니다.
result (self), 상태 변수를 사용하여 최종 결과를 계산합니다.
reset_states(self), 도량의 상태를 초기화합니다.

#  , CatgoricalTruePositives , 

class CatgoricalTruePostives(keras.metrics.Metric):
 def __init__(self, name='binary_true_postives', **kwargs):
  super(CatgoricalTruePostives, self).__init__(name=name, **kwargs)
  self.true_postives = self.add_weight(name='tp', initializer='zeros')
  
 def update_state(self, y_true, y_pred, sample_weight=None):
  y_pred = tf.argmax(y_pred)
  y_true = tf.equal(tf.cast(y_pred, tf.int32), tf.cast(y_true, tf.int32))
  
  y_true = tf.cast(y_true, tf.float32)
  
  if sample_weight is not None:
   sample_weight = tf.cast(sample_weight, tf.float32)
   y_true = tf.multiply(sample_weight, y_true)
   
  return self.true_postives.assign_add(tf.reduce_sum(y_true))
 
 def result(self):
  return tf.identity(self.true_postives)
 
 def reset_states(self):
  self.true_postives.assign(0.)
  

model.compile(optimizer=keras.optimizers.RMSprop(1e-3),
    loss=keras.losses.SparseCategoricalCrossentropy(),
    metrics=[CatgoricalTruePostives()])

model.fit(x_train, y_train,
   batch_size=64, epochs=3)

#  loss
class ActivityRegularizationLayer(layers.Layer):
 def call(self, inputs):
  self.add_loss(tf.reduce_sum(inputs) * 0.1)
  return inputs

inputs = keras.Input(shape=(784,), name='mnist_input')
h1 = layers.Dense(64, activation='relu')(inputs)
h1 = ActivityRegularizationLayer()(h1)
h1 = layers.Dense(64, activation='relu')(h1)
outputs = layers.Dense(10, activation='softmax')(h1)
model = keras.Model(inputs, outputs)
# keras.utils.plot_model(model, 'net001.png', show_shapes=True)

model.compile(optimizer=keras.optimizers.RMSprop(),
    loss=keras.losses.SparseCategoricalCrossentropy(),
    metrics=[keras.metrics.SparseCategoricalAccuracy()])
model.fit(x_train, y_train, batch_size=32, epochs=1)

#  metric
class MetricLoggingLayer(layers.Layer):
 def call(self, inputs):
  self.add_metric(keras.backend.std(inputs),
      name='std_of_activation',
      aggregation='mean')
  
  return inputs

inputs = keras.Input(shape=(784,), name='mnist_input')
h1 = layers.Dense(64, activation='relu')(inputs)
h1 = MetricLoggingLayer()(h1)
h1 = layers.Dense(64, activation='relu')(h1)
outputs = layers.Dense(10, activation='softmax')(h1)
model = keras.Model(inputs, outputs)
# keras.utils.plot_model(model, 'net001.png', show_shapes=True)

model.compile(optimizer=keras.optimizers.RMSprop(),
    loss=keras.losses.SparseCategoricalCrossentropy(),
    metrics=[keras.metrics.SparseCategoricalAccuracy()])
model.fit(x_train, y_train, batch_size=32, epochs=1)


#  model 
#  metric
class MetricLoggingLayer(layers.Layer):
 def call(self, inputs):
  self.add_metric(keras.backend.std(inputs),
      name='std_of_activation',
      aggregation='mean')
  
  return inputs

inputs = keras.Input(shape=(784,), name='mnist_input')
h1 = layers.Dense(64, activation='relu')(inputs)
h2 = layers.Dense(64, activation='relu')(h1)
outputs = layers.Dense(10, activation='softmax')(h2)
model = keras.Model(inputs, outputs)

model.add_metric(keras.backend.std(inputs),
      name='std_of_activation',
      aggregation='mean')
model.add_loss(tf.reduce_sum(h1)*0.1)

# keras.utils.plot_model(model, 'net001.png', show_shapes=True)

model.compile(optimizer=keras.optimizers.RMSprop(),
    loss=keras.losses.SparseCategoricalCrossentropy(),
    metrics=[keras.metrics.SparseCategoricalAccuracy()])
model.fit(x_train, y_train, batch_size=32, epochs=1)
처리 사용 validation_u데이터 전송 테스트 데이터,validation_u 사용 가능split 구분 검증 데이터
ps:validation_split는numpy 데이터로 훈련된 상황에서만 사용할 수 있습니다

model.fit(x_train, y_train, batch_size=32, epochs=1, validation_split=0.2)


3. tf를 사용한다.데이터 구조 데이터


def get_compiled_model():
 inputs = keras.Input(shape=(784,), name='mnist_input')
 h1 = layers.Dense(64, activation='relu')(inputs)
 h2 = layers.Dense(64, activation='relu')(h1)
 outputs = layers.Dense(10, activation='softmax')(h2)
 model = keras.Model(inputs, outputs)
 model.compile(optimizer=keras.optimizers.RMSprop(),
     loss=keras.losses.SparseCategoricalCrossentropy(),
     metrics=[keras.metrics.SparseCategoricalAccuracy()])
 return model
model = get_compiled_model()
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)

val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val))
val_dataset = val_dataset.batch(64)

# model.fit(train_dataset, epochs=3)
# steps_per_epoch  epoch 
# validation_steps  , 
model.fit(train_dataset, epochs=3, steps_per_epoch=100,
   validation_data=val_dataset, validation_steps=3)


4. 샘플 가중치와 클래스 가중치


'샘플 가중치'그룹은 일괄 처리에서 각 샘플이 총 손실을 계산할 때 얼마나 많은 가중치를 가져야 하는지를 지정하는 숫자 그룹입니다.그것은 통상적으로 불균형적인 분류 문제에 쓰인다.사용 권한이 1과 0일 때, 이 수조는 손실 함수의 마스크로 사용할 수 있다. (일부 견본이 총 손실에 기여한 바를 완전히 버리고)
'클래스 권중'dict는 같은 개념의 더욱 구체적인 실례이다. 클래스 인덱스를 이 클래스에 속하는 샘플에 사용할 샘플 권중에 비추는 것이다.예를 들어 클래스'0'이 데이터의 클래스'1'보다 두 배 적으면class_weight = {0:1.,1:0.5}.

#  5 
import numpy as np
#  
model = get_compiled_model()
class_weight = {i:1.0 for i in range(10)}
class_weight[5] = 2.0
print(class_weight)
model.fit(x_train, y_train,
   class_weight=class_weight,
   batch_size=64,
   epochs=4)
#  
model = get_compiled_model()
sample_weight = np.ones(shape=(len(y_train),))
sample_weight[y_train == 5] = 2.0
model.fit(x_train, y_train,
   sample_weight=sample_weight,
   batch_size=64,
   epochs=4)

# tf.data 
model = get_compiled_model()

sample_weight = np.ones(shape=(len(y_train),))
sample_weight[y_train == 5] = 2.0

train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train,
             sample_weight))
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)

val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val))
val_dataset = val_dataset.batch(64)

model.fit(train_dataset, epochs=3, )

5. 다수입 다수출 모델


image_input = keras.Input(shape=(32, 32, 3), name='img_input')
timeseries_input = keras.Input(shape=(None, 10), name='ts_input')

x1 = layers.Conv2D(3, 3)(image_input)
x1 = layers.GlobalMaxPooling2D()(x1)

x2 = layers.Conv1D(3, 3)(timeseries_input)
x2 = layers.GlobalMaxPooling1D()(x2)

x = layers.concatenate([x1, x2])

score_output = layers.Dense(1, name='score_output')(x)
class_output = layers.Dense(5, activation='softmax', name='class_output')(x)

model = keras.Model(inputs=[image_input, timeseries_input],
     outputs=[score_output, class_output])
keras.utils.plot_model(model, 'multi_input_output_model.png'
      , show_shapes=True)


#  loss metrics
model.compile(
 optimizer=keras.optimizers.RMSprop(1e-3),
 loss=[keras.losses.MeanSquaredError(),
   keras.losses.CategoricalCrossentropy()])

#  loss 
model.compile(
 optimizer=keras.optimizers.RMSprop(1e-3),
 loss={'score_output': keras.losses.MeanSquaredError(),
   'class_output': keras.losses.CategoricalCrossentropy()},
 metrics={'score_output': [keras.metrics.MeanAbsolutePercentageError(),
        keras.metrics.MeanAbsoluteError()],
    'class_output': [keras.metrics.CategoricalAccuracy()]},
 loss_weight={'score_output': 2., 'class_output': 1.})

#  loss 0
model.compile(
 optimizer=keras.optimizers.RMSprop(1e-3),
 loss=[None, keras.losses.CategoricalCrossentropy()])

# Or dict loss version
model.compile(
 optimizer=keras.optimizers.RMSprop(1e-3),
 loss={'class_output': keras.losses.CategoricalCrossentropy()})

6. 콜백 사용


Keras의 리셋은 훈련 기간(epoch가 시작될 때,batch가 끝날 때,epoch가 끝날 때 등)에 서로 다른 점에서 호출되는 객체로 다음과 같은 행동을 수행할 수 있습니다.
  • 교육 기간의 다양한 시점에 검증(내장된 기간별 검증을 초과)
  • 모델을 정기적으로 검사하거나 정밀도 한도값을 초과합니다
  • 훈련이 평온할 때 모형의 학습률을 바꾼다
  • 훈련이 평온한 것 같을 때 맨 윗부분을 미세하게 조정한다
  • 교육이 끝나거나 개성 에너지 한도값을 초과할 때 이메일이나 실시간 메시지 알림 등을 보냅니다
  • 사용 가능한 내장 콜백
  • ModelCheckpoint: 모델을 정기적으로 저장..
  • Earlystopping: 훈련이 검증 지표를 개선하지 않을 때 훈련을 중단한다..
  • TensorBoard: TensorBoard에 표시할 수 있는 모델 로그를 정기적으로 작성합니다(자세한 내용은 시각화 참조)
  • CSVLogger: 분실 및 지표 데이터 스트림을 CSV 파일로 전송합니다
  • .45, 6, 7, 917. 등등.

    6.1 콜백 사용

    
    model = get_compiled_model()
    
    callbacks = [
     keras.callbacks.EarlyStopping(
      # Stop training when `val_loss` is no longer improving
      monitor='val_loss',
      # "no longer improving" being defined as "no better than 1e-2 less"
      min_delta=1e-2,
      # "no longer improving" being further defined as "for at least 2 epochs"
      patience=2,
      verbose=1)
    ]
    model.fit(x_train, y_train,
       epochs=20,
       batch_size=64,
       callbacks=callbacks,
       validation_split=0.2)
    
    
    
    # checkpoint 
    model = get_compiled_model()
    check_callback = keras.callbacks.ModelCheckpoint(
     filepath='mymodel_{epoch}.h5',
     save_best_only=True,
     monitor='val_loss',
     verbose=1
    )
    
    model.fit(x_train, y_train,
       epochs=3,
       batch_size=64,
       callbacks=[check_callback],
       validation_split=0.2)
    
    
    
    #  
    initial_learning_rate = 0.1
    lr_schedule = keras.optimizers.schedules.ExponentialDecay(
     initial_learning_rate,
     decay_steps=10000,
     decay_rate=0.96,
     staircase=True
    )
    optimizer = keras.optimizers.RMSprop(learning_rate=lr_schedule)
    
    #  tensorboard
    tensorboard_cbk = keras.callbacks.TensorBoard(log_dir='./full_path_to_your_logs')
    model.fit(x_train, y_train,
       epochs=5,
       batch_size=64,
       callbacks=[tensorboard_cbk],
       validation_split=0.2)
    
    

    6.2 자체 콜백 작성 방법

    
    class LossHistory(keras.callbacks.Callback):
     def on_train_begin(self, logs):
      self.losses = []
     def on_epoch_end(self, batch, logs):
      self.losses.append(logs.get('loss'))
      print('
    loss:',self.losses[-1]) model = get_compiled_model() callbacks = [ LossHistory() ] model.fit(x_train, y_train, epochs=3, batch_size=64, callbacks=callbacks, validation_split=0.2)

    7. 자체 구조 훈련과 검증 순환

    
    # Get the model.
    inputs = keras.Input(shape=(784,), name='digits')
    x = layers.Dense(64, activation='relu', name='dense_1')(inputs)
    x = layers.Dense(64, activation='relu', name='dense_2')(x)
    outputs = layers.Dense(10, activation='softmax', name='predictions')(x)
    model = keras.Model(inputs=inputs, outputs=outputs)
    
    # Instantiate an optimizer.
    optimizer = keras.optimizers.SGD(learning_rate=1e-3)
    # Instantiate a loss function.
    loss_fn = keras.losses.SparseCategoricalCrossentropy()
    
    # Prepare the training dataset.
    batch_size = 64
    train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
    train_dataset = train_dataset.shuffle(buffer_size=1024).batch(batch_size)
    
    #  
    for epoch in range(3):
     print('epoch: ', epoch)
     for step, (x_batch_train, y_batch_train) in enumerate(train_dataset):
      #  gradient tape,  
      with tf.GradientTape() as tape:
       logits = model(x_batch_train)
       
       loss_value = loss_fn(y_batch_train, logits)
       grads = tape.gradient(loss_value, model.trainable_variables)
       optimizer.apply_gradients(zip(grads, model.trainable_variables))
       
      if step % 200 == 0:
       print('Training loss (for one batch) at step %s: %s' % (step, float(loss_value)))
       print('Seen so far: %s samples' % ((step + 1) * 64))
    
    #  
    # Get model
    inputs = keras.Input(shape=(784,), name='digits')
    x = layers.Dense(64, activation='relu', name='dense_1')(inputs)
    x = layers.Dense(64, activation='relu', name='dense_2')(x)
    outputs = layers.Dense(10, activation='softmax', name='predictions')(x)
    model = keras.Model(inputs=inputs, outputs=outputs)
    
    # Instantiate an optimizer to train the model.
    optimizer = keras.optimizers.SGD(learning_rate=1e-3)
    # Instantiate a loss function.
    loss_fn = keras.losses.SparseCategoricalCrossentropy()
    
    # Prepare the metrics.
    train_acc_metric = keras.metrics.SparseCategoricalAccuracy() 
    val_acc_metric = keras.metrics.SparseCategoricalAccuracy()
    
    # Prepare the training dataset.
    batch_size = 64
    train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
    train_dataset = train_dataset.shuffle(buffer_size=1024).batch(batch_size)
    
    # Prepare the validation dataset.
    val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val))
    val_dataset = val_dataset.batch(64)
    
    
    # Iterate over epochs.
    for epoch in range(3):
     print('Start of epoch %d' % (epoch,))
     
     # Iterate over the batches of the dataset.
     for step, (x_batch_train, y_batch_train) in enumerate(train_dataset):
     with tf.GradientTape() as tape:
      logits = model(x_batch_train)
      loss_value = loss_fn(y_batch_train, logits)
     grads = tape.gradient(loss_value, model.trainable_variables)
     optimizer.apply_gradients(zip(grads, model.trainable_variables))
      
     # Update training metric.
     train_acc_metric(y_batch_train, logits)
    
     # Log every 200 batches.
     if step % 200 == 0:
      print('Training loss (for one batch) at step %s: %s' % (step, float(loss_value)))
      print('Seen so far: %s samples' % ((step + 1) * 64))
    
     # Display metrics at the end of each epoch.
     train_acc = train_acc_metric.result()
     print('Training acc over epoch: %s' % (float(train_acc),))
     # Reset training metrics at the end of each epoch
     train_acc_metric.reset_states()
    
     # Run a validation loop at the end of each epoch.
     for x_batch_val, y_batch_val in val_dataset:
     val_logits = model(x_batch_val)
     # Update val metrics
     val_acc_metric(y_batch_val, val_logits)
     val_acc = val_acc_metric.result()
     val_acc_metric.reset_states()
     print('Validation acc: %s' % (float(val_acc),))
    
    ##  loss,  loss
    class ActivityRegularizationLayer(layers.Layer):
     
     def call(self, inputs):
     self.add_loss(1e-2 * tf.reduce_sum(inputs))
     return inputs
     
    inputs = keras.Input(shape=(784,), name='digits')
    x = layers.Dense(64, activation='relu', name='dense_1')(inputs)
    # Insert activity regularization as a layer
    x = ActivityRegularizationLayer()(x)
    x = layers.Dense(64, activation='relu', name='dense_2')(x)
    outputs = layers.Dense(10, activation='softmax', name='predictions')(x)
    
    model = keras.Model(inputs=inputs, outputs=outputs)
    logits = model(x_train[:64])
    print(model.losses)
    logits = model(x_train[:64])
    logits = model(x_train[64: 128])
    logits = model(x_train[128: 192])
    print(model.losses)
    
    #  loss 
    optimizer = keras.optimizers.SGD(learning_rate=1e-3)
    
    for epoch in range(3):
     print('Start of epoch %d' % (epoch,))
    
     for step, (x_batch_train, y_batch_train) in enumerate(train_dataset):
     with tf.GradientTape() as tape:
      logits = model(x_batch_train)
      loss_value = loss_fn(y_batch_train, logits)
    
      # Add extra losses created during this forward pass:
      loss_value += sum(model.losses)
      
     grads = tape.gradient(loss_value, model.trainable_variables)
     optimizer.apply_gradients(zip(grads, model.trainable_variables))
    
     # Log every 200 batches.
     if step % 200 == 0:
      print('Training loss (for one batch) at step %s: %s' % (step, float(loss_value)))
      print('Seen so far: %s samples' % ((step + 1) * 64))
    Tensor Flow 2.0이keras 트레이닝 모델을 사용하는 실현에 관한 이 글은 여기까지 소개되었습니다. 더 많은 Tensor Flow 2.0keras 트레이닝 모델 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기