신경 망 을 만 드 는 keras 와 tensorflow 방법 비교

한 학습 토론 팀 에서 tensor flow 를 사용 하여 네트워크 모델 을 만 들 때 tf. keras 와 tf. layers 를 사용 하 는 것 이 좋 습 니까?두말 없 이 코드 를 바로 올리다.
tensor flow 공식 MNIST 예 를 직접 가 져 와 비교:
1、tf.layers
def model_fn(features, labels, mode, config):
    """
     tf.layers      
    :param features:     
    :param labels:   
    :param mode:   :tf.estimator.ModeKeys:TRAIN、EVAL、PREDICT
    :param config
    :return:
    """
    #    -1    28x28    1
    batch_size = -1
    image_width = 28
    image_height = 28
    channels = 1
    class_num = 10
    learning_rate = 1e-4
    input_height = image_height
    input_width = image_width
    #    :
    input_layer = tf.reshape(features['x'], [batch_size, image_height, image_width, channels])
    #    1: 32  5x5     + ReLU    
    conv1 = tf.layers.conv2d(inputs=input_layer,
                             filters=32,
                             kernel_size=[5, 5],
                             padding='same',
                             activation=tf.nn.relu)
    #    1: 2x2     +    2
    pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
    input_height = input_height // 2
    input_width = input_width // 2
    #    2: 64  5x5     + ReLU    
    conv2 = tf.layers.conv2d(inputs=pool1,
                             filters=64,
                             kernel_size=[5, 5],
                             padding='same',
                             activation=tf.nn.relu)
    #    2
    pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
    input_height = int(input_height // 2)
    input_width = int(input_width // 2)
    pool2_flat = tf.reshape(pool2, [-1, input_height * input_width * 64])
    #    : 1024     +        0.4
    dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)
    dropout = tf.layers.dropout(inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)
    #    : 10         0-9
    logits = tf.layers.dense(inputs=dropout, units=class_num)

2、tf.keras
def create_model(data_format):
    """
     Keras      
    :param data_format:
    :return:
    """
    image_width = 28
    image_height = 28
    channels = 1
    class_num = 10
    if data_format == 'channels_first':
        # (batch, channels, height, width) default
        input_shape = [channels, image_height, image_width]
    else:
        # (batch, height, width, channels)
        assert data_format == 'channels_last'
        input_shape = [image_height, image_width, channels]
    layer = tf.keras.layers
    #    : pool_size=(2,2)  strides=(2,2)
    max_pool = layer.MaxPool2D((2, 2), (2, 2), padding='same', data_format=data_format)
    return tf.keras.Sequential([
        layer.Reshape(target_shape=input_shape,
                      input_shape=(image_height * image_width,)),
        layer.Conv2D(filters=32,
                     kernel_size=5,
                     padding='same',
                     data_format=data_format,
                     activation=tf.nn.relu),
        max_pool,
        layer.Conv2D(filters=64,
                     kernel_size=5,
                     padding='same',
                     data_format=data_format,
                     activation=tf.nn.relu),
        max_pool,
        layer.Flatten(),
        layer.Dense(1024, activation=tf.nn.relu),
        layer.Dropout(0.4),
        layer.Dense(class_num)
    ])

위의 두 단락 코드 에서 볼 수 있 듯 이 tf. layers 코드 가 약간 많 고 flat 층 의 shape 를 수 동 으로 계산 해 야 합 니 다.한편, tf. keras 는 비교적 간결 하고 스 트림 과 유사 한 네트워크 구축 방식 으로 모델 의 네트워크 를 간단명료 하 게 보 여 준다.
tensor flow 1.11.0 이 발표 되 었 을 때 keras 에 대한 지원 이 강화 되 었 습 니 다. tensor flow 는 keras 를 1 급 네트워크 조작 API 로 업그레이드 할 의향 이 있 음 을 알 수 있 습 니 다. keras 와 tensor flow 는 모두 google 이 므 로 합 리 적 인 자원 통합 을 통 해 tensor flow 의 생태 구 조 를 향상 시 킬 필요 가 있 습 니 다.사실 어떤 것 을 사용 하 든 좋 습 니 다. 자신 이 좋아 하 는 대로 개인 적 으로 keras 의 API 스타일 을 좋아 합 니 다.

좋은 웹페이지 즐겨찾기