「python深さ学習」学習ノートとコード実装(第7章:7.1:Sequentialモデルを使用しないソリューション)
46414 ワード
python深さ学習第七章---高度な深さ学習ベストプラクティス
7.1 Sequentialモデルを使用しないソリューション
Sequentialモデルの特徴:
1.入力は1つのみ
たとえば、テキストデータ(フル接続層)、ピクチャデータ(2 Dボリューム層)を同時に処理するには、Sequentialモデルを使用することはできません.たとえば、入力データがメタデータ、テキスト記述、ピクチャであり、ビジネスの価格を予測するために、Denseモジュール、RNNモジュール、ボリュームニューラルネットワークモジュールを組み合わせることができます.
2.出力
例えば、小説を与えて、私たちは彼を分類して、その執筆時間を予測しなければなりません.この時、2つの出力が必要です.1つの出力はそのカテゴリを判別し、もう1つの出力はその執筆時間を予測します.
関数式API
マルチインプットモデル
例:1つの質問、1つの質問とすべての質問のテキストデータの集合として入力し、1つの回答として出力します.
マルチアウトプットモデル
データの異なる性質を予測するネットワーク
層組成の有向無環図
共有レイヤウェイト(Shared Layer Weights)
モデルをレイヤとして呼び出す
小結
1.実装するアーキテクチャがレイヤの線形スタックだけではない場合は、sequential APIに限定されないでください.
2.Keras関数APIを使用して、多入力モデル、多出力モデル、および複雑な内部ネットワークトポロジー構造を有するモデルを構築する
3.同じ層インスタンスまたはモデルインスタンスをマルチシーで呼び出し、
7.1 Sequentialモデルを使用しないソリューション
Sequentialモデルの特徴:
1.入力は1つのみ
たとえば、テキストデータ(フル接続層)、ピクチャデータ(2 Dボリューム層)を同時に処理するには、Sequentialモデルを使用することはできません.たとえば、入力データがメタデータ、テキスト記述、ピクチャであり、ビジネスの価格を予測するために、Denseモジュール、RNNモジュール、ボリュームニューラルネットワークモジュールを組み合わせることができます.
2.出力
例えば、小説を与えて、私たちは彼を分類して、その執筆時間を予測しなければなりません.この時、2つの出力が必要です.1つの出力はそのカテゴリを判別し、もう1つの出力はその執筆時間を予測します.
関数式API
from keras.models import Sequential,Model
from keras import layers
from keras import Input
# Sequential
seq_model = Sequential()
seq_model.add(layers.Dense(32,activation = 'relu',input_shape = ((64,))))
seq_model.add(layers.Dense(32,activation = 'relu'))
seq_model.add(layers.Dense(10,activation = 'softmax'))
seq_model.summary()
# API
input_tensor = Input(shape = (64,))
x = layers.Dense(32,activation = 'relu')(input_tensor)
x = layers.Dense(32,activation = 'relu')(x)
output_tensor = layers.Dense(10,activation = 'softmax')(x)
# , , , , ,
model = Model(input_tensor,output_tensor)
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_4 (Dense) (None, 32) 2080
_________________________________________________________________
dense_5 (Dense) (None, 32) 1056
_________________________________________________________________
dense_6 (Dense) (None, 10) 330
=================================================================
Total params: 3,466
Trainable params: 3,466
Non-trainable params: 0
_________________________________________________________________
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 64) 0
_________________________________________________________________
dense_7 (Dense) (None, 32) 2080
_________________________________________________________________
dense_8 (Dense) (None, 32) 1056
_________________________________________________________________
dense_9 (Dense) (None, 10) 330
=================================================================
Total params: 3,466
Trainable params: 3,466
Non-trainable params: 0
_________________________________________________________________
マルチインプットモデル
例:1つの質問、1つの質問とすべての質問のテキストデータの集合として入力し、1つの回答として出力します.
from keras.models import Model
from keras import layers
from keras import Input
import keras
text_vocabulary_size = 10000
question_vocabulary_size = 10000
answer_vocabulary_size = 500
#
text_input = Input(shape = (None,),dtype = 'int32',name = 'text') #
embedded_text = layers.Embedding(text_vocabulary_size,64)(text_input)
encode_text = layers.LSTM(32)(embedded_text)
#
question_input = Input(shape = (None,),dtype = 'int32',name = 'question')
embedded_question = layers.Embedding(question_vocabulary_size,32)(question_input)
encode_question = layers.LSTM(16)(embedded_question)
# , ,
concatenated = layers.concatenate([encode_text,encode_question],axis = -1)
# softmax
answer = layers.Dense(answer_vocabulary_size,activation = 'softmax')(concatenated)
model = Model([text_input,question_input],answer)
model.compile(optimizer = 'rmsprop',loss = 'categorical_crossentropy',metrics = ['acc'])
#
import numpy as np
num_samples= 1000
max_length = 100
# numpy
text = np.random.randint(1,text_vocabulary_size,size = (num_samples,max_length)) # ,low,high,size
question = np.random.randint(1,question_vocabulary_size,size = (num_samples,max_length))
answers = np.random.randint(answer_vocabulary_size,size = (num_samples))
#
answers = keras.utils.to_categorical(answers,answer_vocabulary_size)
#
# 1.
model.fit([text,question],answers,epochs = 10,batch_size = 128)
# 2.
model.fit({'text':text,'question':question},answers,epochs = 10,batch_size = 128)
Epoch 1/10
1000/1000 [==============================] - 6s 6ms/step - loss: 6.2141 - acc: 0.0020
Epoch 2/10
1000/1000 [==============================] - 3s 3ms/step - loss: 6.1979 - acc: 0.0420
Epoch 3/10
1000/1000 [==============================] - 3s 3ms/step - loss: 6.1546 - acc: 0.0220
Epoch 4/10
1000/1000 [==============================] - 3s 3ms/step - loss: 6.0582 - acc: 0.0060
Epoch 5/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.9883 - acc: 0.0080
Epoch 6/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.9284 - acc: 0.0080
Epoch 7/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.8564 - acc: 0.0100
Epoch 8/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.7803 - acc: 0.0130
Epoch 9/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.6730 - acc: 0.0160
Epoch 10/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.6041 - acc: 0.0230
Epoch 1/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.5310 - acc: 0.0370
Epoch 2/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.4517 - acc: 0.0410
Epoch 3/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.4116 - acc: 0.0430
Epoch 4/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.3387 - acc: 0.0530
Epoch 5/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.2483 - acc: 0.0550
Epoch 6/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.2013 - acc: 0.0540
Epoch 7/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.1401 - acc: 0.0740
Epoch 8/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.0840 - acc: 0.0900
Epoch 9/10
1000/1000 [==============================] - 3s 3ms/step - loss: 5.0057 - acc: 0.0870
Epoch 10/10
1000/1000 [==============================] - 3s 3ms/step - loss: 4.9580 - acc: 0.0920
マルチアウトプットモデル
データの異なる性質を予測するネットワーク
from keras import layers
from keras import Input
from keras.models import Model
vocabulary_size = 50000
num_income_groups = 10
posts_input = Input(shape = (None,),dtype = 'int32',name = 'posts')
embedded_posts = layers.Embedding(256,vocabulary_size)(posts_input)
x = layers.Conv1D(128,5,activation = 'relu')(embedded_posts)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(256,5,activation = 'relu')(x)
x = layers.Conv1D(256,5,activation = 'relu')(x)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(256,5,activation = 'relu')(x)
x = layers.Conv1D(256,5,activation = 'relu')(x)
x = layers.GlobalMaxPooling1D()(x)
age_prediction = layers.Dense(1,name = 'age')(x)
income_prediction = layers.Dense(num_income_groups,activation = 'softmax',name = 'income')(x)
gender_prediction = layers.Dense(1,activation = 'sigmoid',name = 'gender')(x)
model = Model(posts_input,[age_prediction,income_prediction,gender_prediction])
# , ,
#
# 1. ,
model.compile(optimizer = 'rmsprop',
loss = ['mse','categorical_crossentropy','binary_crossentropy'],
loss_weights = [0.25,1.0,10.])
# 2.
model.compile(optimizer = 'rmsprop',
loss = {'age':'mse','income':'categorical_crossentropy','gender':'binary_crossentropy'},
loss_weights = {'age':0.25,'income':1.,'gender':10.})
#
#
model.fit(posts,[age_targets,income_targets,gender_targets],epochs = 10,batch_size = 64)
model.fit(posts,{'age':age_targets,'income':income_targets.'gender':gender_targets},epochs = 10,batch_size = 64)
層組成の有向無環図
# 1. Inception , , ,
from keras import layers
x = Input(shape = (None,None,10))
branch_a = layers.Conv2D(128,1,activation = 'relu',strides = 2)(x)
branch_b = layers.Conv2D(128,1,activation = 'relu')(x)
branch_b = layers.Conv2D(128,3,activation = 'relu',strides = 2)(branch_b)
branch_c = layers.AveragePooling2D(3,strides = 2)(x)
branch_c = layers.Conv2D(128,3,activation = 'relu')(branch_c)
branch_d = layers.Conv2D(128,1,activation = 'relu')(x)
branch_d = layers.Conv2D(128,3,activation = 'relu')(branch_d)
branch_d = layers.Conv2D(128,3,activation = 'relu',strides = 2)(branch_d)
# oo
output = layers.concatenate([branch_a,branch_b,branch_c,branch_d],axis = -1)
# 2.
# 4
from keras import layers
#
x = ...
y = layers.Conv2D(128,3,activation = 'relu',padding = 'same')(x)
y = layers.Conv2D(128,3,activation = 'relu',paddingg = 'same')(y)
y = layers.Conv2D(128,3,activation = 'relu',padding = 'same')(y)
y = layers.add([y,x]) # x y
#
x = ...
y = layers.Conv2D(128,3,activation = 'relu',padding = 'same')(x)
y = layers.Conv2D(128,3,activation = 'relu',paddingg = 'same')(y)
y = layers.MaxPooling2D(2,strides = 2)(y)
residual = layers.Conv2D(128,1,strides = 2,padding = 'same')(x)
y = layers.add([y,residual])
共有レイヤウェイト(Shared Layer Weights)
from keras import layers
from keras import Input
from keras.models import Model
lstm = layers.LSTM(32)
left_input = Input(shape = (None,128))
left_output = lstm(left_input)
right_input = Input(shape= (None,128))
right_output = lstm(right_input)
merged = layers.concatenate([left_output,right_output],axis = -1)
predictions = layers.Dense(1,activation = 'sigmoid')(megred)
model = Model([left_input,right_input],predictions)
model.fit([left_data,right_data],targets)
# , ,
モデルをレイヤとして呼び出す
#
from keras import layers
from keras import applications
from keras import Input
#
xception_base = applications.Xception(weights = None,include_top = False)
left_input = Input(shape = (250,250,3))
right_input = Input(shape = (250,250,3))
left_features = xception_base(left_input)
right_features = xception_base(right_input)
megred_features = layers.concatenate([left_features,right_features],axis = -1)
小結
1.実装するアーキテクチャがレイヤの線形スタックだけではない場合は、sequential APIに限定されないでください.
2.Keras関数APIを使用して、多入力モデル、多出力モデル、および複雑な内部ネットワークトポロジー構造を有するモデルを構築する
3.同じ層インスタンスまたはモデルインスタンスをマルチシーで呼び出し、