Flutter未知功能插件synadart的潜在使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter未知功能插件synadart的潜在使用

synadart

synadart库可以用于创建任何复杂程度的神经网络,并且可以通过研究其极其干净的实现来学习源代码。

启动我们的第一个网络

要开始使用synadart,我们首先需要将其导入到项目中:

import 'package:synadart/synadart.dart';

接下来,我们需要创建一个我们选择类型的网络。让我们创建一个序列网络,在其中每个层有一个输入和一个输出张量。这应该相当简单:

final network = Sequential(learningRate: 0.3);

我们的网络目前是空的;它没有包含任何层,因此也没有神经元。现在让我们添加三个层:输入层、一个隐藏层和输出层:

network.addLayers([
  Dense(15, activationAlgorithm: ActivationAlgorithm.sigmoid),
  Dense(5, activationAlgorithm: ActivationAlgorithm.sigmoid),
  Dense(1, activationAlgorithm: ActivationAlgorithm.sigmoid),
]);

现在我们的网络有了结构,我们可以开始使用它了。不过,我们的网络还没有训练过,对它做的事情一无所知。现在该训练它了。

首先,我们将创建一个预期值列表,即我们期望网络输出的值。在这里,我们期望得到数字“5”。

final expected = [
  [0.01], // 0
  [0.01], // 1
  [0.01], // 2
  [0.01], // 3
  [0.01], // 4
  [0.99], // 5 ( 这是我们期待的 )
  [0.01], // 6
  [0.01], // 7
  [0.01], // 8
  [0.01], // 9,
];

太棒了,我们现在期望我们的婴儿网络神奇地输出数字“5”,而没有教它任何东西。哦,对了——这就是训练数据的作用!

我们必须告诉网络每个预期输出值与什么相关联。现在让我们教它一些数字:

final trainingData = [
  '111101101101111'.split('').map(double.parse).toList(), // Pixel representation of a 0,
  '001010001001001'.split('').map(double.parse).toList(), // a 1,
  '111001111100111'.split('').map(double.parse).toList(), // a 2,
  '111001111001111'.split('').map(double.parse).toList(), // a 3,
  '101101111001001'.split('').map(double.parse).toList(), // a 4,
  '111100111001111'.split('').map(double.parse).toList(), // a 5,
  '111100111101111'.split('').map(double.parse).toList(), // a 6,
  '111001001001001'.split('').map(double.parse).toList(), // a 7,
  '111101111101111'.split('').map(double.parse).toList(), // an 8,
  '111101111001111'.split('').map(double.parse).toList(), // and a 9.
];

现在我们已经授予我们的网络总共10个数字来学习,我们可以开始用我们设置好的值训练网络:

network.train(inputs: trainingData, expected: expected, iterations: 5000);

太好了!我们已经使用像素表示的数字图像训练了我们的网络,并且我们的网络现在能够相对自信地识别数字“5”。。 最后一步是自己测试网络的能力。

让我们给我们的网络一些扭曲的数字“5’的像素表示:

final testData = [
  '111100111000111'.split('').map(double.parse).toList(),
  '111100010001111'.split('').map(double.parse).toList(),
  '111100011001111'.split('').map(double.parse).toList(),
  '110100111001111'.split('').map(double.parse).toList(),
  '110100111001011'.split('').map(double.parse).toList(),
  '111100101001111'.split('').map(double.parse).toList(),
];

为了检查网络在识别扭曲的“5’时的信心:

for (final test in testData) {
  print('Confidence in recognising a distorted 5: ${network.process(test)}');
}

示例代码

import 'package:synadart/src/layers/core/dense.dart';
import 'package:synadart/synadart.dart';

