zoukankan      html  css  js  c++  java
  • TensorFlow2.0教程-keras 函数api

    1构建简单的网络

    1.1创建网络

    inputs = tf.keras.Input(shape=(784,), name='img')
    h1 = layers.Dense(32, activation='relu')(inputs)
    h2 = layers.Dense(32, activation='relu')(h1)
    outputs = layers.Dense(10, activation='softmax')(h2)
    model = tf.keras.Model(inputs=inputs, outputs=outputs, name='mnist model')
    
    model.summary()
    keras.utils.plot_model(model, 'mnist_model.png')
    keras.utils.plot_model(model, 'model_info.png', show_shapes=True)

    1.2训练、验证及测试

    (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
    model.compile(optimizer=keras.optimizers.RMSprop(),
                 loss='sparse_categorical_crossentropy', # 直接填api,后面会报错
                 metrics=['accuracy'])
    history = model.fit(x_train, y_train, batch_size=64, epochs=5, validation_split=0.2)
    test_scores = model.evaluate(x_test, y_test, verbose=0)
    print('test loss:', test_scores[0])
    print('test acc:', test_scores[1])

    1.3模型保持和序列化

    model.save('model_save.h5')
    del model
    model = keras.models.load_model('model_save.h5')

    2 使用共享网络创建多个模型

    在函数API中,通过在图层图中指定其输入和输出来创建模型。 这意味着可以使用单个图层图来生成多个模型。

    # 编码器网络和自编码器网络
    
    encode_input = keras.Input(shape=(28,28,1), name='img')
    h1 = layers.Conv2D(16, 3, activation='relu')(encode_input)
    h1 = layers.Conv2D(32, 3, activation='relu')(h1)
    h1 = layers.MaxPool2D(3)(h1)
    h1 = layers.Conv2D(32, 3, activation='relu')(h1)
    h1 = layers.Conv2D(16, 3, activation='relu')(h1)
    encode_output = layers.GlobalMaxPool2D()(h1)
    
    encode_model = keras.Model(inputs=encode_input, outputs=encode_output, name='encoder')
    encode_model.summary()
    
    h2 = layers.Reshape((4, 4, 1))(encode_output)
    h2 = layers.Conv2DTranspose(16, 3, activation='relu')(h2)
    h2 = layers.Conv2DTranspose(32, 3, activation='relu')(h2)
    h2 = layers.UpSampling2D(3)(h2)
    h2 = layers.Conv2DTranspose(16, 3, activation='relu')(h2)
    decode_output = layers.Conv2DTranspose(1, 3, activation='relu')(h2)
    
    autoencoder = keras.Model(inputs=encode_input, outputs=decode_output, name='autoencoder')
    autoencoder.summary()

    可以把整个模型,当作一层网络使用

    encode_input = keras.Input(shape=(28,28,1), name='src_img')
    h1 = layers.Conv2D(16, 3, activation='relu')(encode_input)
    h1 = layers.Conv2D(32, 3, activation='relu')(h1)
    h1 = layers.MaxPool2D(3)(h1)
    h1 = layers.Conv2D(32, 3, activation='relu')(h1)
    h1 = layers.Conv2D(16, 3, activation='relu')(h1)
    encode_output = layers.GlobalMaxPool2D()(h1)
    
    encode_model = keras.Model(inputs=encode_input, outputs=encode_output, name='encoder')
    encode_model.summary()
    
    decode_input = keras.Input(shape=(16,), name='encoded_img')
    h2 = layers.Reshape((4, 4, 1))(decode_input)
    h2 = layers.Conv2DTranspose(16, 3, activation='relu')(h2)
    h2 = layers.Conv2DTranspose(32, 3, activation='relu')(h2)
    h2 = layers.UpSampling2D(3)(h2)
    h2 = layers.Conv2DTranspose(16, 3, activation='relu')(h2)
    decode_output = layers.Conv2DTranspose(1, 3, activation='relu')(h2)
    decode_model = keras.Model(inputs=decode_input, outputs=decode_output, name='decoder')
    decode_model.summary()
    
    autoencoder_input = keras.Input(shape=(28,28,1), name='img')
    h3 = encode_model(autoencoder_input)
    autoencoder_output = decode_model(h3)
    autoencoder = keras.Model(inputs=autoencoder_input, outputs=autoencoder_output,
                              name='autoencoder')
    autoencoder.summary()

    3.复杂网络结构构建

    3.1多输入与多输出网络

    # 构建一个根据文档内容、标签和标题,预测文档优先级和执行部门的网络
    # 超参
    num_words = 2000
    num_tags = 12
    num_departments = 4
    
    # 输入
    body_input = keras.Input(shape=(None,), name='body')
    title_input = keras.Input(shape=(None,), name='title')
    tag_input = keras.Input(shape=(num_tags,), name='tag')
    
    # 嵌入层
    body_feat = layers.Embedding(num_words, 64)(body_input)
    title_feat = layers.Embedding(num_words, 64)(title_input)
    
    # 特征提取层
    body_feat = layers.LSTM(32)(body_feat)
    title_feat = layers.LSTM(128)(title_feat)
    features = layers.concatenate([title_feat,body_feat, tag_input])
    
    # 分类层
    priority_pred = layers.Dense(1, activation='sigmoid', name='priority')(features)
    department_pred = layers.Dense(num_departments, activation='softmax', name='department')(features)
    
    
    # 构建模型
    model = keras.Model(inputs=[body_input, title_input, tag_input],
                        outputs=[priority_pred, department_pred])
    model.summary()
    keras.utils.plot_model(model, 'multi_model.png', show_shapes=True)
    model.compile(optimizer=keras.optimizers.RMSprop(1e-3),
                 loss={'priority': 'binary_crossentropy',
                      'department': 'categorical_crossentropy'},
                 loss_weights=[1., 0.2])
    
    import numpy as np
    # 载入输入数据
    title_data = np.random.randint(num_words, size=(1280, 10))
    body_data = np.random.randint(num_words, size=(1280, 100))
    tag_data = np.random.randint(2, size=(1280, num_tags)).astype('float32')
    # 标签
    priority_label = np.random.random(size=(1280, 1))
    department_label = np.random.randint(2, size=(1280, num_departments))
    # 训练
    history = model.fit(
        {'title': title_data, 'body':body_data, 'tag':tag_data},
        {'priority':priority_label, 'department':department_label},
        batch_size=32,
        epochs=5
    )

    3.2小型残差网络

    inputs = keras.Input(shape=(32,32,3), name='img')
    h1 = layers.Conv2D(32, 3, activation='relu')(inputs)
    h1 = layers.Conv2D(64, 3, activation='relu')(h1)
    block1_out = layers.MaxPooling2D(3)(h1)
    
    h2 = layers.Conv2D(64, 3, activation='relu', padding='same')(block1_out)
    h2 = layers.Conv2D(64, 3, activation='relu', padding='same')(h2)
    block2_out = layers.add([h2, block1_out])
    
    h3 = layers.Conv2D(64, 3, activation='relu', padding='same')(block2_out)
    h3 = layers.Conv2D(64, 3, activation='relu', padding='same')(h3)
    block3_out = layers.add([h3, block2_out])
    
    h4 = layers.Conv2D(64, 3, activation='relu')(block3_out)
    h4 = layers.GlobalMaxPool2D()(h4)
    h4 = layers.Dense(256, activation='relu')(h4)
    h4 = layers.Dropout(0.5)(h4)
    outputs = layers.Dense(10, activation='softmax')(h4)
    
    model = keras.Model(inputs, outputs, name='small resnet')
    model.summary()
    keras.utils.plot_model(model, 'small_resnet_model.png', show_shapes=True)
    (x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
    x_train = x_train.astype('float32') / 255
    x_test = y_train.astype('float32') / 255
    y_train = keras.utils.to_categorical(y_train, 10)
    y_test = keras.utils.to_categorical(y_test, 10)
    
    model.compile(optimizer=keras.optimizers.RMSprop(1e-3),
                 loss='categorical_crossentropy',
                 metrics=['acc'])
    model.fit(x_train, y_train,
             batch_size=64,
             epochs=1,
             validation_split=0.2)
    
    #model.predict(x_test, batch_size=32)

    4.共享网络层

    share_embedding = layers.Embedding(1000, 64)
    
    input1 = keras.Input(shape=(None,), dtype='int32')
    input2 = keras.Input(shape=(None,), dtype='int32')
    
    feat1 = share_embedding(input1)
    feat2 = share_embedding(input2)

    5.模型复用

    from tensorflow.keras.applications import VGG16
    vgg16=VGG16()
    
    feature_list = [layer.output for layer in vgg16.layers]
    feat_ext_model = keras.Model(inputs=vgg16.input, outputs=feature_list)
    
    img = np.random.random((1, 224, 224, 3).astype('float32'))
    ext_features = feat_ext_model(img)

    6.自定义网络层

    # import tensorflow as tf
    # import tensorflow.keras as keras
    class MyDense(layers.Layer):
        def __init__(self, units=32):
            super(MyDense, self).__init__()
            self.units = units
        def build(self, input_shape):
            self.w = self.add_weight(shape=(input_shape[-1], self.units),
                                     initializer='random_normal',
                                     trainable=True)
            self.b = self.add_weight(shape=(self.units,),
                                     initializer='random_normal',
                                     trainable=True)
        def call(self, inputs):
            return tf.matmul(inputs, self.w) + self.b
    
        def get_config(self):
            return {'units': self.units}
    
    inputs = keras.Input((4,))
    outputs = MyDense(10)(inputs)
    model = keras.Model(inputs, outputs)
    config = model.get_config()
    new_model = keras.Model.from_config(
    config, custom_objects={'MyDense':MyDense}
    )
    # 在自定义网络层调用其他网络层
    
    # 超参
    time_step = 10
    batch_size = 32
    hidden_dim = 32
    inputs_dim = 5
    
    # 网络
    class MyRnn(layers.Layer):
        def __init__(self):
            super(MyRnn, self).__init__()
            self.hidden_dim = hidden_dim
            self.projection1 = layers.Dense(units=hidden_dim, activation='relu')
            self.projection2 = layers.Dense(units=hidden_dim, activation='relu')
            self.classifier = layers.Dense(1, activation='sigmoid')
        def call(self, inputs):
            outs = []
            states = tf.zeros(shape=[inputs.shape[0], self.hidden_dim])
            for t in range(inputs.shape[1]):
                x = inputs[:,t,:]
                h = self.projection1(x)
                y = h + self.projection2(states)
                states = y
                outs.append(y)
            # print(outs)
            features = tf.stack(outs, axis=1)
            print(features.shape)
            return self.classifier(features)
    
    # 构建网络
    inputs = keras.Input(batch_shape=(batch_size, time_step, inputs_dim))
    x = layers.Conv1D(32, 3)(inputs)
    print(x.shape)
    outputs = MyRnn()(x)
    model = keras.Model(inputs, outputs)

    rnn_model = MyRnn() _ = rnn_model(tf.zeros((1, 10, 5)))

     

  • 相关阅读:
    mini2440烧写nor flash
    mini2440系统引导(五)串口UART
    mini2440系统引导(四)存储控制器
    mini2440系统引导(三)当前状态寄存器CPSR
    mini2440系统引导(二)中断寄存器
    mini2440系统引导(一)看门狗
    filebeat版本问题导致logstash无法处理接收到的日志
    kernel: possible SYN flooding on port 80. Sending cookies
    grok正则
    【转载】kafka 基础知识
  • 原文地址:https://www.cnblogs.com/peijz/p/12779288.html
Copyright © 2011-2022 走看看