【问题标题】:tensor1d requires value to be a flat/ typedarraytensor1d 要求值是平面/类型数组
【发布时间】:2018-08-09 08:45:03
【问题描述】:

我正在尝试使用 8 个输入来预测一个人是否患有糖尿病的基本分类。 我已经使用 keras 训练了模型

X = dataset[:,0:8]
Y = dataset[:,8]
model = Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', 
activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', 
activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics= 
['accuracy'])
x_train, x_test, y_train, y_test = train_test_split(X, Y, 
test_size=0.3, random_state =25)
model.fit(x_train, y_train, batch_size=20, epochs=100, verbose=1, 
validation_data=(x_test,y_test))
scores = model.evaluate(x_train, y_train, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
model.save('logreg.h5')

现在使用 tensforjs_convertor 我已将 logreg.h5 转换为 model.json

这是我的 app.component.ts,我想在其中使用经过训练的模型并进行预测

async loadModel() {
this.model = await tf.loadModel('/assets/model.json');
}  
async submit(form: NgForm){
this.loading= true;
var x = tf.tensor1d([[form.value.p], [form.value.glu], 
[form.value.bp], [form.value.sk], [form.value.insulin], 
[form.value.bmi], [form.value.op], [form.value.a], 
[form.value.pred],]);  
var y = tf.tensor2d([form.value.pred])
const output = this.model.predict(tf.tensor1d([x])) as any;

我正在从 html 中获取表单值 运行项目后,浏览器控制台显示如下错误,tensor1d requires value to be a flat/ typedarray

我是这个 keras 和 tensorflowjs 的新手,有人可以帮忙

【问题讨论】:

  • 你为什么要给 tf.tensor1d() 提供一个数组?不应该只需要 [form.value.p, form.value.glu, ...] 吗?我可能完全误解了您的代码,因为我通常在 python 中执行此操作,但这对我来说有点奇怪。看起来您正在为 1d 张量提供 2d 数据块。
  • 我正在尝试将 AngularJs 用于前端,使用 keras 预训练模型并集成到我的前端,因此如果用户提供输入,他可以通过调用 keras 预训练模型来获得输出。我已经通过 form.value.p 尝试过,它给了我以下错误:检查模型时出错:您传递给模型的张量数组不是模型预期的大小。预计会看到 1 个张量,但得到了 9 个张量。 @alkanen
  • 当您遇到该错误时,能否显示“var x =”的整行?
  • 您还将 var x 创建为 tensor1d,然后当您将其发送到 predict 时,将该 tensor1d 放入您输入到新 tensor1d 的数组中。为什么不直接运行 this.model.predict(x) ?

标签: python angularjs tensorflow keras tensorflow.js


【解决方案1】:

正如@alkanen 已经评论过的,您传递给 tensor1d 的值是一个数组数组。 ([[val],[val]])。

据我了解,form.value.X 的值已经是浮点数,因此您可以像 [form.value.p, form.value.glu, ...] 这样简单地用它们创建一个浮点数组,然后将其传递给tf.tensor1d()

第二件事是,predictfit 将张量或张量数组 (Reference) 作为允许批处理的参数,因此您可以将其称为 this.model.predict([x])

【讨论】:

    【解决方案2】:

    要求值是平面/类型化数组

    表示作为参数传入张量的数组的维度或等级存在问题。

    tf.tensor1d 要求参数是平面数组(深度为 1 的数组),这意味着该数组不应嵌套 [1, 2, 3]

    同样tf.tensor2d要求参数是深度为2的数组,它应该像[[1, 2], [3,4]]

    解决问题:

    x = tf.tensor1d([form.value.p, form.value.glu, form.value.bp, form.value.sk, form.value.insulin,form.value.bmi, form.value.op, form.value.a, form.value.pred])
    

    您将y 声明为 tensor2d,form.value.pred 既用作特征 (x) 又用作标签 (y)。无论是错字还是您正在实施的架构。但要连贯起来,xy 中的数据结构并不相同。因此,您可能会考虑将您的 y 声明为也是一个 tensor1d,或者您确保在将 form.value.pred 用于 x 之前将其展平

    【讨论】:

      猜你喜欢
      • 2019-05-10
      • 1970-01-01
      • 2022-01-18
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 2016-09-10
      相关资源
      最近更新 更多