void main() {
  final network = Sequential(
    learningRate: 0.2,
    layers: [
      Dense(
        size: 15,
        activation: ActivationAlgorithm.sigmoid,
      ),
      Dense(
        size: 5,
        activation: ActivationAlgorithm.sigmoid,
      ),
      Dense(
        size: 1,
        activation: ActivationAlgorithm.sigmoid,
      ),
    ],
  );

  // 我们期望得到数字"5".
  final expected = [
    [0.01], // 0
    [0.01], // 1
    [0.01], // 2
    [0.01], // 3
    [0.01], // 4
    [0.99], // 5
    [0.01], // 6
    [0.01], // 7
    [0.01], // 8
    [0.01], // 9
  ];

  // 训练数据包含不同的数字模式。
  final trainingData = [
    '111101101101111'.split('').map(double.parse).toList(),
    '001010101001001'.split('').map(double.parse).toList(),
    '111001111100111'.split('').map(double.parse).toList(),
    '111001111001111'.split('').map(double.parse).toList(),
    '101101111001001'.split('').map(double.parse).toList(),
    '111100111001111'.split('').map(double.parse).toList(), // 5
    '111100111101111'.split('').map(double.parse).toList(),
    '111001001001001'.split('').map(double.parse).toList(),
    '111101111101111'.split('').map(double.parse).toList(),
    '111101111001111'.split('').map(double.parse).toList(),
  ];

  // 测试数据包含扭曲的数字"5"的模式。
  final testData = [
    '111100111000111'.split('').map(double.parse).toList(),
    '111100010001111'.split('').map(double.parse).toList(),
    '111100011001111'.split('').map(double.parse).toList(),
    '110100111001111'.split('').map(double.parse).toList(),
    '110100111001011'.split('').map(double.parse).toList(),
    '111100101001111'.split('').map(double.parse).toList(),
  ];

  // 数字"5"本身。
  final numberFive = trainingData[5];

  // 使用训练和 预期数据训练网络。
  network.train(inputs: trainingData, expected: expected, iterations: 20000);

  print('Confidence in recognising a 5: ${network.process(numberFive)}');
  for (final test in testData) {
    print('Confidence in recognising a distorted 5: ${network.process(test)}');
  }
  print('Is 0 a 5? ${network.process(trainingData[0])}');
  print('Is 8 a 5? ${network.process(trainingData[8])}');
  print('Is 3 a 5? ${network.process(trainingData[3])}');
}

更多关于Flutter未知功能插件synadart的潜在使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter未知功能插件synadart的潜在使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,探索和利用第三方插件可以极大地扩展应用的功能。尽管“synadart”这个特定的插件名称听起来并不是Flutter社区中广泛认知的一个插件(可能是某个特定项目或公司内部开发的插件),但我可以基于一般Flutter插件的使用方式,展示如何集成和使用一个假设的、具有未知功能的Flutter插件。

以下是一个假设性的示例,展示如何在Flutter项目中集成并使用一个名为synadart的插件(请注意,这里的代码是示例性的,实际插件的使用和API可能会有所不同):

  1. 添加插件依赖

    首先,你需要在pubspec.yaml文件中添加synadart插件的依赖。由于我们不知道实际的插件仓库地址或版本,这里假设它是一个公开发布的插件:

    dependencies:
      flutter:
        sdk: flutter
      synadart: ^x.y.z  # 替换为实际的版本号
    

    然后运行flutter pub get来安装依赖。

  2. 导入插件

    在你的Dart文件中导入该插件:

    import 'package:synadart/synadart.dart';
    
  3. 使用插件功能

    假设synadart插件提供了一个名为performUnknownFunction的方法,该方法接受一些参数并返回一个结果。下面是如何调用这个方法的示例代码:

    import 'package:flutter/material.dart';
    import 'package:synadart/synadart.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Synadart Example'),
            ),
            body: Center(
              child: ElevatedButton(
                onPressed: () async {
                  try {
                    // 调用插件的未知功能方法
                    var result = await SynaDart.performUnknownFunction(
                      param1: 'example',
                      param2: 123,
                    );
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(content: Text('Result: $result')),
                    );
                  } catch (e) {
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(content: Text('Error: ${e.toString()}')),
                    );
                  }
                },
                child: Text('Perform Unknown Function'),
              ),
            ),
          ),
        );
      }
    }
    
    // 假设SynaDart是一个提供静态方法的类
    class SynaDart {
      static Future<String> performUnknownFunction({
        required String param1,
        required int param2,
      }) async {
        // 这里应该是插件内部实现的代码,但因为我们不知道具体实现,所以用模拟代码代替
        // 实际上,这里会调用插件的native代码
        return 'Simulated Result based on $param1 and $param2';
      }
    }
    

    注意:上面的SynaDart类及其performUnknownFunction方法是模拟的,因为在实际情况下,插件会提供这些实现。你需要查阅插件的文档来了解正确的使用方法和API。

  4. 运行应用

    现在你可以运行你的Flutter应用,点击按钮来调用synadart插件的假设功能,并查看结果。

由于synadart插件的具体信息未知,上述代码仅作为展示如何在Flutter中集成和使用第三方插件的示例。在实际应用中,你需要参考插件的官方文档来获取正确的使用方法、API接口和参数说明。

回到顶部