因此,我正在尝试为翻译任务构建seq2seq编码器-解码器网络。我已经被卡住了一阵子了,我不知道如何解决我遇到的错误,希望能对您有所帮助。
我的代码如下:
shape = np.shape(x)
input_shape = shape[1]
encoder_hidden_units = input_shape
dec_hidden = input_shape
inputs = tf.random.normal([shape[0], shape[1], emb_dim])
embedding = layers.Embedding(input_dim=input_shape, output_dim=emb_dim, mask_zero=True, batch_size=64)
model = keras.Sequential()
#encoder
model.add(embedding)
encoder = layers.Bidirectional(layers.GRU(encoder_hidden_units, dropout=dropout, return_sequences=False, return_state=False))
model.add(encoder)
#decoder
model.add(layers.Embedding(input_dim=enc_dim, output_dim=17, mask_zero=True, batch_size=64))
decoder = layers.GRU(dec_hidden, dropout=dropout, input_shape=shape, return_sequences=False, return_state=False)
model.add(decoder)
opt = keras.optimizers.Adam()
model.compile(loss='categorical_crossentropy', optimizer=opt)
model.summary()
model.fit(np.array(x), np.array(y), epochs=max_epoch, batch_size=64, verbose=0)
x和y是我的训练集/形状为(812,17)的标签
我收到的错误消息是:
ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
我尝试添加具有均匀激活的密集层,更改损失函数和优化器,获得如下渐变:
with tf.GradientTape() as tape:
loss = 'categorical_crossentropy'
vars = [1,2,3]
grads = tape.gradient(loss, vars)
processed_grads = [process_gradient(g) for g in grads]
opt.apply_gradients(zip(processed_grads, vars))
(我必须承认我不知道要在“ vars”中添加什么,这是我在网上找到的) 我的数据填充了0,所以我认为这可能是问题所在?但这对我来说没有任何意义,因为这不是我第一次用这种方式构建带有填充数据的网络。 我做错了可能很明显,这是我接触网络的新手。 我很乐意提供任何意见/建议!
编辑:对于有类似问题的任何人,这是stackexchange的链接,我在其中也发布了问题,甚至得到了答复:https://linguistics.stackexchange.com/questions/36937/seq2seq-translation-model-valueerror-an-operation-has-none-for-gradient