image - 期望第一层具有 x 维,但得到一个形状为 y 的数组
问题描述
(我刚刚在节点上启动 tensorflow.js)
我一直在网上搜索答案。
我有图像数据
的困惑,我尝试将它与其他图像数据一起输入到. 令人困惑的是,无论我如何将一堆图像输入for ,程序都会输出如下所述的错误。image1 = tf.fromPixels(img)
xs = tf.tensor([image1, image2])
xs
model.fit
我已经尝试过
的方法当我运行程序时,我得到了Error: Error when checking input: expected conv2d_Conv2D1_input to have 4 dimension(s). but got array with shape 4,1
我知道的错误,因为我没有正确输入 xs。我在网上阅读了一些文章,这些文章涉及您需要如何以某种方式输入数组tf.tensor([[0.2, 0.1], [0.2, 0.4]]);
以及某种类型的图像批处理。我查看了显示图像的文章,您需要另一组图层:
model.add(tf.layers.conv2d({
inputShape: [scaleHeight, scaleWidth, 3],
kernelSize: 5,
filters: 8,
strides: 1,
activation: 'relu',
kernelInitializer: 'VarianceScaling'
}));
model.add(tf.layers.maxPooling2d({
poolSize: [2, 2],
strides: [2, 2]
}));
model.add(tf.layers.conv2d({
kernelSize: 5,
filters: 16,
strides: 1,
activation: 'relu',
kernelInitializer: 'VarianceScaling'
}));
model.add(tf.layers.maxPooling2d({
poolSize: [2, 2],
strides: [2, 2]
}));
model.add(tf.layers.dense({ // Output
units: 2,
kernelInitializer: 'VarianceScaling',
activation: 'softmax'
}));
model.compile({loss: 'categoricalCrossentropy', optimizer: tf.train.sgd(0.1), metrics: ['accuracy']});
好吧,我尝试将其输入,尝试将它们转换为 typedarray 格式,尝试了很多东西。tf.fromPixels(canvas)
我很迷茫,无法为通过for转换为张量的多个图像想出一个适当的 xs 变量model.fit(xs, ys, {epochs: 100, options....});
代码:
var tf = require('@tensorflow/tfjs');
var cv = require('canvas');
var {Image, createCanvas, ImageData} = cv;
tf.disableDeprecationWarnings();
var scaleWidth = 16;
var scaleHeight = 16;
function getImage(path){
var img = new Image();
return new Promise(function(resolve, reject){
img.onload = function(){
var element = createCanvas(scaleWidth, scaleHeight);
var ctx = element.getContext('2d');
ctx.drawImage(img, 0, 0);
ctx.scale(scaleWidth/img.width, scaleHeight/img.height);
//resolve(Array.from(tf.fromPixels(element).flatten().dataSync()));
resolve(tf.fromPixels(element));
};
img.src = path;
});
}
var log = function(input){console.log(input)};
const model = tf.sequential();
model.add(tf.layers.conv2d({
inputShape: [scaleHeight, scaleWidth, 3],
kernelSize: 5,
filters: 8,
strides: 1,
activation: 'relu',
kernelInitializer: 'VarianceScaling'
}));
model.add(tf.layers.maxPooling2d({
poolSize: [2, 2],
strides: [2, 2]
}));
model.add(tf.layers.conv2d({
kernelSize: 5,
filters: 16,
strides: 1,
activation: 'relu',
kernelInitializer: 'VarianceScaling'
}));
model.add(tf.layers.maxPooling2d({
poolSize: [2, 2],
strides: [2, 2]
}));
model.add(tf.layers.dense({ // Output
units: 2,
kernelInitializer: 'VarianceScaling',
activation: 'softmax'
}));
model.compile({loss: 'categoricalCrossentropy', optimizer: tf.train.sgd(0.1), metrics: ['accuracy']});
(async function(){
var cats = [], bland = [];
cats[0] = await getImage('cats/0.jpeg');
cats[1] = await getImage('cats/1.jpeg');
bland[0] = await getImage('bland/0.png');
bland[1] = await getImage('bland/1.png');
var testCats = await getImage('c.jpeg');
var testBland = await getImage('b.jpeg');
var xs = tf.tensor([cats[0], cats[1], bland[0], bland[1]]); // confusion occurs here
for(var c = 0; c < 10; c++){
var result = await model.fit(xs, tf.tensor([[0, 1], [0, 1], [1, 0], [1, 0]]), {epochs: 100});
console.log(result.history.loss[0]);
}
})();
在我运行它之后,我希望至少记录模型的丢失,但它抛出了这个错误:Error: Error when checking input: expected conv2d_Conv2D1_input to have 4 dimension(s). but got array with shape 4,1
解决方案
查看您的代码,传入模型的数据与模型第一层 inputShape 的形状不同。
如何着手解决问题?
- 检查data.shape。
console.log(xs.shape) // it will return (4,1)
与输入形状比较
数据形状应该比 inputShape 高一维(batchsize 多一维)
// Does `xs.inputShape.slice(1) ===[Scaleheight, scaleWidth,3]` ?
shape1 = xs.inputShape.slice(1)
shape2 = [Scaleheight, scaleWidth,3]
const same = (shape1.length == shape2.length) && shape1.every(function(e, i) {
return e === shape2[i];
});
如果它们不相等,有两种方法可以解决问题
tf.reshape
如果可能,使用,tf.slice
,tf.expandDims()
, ...重塑数据或者只是将 inputShape 更改为等于我们的数据形状
在您的情况下, inputShape 和数据形状之间存在明显的不匹配。
首先,您创建 xs 的方式是错误的。实际上,xs 的形状为 (4, 1),具有 NaN 值。就好像你tf.tensor
用一组张量创建了一个。您可以通过以下方式创建 xs:
xs = tf.concat([...cats, ...blands], 0)
但是,不确定这是否会完全解决问题。您需要遍历上面概述的步骤,即检查 xs 的形状,与 inputShape 进行比较等等......
推荐阅读
- javascript - 如何使用指纹js2库?
- c# - JWT 令牌过期未设置为所需时间
- java - 从另一个类更新 GUI
- android - 在 Android 中将 Java 转换为 Kotlin 后出错
- php - 卡在带有反向引用的简单 preg_replace
- python - 如何使 pip 从需求文件中运行特定命令?
- android - VectorDrawable 图像在 android.support.v7.preference.Preference 中显示不正确
- android - 如果我们在颤振应用程序中发布版本,自定义声音不起作用
- python - send_mail 仅适用于 django 的终端
- ocaml - 如何在没有冗余匹配案例的情况下转换通用变体实例?