teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

修正

2021/07/07 04:48

投稿

退会済みユーザー
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

表記方法のミスで訂正

2021/07/07 04:48

投稿

退会済みユーザー
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,))