tensorflow - 如何修复'ValueError:输入0与层simple_rnn_1不兼容:预期形状=(无,无,20),找到形状=(无,无,2,20)'
问题描述
我有几个矩阵通过多个层,最后一个是密集层,为每个矩阵生成一个向量。现在我希望将这些矩阵提供给 keras 的 RNN,这就是我面临这个错误的地方。
我尝试将向量堆叠在一起,以便将它们传递给 RNN。这是该想法的一段代码:
input1 = Dense(20, activation = "relu")(input1)
input2 = Dense(20, activation = "relu")(input2)
out = Lambda(lambda x: tf.stack([x[0], x[1]], axis=1), output_shape=(None, 2, 20))([input1, input2])
out = SimpleRNN(50, activation="relu")(out)
我收到:
>Traceback (most recent call last):
>>File "model.py", line 106, in <module>
model = make_model()
>>File "model.py", line 60, in make_model
out = SimpleRNN(50, activation="relu")(out)
>>File "/home/yamini/.local/lib/python3.6/site-packages/keras/layers/recurrent.py", line 532, in __call__
return super(RNN, self).__call__(inputs, **kwargs)
>>File "/home/yamini/.local/lib/python3.6/site-packages/keras/engine/base_layer.py", line 440, in __call__
self.assert_input_compatibility(inputs)
>>File "/home/yamini/.local/lib/python3.6/site-packages/keras/engine/base_layer.py", line 368, in assert_input_compatibility
str(x_shape))
>>ValueError: Input 0 is incompatible with layer simple_rnn_1: expected shape=(None, None, 20), found shape=(None, None, 2, 20)
如果我更改output_shape=(None, None, 20)
Lambda 层,我会得到:
Traceback (most recent call last):
>> File "model.py", line 107, in <module>
model.fit([input1, input2], y_train, epochs = 15, batch_size = 20, verbose = 2)
>>File "/home/yamini/.local/lib/python3.6/site-packages/keras/engine/training.py", line 952, in fit
batch_size=batch_size)
>>File "/home/yamini/.local/lib/python3.6/site-packages/keras/engine/training.py", line 789, in _standardize_user_data
exception_prefix='target')
>>File "/home/yamini/.local/lib/python3.6/site-packages/keras/engine/training_utils.py", line 138, in standardize_input_data
str(data_shape))
>>ValueError: Error when checking target: expected simple_rnn_1 to have shape (50,) but got array with shape (1,)
解决方案
您可以更改output_shape
,其中不应该包含batch_size
.
from keras.layers import Dense,Lambda,SimpleRNN,Input
import tensorflow as tf
input1 = Input(shape=(20,))
input2 = Input(shape=(20,))
input1 = Dense(20, activation = "relu")(input1)
input2 = Dense(20, activation = "relu")(input2)
out = Lambda(lambda x: tf.stack([x[0], x[1]], axis=1), output_shape=(2, 20))([input1, input2])
out = SimpleRNN(50, activation="relu")(out)
推荐阅读
- node.js - 只想上传 jpeg/png 文件
- javascript - 将 promise/ajax 转换为同步请求
- azure-cosmosdb - 如何访问 Cosmos DB“分析存储”预览版?
- git - 是否可以创建像 master:master-1 这样的 GitHub 分支?
- javascript - 查找等于通过变量传入的 id 的 ID - Jquery
- c++ - Bison如何在解析树中返回一个指针
- progressive-web-apps - 渐进式 Web 应用和应用内购买/计费
- python - Facebook Oauth 有效,但 Google Oauth2 错误:Django 中的 redirect_uri_mismatch
- php - 渴望加载不拉关系模型
- javascript - 在获取请求时自动设置输入值