Keras.js中的多维输入

时间:2017-08-10 18:48:45

标签: javascript multidimensional-array keras

我希望使用Keras.js库将我的Keras模型实现到我的网站中。该库的一个问题是,在javascript中输入数据时,只允许使用Float32Array()作为输入。这种类型的数组是1D,在我的Keras模型中,输入是3D。我已经在Keras.js issues page上询问并找到了一些潜在的解决方案,例如添加嵌入层,但需要特定的输入形状,但我希望任何3D输入工作,就像我训练模型时一样。模型结构很简单,有一个输入层,它采用维度为mxnx3的数组(它是一个未知大小的图像,包含r,g和b通道)和一个Conv2D层,然后输出一个mxnx1数组。我知道模型有效,因为它可以根据输入提供良好的输出,所以我唯一的问题是转换到Keras.js。这是我目前的JS代码。

function predictImageWithCNN(data) { //'data' is mxnx3 array
  var final = [];
  //instantiating model from json and buf files
  var model = new KerasJS.Model({
    filepaths: {
      model: 'dist/model.json',
      weights: 'dist/model_weights.buf',
      metadata: 'dist/model_metadata.json'
    },
    gpu: true //MAY NEED TO CHANGE (NOT SURE REALLY)
 });

  //Ready the model.
  model.ready()
  .then(function() {
    //This matches our input data with the input key (b/c Sequential Model)
    var inputData = {
      'input_1': new Float32Array(data)
    };
    // make predictions based on inputData
    return model.predict(inputData);
  })
  .then(function(outputData) {
   //Here we take the outputData and parse it to get a result.

    var out = outputData['output']; //Gets output data

    console.log(out);
    //TODO: Put in code to assign outputData to 'final' so we can then convert it
    //      This should not be too hard to do.

  })
  .catch(function(err) {
    console.log(err);
    // handle error
  });
  return final; // should return nxmx1 array of vals 0-1.
}

如果有人对如何解决这个问题有任何建议,那将非常感激。谢谢! :)

1 个答案:

答案 0 :(得分:0)

LSTM我遇到了同样的问题。我解决这个问题的方法是使用平面版本的数据进行训练,但使用重塑图层作为第一层,使其达到我LSTM所需的形状。例如

model = Sequential()
model.add(Reshape((40,59),input_shape=(1,2360)))
model.add(LSTM(128, input_shape=(maxlen, len(chars))))
model.add(Dense(len(chars)))
model.add(Activation('softmax'))
optimizer = RMSprop(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=optimizer)

然后在Keras.JS我可以从Float32Array

中提取扁平版本