我是 TensorFlow 的新手,正在尝试实现一个用于自然语言处理的简单神经网络,但我遇到了一个无法解决的错误。我的网络代码如下:
model = tf.keras.Sequential()model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100,)))model.add(layers.BatchNormalization())model.add(layers.ReLU())model.add(layers.Dense(7*7*256, use_bias=False))model.add(layers.BatchNormalization())model.add(layers.ReLU())model.add(layers.Dense(7*7*128, use_bias=False))model.add(layers.BatchNormalization())model.add(layers.ReLU())model.add(layers.Dense(7*7*64, use_bias=False))model.add(layers.BatchNormalization())model.add(layers.ReLU())model.add(layers.Dense(7*7*64, use_bias=False))model.add(layers.BatchNormalization())model.add(layers.ReLU())model.add(layers.Dense(100, use_bias = False, activation="relu"))
输入形状是 (100,)。我试图输入一个包含 100 个浮点数的张量(ASCII 字符在 0 到 1 之间标准化),如下面的代码所示:
generator = make_generator_model()human_array = tf.convert_to_tensor([human[0]])print("human shape: " + str(tf.shape(human[0])))noise = tf.random.normal([1, 100])print("noise shape: " + str(tf.shape(noise)))generated_response_test = generator(human[0], training=False)print("m: " + chr(109))print(generated_response_test)print(get_message(np.round(generated_response_test[0] * 95 + 32)))
其中 human[0] 就是我提到的张量
我得到了以下错误,以及这个警告:
WARNING:tensorflow:Model was constructed with shape (None, 100) for inputTensor("dense_input:0", shape=(None, 100), dtype=float32), but it wascalled on an input with incompatible shape (100,).In[0] is not a matrix. Instead it has shape [100] [Op:MatMul]
有趣的是,当我输入形状相同的正态分布的随机噪声时,代码没有警告或错误。tf.shape(noise) 和 tf.shape(human[0]) 的输出分别是:
human shape: tf.Tensor([ 1 100], shape=(2,), dtype=int32)noise shape: tf.Tensor([ 1 100], shape=(2,), dtype=int32)
所以我很困惑
我相当确定这是我定义张量变量的方式有问题,matmul() 需要一个矩阵作为输入,但我无论如何都无法弄清楚如何将我的列表转换成正确的格式,而且我在网上找不到任何解决我问题的资料
有谁能提供帮助吗?谢谢!
回答:
我通过在 tf.variable 中指定 shape = [1,100] 而不是 shape = (100,) 解决了这个问题,并且我将 [] 移到了输入内部,所以我的工作代码是
generator = make_generator_model()human_input = tf.Variable([np.array(human[0])], dtype = tf.float32, shape = [1,100])human_input = tf.random.normal([1, 100])generated_response = generator(human_input, training=False)print("m: " + chr(109))print(generated_response)print(print_message(np.round(generated_response[0] * 95 + 32)))
注意我对 human_input 的定义的不同之处。希望这能帮助那些也有同样问题的人,如果你需要更多信息,请在评论中回复!