TensorFlow2.0教程1:keras 函數api


  最近對tensorflow十分感興趣,所以想做一個系列來詳細講解tensorflow來。

  本教程主要由tensorflow2.0官方教程的個人學習復現筆記整理而來,並借鑒了一些keras構造神經網絡的方法,中文講解,方便喜歡閱讀中文教程的朋友,tensorflow官方教程:https://www.tensorflow.org

  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}

  )無錫人流多少錢 http://www.xaytsgyy.com/

  # 在自定義網絡層調用其他網絡層

  # 超參

  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)))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM