美文网首页
通过Sequential快速搭建tensorflow模型

通过Sequential快速搭建tensorflow模型

作者: 郭彦超 | 来源:发表于2019-05-01 23:07 被阅读0次

    keras模型构建中介绍,通过Sequential类可快速堆叠出一个神经网络模型。完成一个模型搭建,大致需要三个步骤:创建网络>模型编译>模型训练

    1、构建网络

    • 构造器创建
    model = tf.keras.Sequential([
        tf.keras.layers.Dense(32, input_shape=(784,)),
        tf.keras.layers.Activation('relu'),
        tf.keras.layers.Dense(10),
        tf.keras.layers.Activation('softmax'),
    ])
    
    • 通过add方法构建
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(32, input_dim=784))
    model.add(tf.keras.layers.Activation('relu'))
    
    • 确定模型中数据规格
      keras中只有第一层需要通过参数传递的方式告知模型数据的规格,后面各层是不需要的,因为可以通过推导的方式是获得上一层的输出格式,即下一层的输入格式;

    a、通过input_shape参数 ,如input_shape=(784,)

    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(32, input_shape=(784,)))
    

    b、通过input_dim参数,在二维神经网络层中,也可通过input_dim=784的方式实现类似a的定义

    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(32, input_dim=784))
    

    2、模型编译

    模型编译过程需要用到三个组件,模型优化器、损失函数、模型评估标准。

    • 优化器
      常见的优化器有很多,如rmsprop、adagrad,这些优化器在keras中都有对应的实现;
    • 损失函数
      损失函数主要反映模型与实际数据的差距,常见的损失函数有categorical_crossentropy、mse;
    • 评估标准
      通过该数据可直观反映模型在某个层面的质量;评估函数可指定多个,可以是keras已经实现的评估函数,也可以是自定义的。
    # 多分类问题
    model.compile(optimizer='rmsprop',
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    
    # 二分类问题
    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    
    # 均方误差回归问题
    model.compile(optimizer='rmsprop',
                  loss='mse')
    
    # 自定义评估标准函数 
    
    def mean_pred(y_true, y_pred):
        return tf.keras.backend.mean(y_pred)
    
    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy',
                  metrics=['accuracy', mean_pred])
    

    3、模型训练

    通过调用fit函数,对模型进行训练;fit函数需要用到4个参数,特征数据、标签、迭代次数、批次大小。

    • 二分类
    # 对于具有 2 个类的单输入模型(二进制分类):
    
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(32, activation='relu', input_dim=100))
    model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    
    # 生成虚拟数据
    import numpy as np
    data = np.random.random((1000, 100))
    labels = np.random.randint(2, size=(1000, 1))
    
    # 训练模型,以 32 个样本为一个 batch 进行迭代
    model.fit(data, labels, epochs=10, batch_size=32)
    
    • 多分类
    # 对于具有 10 个类的单输入模型(多分类分类):
    
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(32, activation='relu', input_dim=100))
    model.add(tf.keras.layers.Dense(10, activation='softmax'))
    model.compile(optimizer='rmsprop',
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    
    # 生成虚拟数据
    import numpy as np
    data = np.random.random((1000, 100))
    labels = np.random.randint(10, size=(1000, 1))
    
    # 将标签转换为分类的 one-hot 编码
    one_hot_labels = tf.keras.utils.to_categorical(labels, num_classes=10)
    
    # 训练模型,以 32 个样本为一个 batch 进行迭代
    model.fit(data, one_hot_labels, epochs=10, batch_size=32)
    

    4、小结

    一个完成的例子 ,模仿Vgg

    import numpy as np
    from tensorflow import keras
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPooling2D
    from tensorflow.keras.optimizers import SGD
    
    # 生成虚拟数据
    x_train = np.random.random((100, 100, 100, 3))
    y_train = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
    x_test = np.random.random((20, 100, 100, 3))
    y_test = keras.utils.to_categorical(np.random.randint(10, size=(20, 1)), num_classes=10)
    
    model = Sequential()
    # 输入: 3 通道 100x100 像素图像 -> (100, 100, 3) 张量。
    # 使用 32 个大小为 3x3 的卷积滤波器。
    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
    model.add(Conv2D(32, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    
    #Flatten对特征进行扁平化处理
    model.add(Flatten())
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(10, activation='softmax'))
    
    sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(loss='categorical_crossentropy', optimizer=sgd)
    
    model.fit(x_train, y_train, batch_size=32, epochs=10)
    score = model.evaluate(x_test, y_test, batch_size=32)
    

    相关文章

      网友评论

          本文标题:通过Sequential快速搭建tensorflow模型

          本文链接:https://www.haomeiwen.com/subject/oexgnqtx.html