【问题标题】:Keras: Expected dense_input to have 3 dimensions, but got array with shape (x, y)Keras:预期dense_input有3个维度,但得到了形状为(x,y)的数组
【发布时间】:2020-06-18 11:18:23
【问题描述】:

我正在处理这个项目,但似乎无法弄清楚为什么会出现此错误。我已经对训练输入和输出进行了硬编码,这是我的全部代码。我是编写 AI 代码的新手(我是一名电气工程专业的学生研究员),所以如果它看起来很糟糕,我很抱歉 :(。

from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Flatten
import numpy as np
from numpy import exp, array, random, dot
import cmath

###train_input = [input power, tl12, tl4, rout, smith_imp]###
training_set_inputs = X = array([
    [0.001, (57.787+9.323j), (39.7-102.789j), 2000, (49.306+3.343j)],
    [0.001, (57.787+9.323j), (25.003-108.861j), 4000, (40.055+23.539j)],
    [0.001, (57.787+9.323j), (13.020-111.297j), 10000, (34.116+28.402j)],
    [1*10**-4, (57.814+9.237j), (23.708-102.443j), 2000, (49.556+22.397j)],
    [1*10**-4, (57.814+9.237j), (16.712-104.013j), 4000, (40.966+38.298j)],
    [1*10**-4, (57.814+9.237j), (10.482-105.169j), 10000, (25.069+48.663j)],
    [1*10**-5, (57.814+9.237j), (11.363-102.341j), 2000, (38.133+49.859j)],
    [1*10**-5, (57.814+9.237j), (10.285-102.579j), 4000, (31.647+54.320j)],
    [1*10**-5, (57.814+9.237j), (8.829-102.908j), 10000, (23.171+58.023j)]
])

training_set_outputs = y = array([
    [1.2*10**-12, 18*10**-9],
    [2.7*10**-12, 22*10**-9],
    [3.9*10**-12, 20*10**-9],
    [1.2*10**-12, 18*10**-9],
    [2.7*10**-12, 22*10**-9],
    [3.9*10**-12, 20*10**-9],
    [1.2*10**-12, 18*10**-9],
    [2.7*10**-12, 22*10**-9],
    [3.9*10**-12, 20*10**-9]
]).T

#Define the Model
model = Sequential()
model.add(Dense(10, input_shape=(9, 5)))

#Compile the Model
opt = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy']) #binary classification

#Fit the Model
model.fit(X, y, epochs=100, batch_size=32) #can add verbose=0 if you want to turn off training outputs

#Evaluate the Model
loss = model.Evaluate(X, y, verbose=0)

#Make a prediction
yhat = model.predict(X)

#Goal input
#array = [input power, tl12, tl4, rout, (50+0j)]

有人有什么建议吗?如果您也看到任何其他错误,请告诉我:) 提前非常感谢您!

【问题讨论】:

  • 除了错误和硬编码之外,我不确定 keras 是否可以处理复数输入。相反,您可以将特征的实部和虚部视为两个独立的特征。
  • @akilat90 好的,感谢您的建议。那是我最初的方法,所以我会回到那个。从那里我可能仍然有同样的问题。
  • 您可以将实部和虚部的系数分成两个不同的特征。这样,您最终将在输入中获得总共 8 个特征。此外,在训练网络以获得更好的结果之前,您必须对所有内容进行规范化,如果您的目标是预测输出变量中的这些值,那么准确度不是正确的指标。优化器和损失函数也是如此。数据集太小了。祝你好运!
  • 嗨@nemanjaone,你能给我更多关于你的问题的细节吗?我似乎无法复制错误。

标签: python numpy tensorflow machine-learning keras


【解决方案1】:

我能够在tensorflow_version 1.15.2 中重现您的错误。

您将不正确的input_shape 传递给模型。 input_shape 是一个 Shape 元组(不包括批处理轴)或 TensorShape 实例(不包括批处理轴)。

修改,

model.add(Dense(10, input_shape=(9, 5)))

model.add(Dense(10, input_shape=(5,)))

5 之后的, 只是用于创建仅包含一个元素的元组的 Python 表示法。

此外,由于您的输入形状只有一维,因此您无需将其作为元组提供,而是将 input_dim 作为标量数提供。下面的修改也可以,

model.add(Dense(10, input_dim=(5)))

如果你也想传递batch_size那么修改如下,

model.add(Dense(10, input_shape=(5,), batch_size=9))

还要确保Xy 的长度相同,否则会抛出错误。提及这一点是因为您在y 上执行了transpose

希望这能回答您的问题。快乐学习。

【讨论】:

  • @nemanjaone - 希望我们已经回答了您的问题。如果您对答案感到满意,请您接受并投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 2018-07-18
  • 2019-04-27
  • 2020-02-25
  • 2018-05-15
  • 1970-01-01
相关资源
最近更新 更多