質問編集履歴
2
修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -66,26 +66,69 @@
|
|
66
66
|
|
67
67
|
ValueError: Input 0 of layer dense is incompatible with the layer: expected axis -1 of input shape to have value 4096 but received input with shape [None, 1000]
|
68
68
|
|
69
|
+
```
|
70
|
+
from tensorflow.keras.preprocessing.sequence import pad_sequences
|
71
|
+
from tensorflow.keras.utils import to_categorical
|
72
|
+
from numpy import array
|
73
|
+
#画像と出力単語を紐づける関数
|
74
|
+
def create_sequences(tokenizer, max_length, descriptions, photos):
|
75
|
+
X1, X2, y = list(), list(), list()#X1が入力画像、X2が入力語、yがX1とX2に対応する出力語
|
76
|
+
#各画像名でループ
|
77
|
+
for key, desc_list in descriptions.items():
|
78
|
+
#各画像のキャプションでループ
|
79
|
+
for desc in desc_list:
|
69
|
-
#
|
80
|
+
#シーケンスをエンコードする
|
81
|
+
seq = tokenizer.texts_to_sequences([desc])[0]
|
82
|
+
#1つのシーケンスを複数のX、Yペアに分割する
|
83
|
+
for i in range(1, len(seq)):
|
84
|
+
#入力と出力のペアに分割する
|
85
|
+
in_seq, out_seq = seq[:i], seq[i]
|
86
|
+
#行列のサイズを最大の単語数に合わせる
|
87
|
+
in_seq = pad_sequences([in_seq], maxlen=max_length)[0]
|
88
|
+
#出力シーケンス
|
89
|
+
out_seq = to_categorical([out_seq], num_classes=vocab_size)[0]
|
90
|
+
#全てをarrayに格納
|
91
|
+
X1.append(photos[key][0])
|
92
|
+
X2.append(in_seq)
|
93
|
+
y.append(out_seq)
|
94
|
+
return array(X1), array(X2), array(y)
|
95
|
+
|
96
|
+
#トレーニングデータの入力画像、入力語、出力語を紐付ける
|
97
|
+
X1train, X2train, ytrain = create_sequences(tokenizer, max_length, train_descriptions, train_features)
|
98
|
+
print(X1train)
|
99
|
+
|
100
|
+
#バリデーションデータの入力画像、入力語、出力語を紐付ける
|
101
|
+
X1val, X2val, yval = create_sequences(tokenizer, max_length, val_descriptions, val_features)
|
70
102
|
from tensorflow.keras.layers import Input,Dense,LSTM,Embedding,Dropout
|
71
103
|
from keras.layers.merge import add
|
72
104
|
|
73
|
-
モデルを定義する関数
|
105
|
+
#モデルを定義する関数
|
74
106
|
def define_model(vocab_size, max_length):
|
75
|
-
画像の特徴を入力するレイヤ
|
107
|
+
#画像の特徴を入力するレイヤ
|
76
108
|
inputs1 = Input(shape=(4096,))
|
77
109
|
fe1 = Dropout(0.5)(inputs1)
|
78
110
|
fe2 = Dense(256, activation='relu')(fe1)
|
79
|
-
文章を入力するレイヤ
|
111
|
+
#文章を入力するレイヤ
|
80
112
|
inputs2 = Input(shape=(max_length,))
|
81
113
|
se1 = Embedding(vocab_size, 256, mask_zero=True)(inputs2)
|
82
114
|
se2 = Dropout(0.5)(se1)
|
83
115
|
se3 = LSTM(256)(se2)
|
84
|
-
上の二つの出力を統合する部分
|
116
|
+
#上の二つの出力を統合する部分
|
85
117
|
decoder1 = add([fe2, se3])
|
86
118
|
decoder2 = Dense(256, activation='relu')(decoder1)
|
87
119
|
outputs = Dense(vocab_size, activation='softmax')(decoder2)
|
88
|
-
モデルの定義.二つを入力にとって一つを出力する形になる
|
120
|
+
#モデルの定義.二つを入力にとって一つを出力する形になる
|
89
121
|
model = Model(inputs=[inputs1, inputs2], outputs=outputs)
|
90
122
|
model.compile(loss='categorical_crossentropy', optimizer='adam')
|
91
|
-
return model
|
123
|
+
return model
|
124
|
+
|
125
|
+
from tensorflow.keras.callbacks import ModelCheckpoint
|
126
|
+
|
127
|
+
#モデルの定義
|
128
|
+
model = define_model(vocab_size, max_length)
|
129
|
+
#コールバックを定義する
|
130
|
+
filepath = 'model-ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5'
|
131
|
+
checkpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
|
132
|
+
#学習
|
133
|
+
model.fit([X1train, X2train], ytrain, epochs=10, verbose=2, callbacks=[checkpoint], validation_data=([X1val, X2val], yval))
|
134
|
+
```
|
1
表記方法のミスで訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -70,7 +70,7 @@
|
|
70
70
|
from tensorflow.keras.layers import Input,Dense,LSTM,Embedding,Dropout
|
71
71
|
from keras.layers.merge import add
|
72
72
|
|
73
|
-
|
73
|
+
モデルを定義する関数
|
74
74
|
def define_model(vocab_size, max_length):
|
75
75
|
画像の特徴を入力するレイヤ
|
76
76
|
inputs1 = Input(shape=(4096,))
|