如何获取tf.data.Dataset.padded_batch的大小以输入功能API中的Keras输入层?

时间:2019-07-21 18:01:43

标签: tensorflow keras keras-layer tensorflow-datasets

我需要知道可变长度的填充批处理中tensorflow返回的大小,以便可以使用Keras Functional API。

papped_batch可与tf.keras.Sequential()配合使用,但出于我的目的,我需要使用功能性API构建自定义模型。

以下是可使用顺序模型的部分代码:

BUFFER_SIZE = 50000
BATCH_SIZE = 64
TAKE_SIZE = 750

train_data = encoded_dataset.shuffle(BUFFER_SIZE).skip(TAKE_SIZE)
train_data = train_data.padded_batch(BATCH_SIZE, padded_shapes=([-1],[None]))

test_data = encoded_dataset.take(TAKE_SIZE)
test_data = test_data.padded_batch(BATCH_SIZE, padded_shapes=([-1],[None]))

vocab_size += 1


model = tf.keras.Sequential()
model.add(tf.keras.layers.Embedding(vocab_size, 512))
model.add(tf.keras.layers.Dropout(.5))
model.add(tf.keras.layers.GlobalAveragePooling1D())
model.add(tf.keras.layers.Dense(512, activation='tanh'))
model.add(tf.keras.layers.Dropout(.5))
model.add(tf.keras.layers.Dense(512, activation='tanh'))
model.add(tf.keras.layers.Dropout(.5))
model.add(tf.keras.layers.Dense(24, activation='sigmoid'))

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.fit(train_data, epochs=5, validation_data=test_data)

但是我需要使最后一层的部分最大化,而不是在整个层上采用S形,因此我将其拆分并连接在一起。 不幸的是,我不知道输入形状,因为每个批次都会填充到该批次中最长的序列长度。

这是我尝试过的内容以及产生的错误消息:

input = tf.keras.layers.Input(shape=(None,))

x = tf.keras.layers.Embedding(vocab_size, 64)(input)
x = tf.keras.layers.Dropout(.5)(x)
x = tf.keras.layers.GlobalAveragePooling1D()(x)
x = tf.keras.layers.Dense(2048, activation='tanh')(x)
x = tf.keras.layers.Dropout(.5)(x)
x = tf.keras.layers.Dense(2048, activation='tanh')(x)
x = tf.keras.layers.Dropout(.5)(x)

soft1 = tf.keras.layers.Dense(16, activation='softmax')(x)
soft2 = tf.keras.layers.Dense(4, activation='softmax')(x)
soft3 = tf.keras.layers.Dense(4, activation='softmax')(x)

output = tf.keras.layers.concatenate([soft1, soft2, soft3])

model = tf.keras.Model(inputs=input,outputs=output)
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
2019-07-21 14:00:18.598095: W tensorflow/core/common_runtime/base_collective_executor.cc:216] BaseCollectiveExecutor::StartAbort Invalid argument: Incompatible shapes: [64,24] vs. [64]
         [[{{node metrics/accuracy/Equal}}]]
         [[Adam/Adam/update/mul_1/_106]]
2019-07-21 14:00:18.598180: W tensorflow/core/common_runtime/base_collective_executor.cc:216] BaseCollectiveExecutor::StartAbort Invalid argument: Incompatible shapes: [64,24] vs. [64]
         [[{{node metrics/accuracy/Equal}}]]
...

tensorflow.python.framework.errors_impl.InvalidArgumentError: 2 root error(s) found.
  (0) Invalid argument:  Incompatible shapes: [64,24] vs. [64]
         [[node metrics/accuracy/Equal (defined at mult_critic2.py:160) ]]
         [[Adam/Adam/update/mul_1/_106]]
  (1) Invalid argument:  Incompatible shapes: [64,24] vs. [64]
         [[node metrics/accuracy/Equal (defined at mult_critic2.py:160) ]]
0 successful operations.
0 derived errors ignored. [Op:__inference_keras_scratch_graph_35062]

Function call stack:
keras_scratch_graph -> keras_scratch_graph

什么是适合我的输入层的形状?

0 个答案:

没有答案