我需要使用小型神经网络(100-150 个参数)进行大量预测。我在 TensorFlow 中实现了它,但遇到了效率问题。这是伪代码:for my_dense_netowrk,my_lstm_n...
我需要用小型神经网络(100-150 个参数)进行大量预测。我在 TensorFlow 中实现了它,但遇到了效率问题。以下是伪代码:
for my_dense_netowrk,my_lstm_netowrk in networks_list
my_dense_netowrk.paramters = 100
my_lstm_netowrk.paramters = 150
for images in data[:60]:
@tf.function
def tf_wrapper(images, state):
model_data = meta_model(images)
data_prepared = image_preparation(model_data)
results = my_dense_netowrk(data_prepared)
results.shape = (19000,1,1)
better_results, state = my_lstm_netowrk(results, state)
return better_results, state
better_results, state = tf_wrapper(images, state)
my_dense_netowrk_n2.paramters = 100
my_lstm_netowrk_n2.paramters = 100
and continue...
因此,似乎 tensorflow 并没有被我的模型所限制,这很奇怪,而且互联网上关于如何有效地从小型模型中获得许多预测的讨论并不多,每个人都使用这样的库来处理大型 NN。虽然我认为我的管道应该会从中受益,因为我使用了大批量,但 gpu 根本没有帮助。所以我真的很难找到一个好的解决方案,想征求一下建议。也许有更好的 ml 框架可以解决我的问题(PyTorch、Jax,也许还有其他的?)或者我只是不擅长分析?或者我应该尝试用汇编语言构建自己的内核吗?我不知道
我目前的项目包括构建一个 Angular 前端来捕获 POST 请求 API,该 API 既从我的 Amazon 发送数据(例如“image_id”、“modules”等列表)
我当前的项目包括构建一个 Angular 前端来捕获 POST 请求 API,该 API 既从我的 Amazon DynamoDB 表发送数据(例如 \'image_id\'、\'modules\' 等列表),也从 Angular 验证传入的输入(也是 image_id 等列表),具体取决于有效负载(后端 AWS lambda 函数是 Java,我的具体任务是构建数据检索)。我正处于项目阶段,需要将我的 lambda 函数连接到 DynamoDB 并获取特定数据(我想要获取的第一个数据是 \'image_id\',包含在 \'container_master\' 表中)。表的每个项目中都有一个 \'image_id\' 键,我现在希望能够收集所有 id。但是,我遇到了障碍。问题是,当“image_id”数组显示在网站的控制台上时,它是空的。我认为问题是由于 lambda 函数对数据库中扫描项目的处理造成的,因为任何其他硬编码并发送到我的网站的数组都可以很好地呈现。
HomeScreen_Entity.java:
@DynamoDBTable(tableName = "container_master")
public class HomeScreen_Entity {
private String image_id;
AmazonDynamoDB dynamoDBClient;
private Regions REGION = Regions.US_WEST_2;
DynamoDBMapper mapper;
public HomeScreen_Entity() {
dynamoDBClient = AmazonDynamoDBClientBuilder.standard().withRegion(REGION).build();
mapper = new DynamoDBMapper(dynamoDBClient);
}
@DynamoDBHashKey(attributeName = "image_id")
public String getImage_id() {
return image_id;
}
public void setImage_id(String image_id) {
this.image_id = image_id;
}
public List<String> getAllImageIds() { //HomeScreen_Entity.java
ScanRequest scanRequest = new ScanRequest()
.withTableName("container_master")
.withAttributesToGet("image_id");
ScanResult result = dynamoDBClient.scan(scanRequest);
List<String> imageIds = new ArrayList<>();
for (Map<String, com.amazonaws.services.dynamodbv2.model.AttributeValue> item : result.getItems()) {
if (item.containsKey("image_id")) {
imageIds.add(item.get("image_id").getS());
}
}
}
}
上面的代码处理DynamoDB表的扫描。ECS_DAO.java:
public List<HomeScreen_Entity> fetchData(Payload_Entity pe) { //ECS_DAO.java
List<HomeScreen_Entity> entities = new ArrayList<>();
try {
HomeScreen_Entity homeScreenEntity = new HomeScreen_Entity();
List<String> imageIds = homeScreenEntity.getAllImageIds();
for (String id : imageIds) {
HomeScreen_Entity entity = new HomeScreen_Entity();
entity.setImage_id(id);
entities.add(entity);
}
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("No records found");
}
return entities;
}
上面的代码将处理所有常规数据(目前,我专注于图像 ID。ECS_BO.java:
public List<String> retrieveDataFromDynamoDB(Payload_Entity pe) { //ECS_BO.java
ECS_DAO db = new ECS_DAO();
List<HomeScreen_Entity> data = db.fetchData(pe);
List<String> imageIds = data.stream()
.map(HomeScreen_Entity::getImage_id)
.collect(Collectors.toList());
return imageIds;
}
上述代码将 HomeScreen_Entity 对象转换为 List
case RETRIEVE_DATA: //MainController.java. payload change to "retrieve" instead of "execute"/"running"
ECS_BO ecsbo = new ECS_BO();
body = ecsbo.retrieveDataFromDynamoDB(pe);
return buildBodyApiResponse(context, 200, body);
...
我很难弄清楚为什么 \'body\' 返回一个空数组。我猜是数据扫描处理存在问题。免责声明:DynamoDB 表中应该有几个项目。另一个免责声明:image_id 是分区键。