高焕堂AI创新学习专区
直播中

小伍

9年用户 4814经验值
擅长:电源/新能源 嵌入式技术
私信 关注
[经验]

在Android Studio里撰写Python程序

1.首先建立一个Android项目
首先建立一个新的Android程序开发项目。
  
  例如,档案名称是—myHello.py。
  
  并且开始撰写Python程序:
  
      其完整程序如下:
#myHello.py
将numpy导入为np
从Java导入jclass
def sigmoid(x):
    返回1 /(1 + np.exp(-x))
def softmax(x):
    orig_shape = x.shape
    如果len(x.shape)> 1:
         #矩阵
         tmp = np.max(x,axis = 1)
         x- = tmp.reshape((x.shape [0],1))
         x = np.exp(x)
         tmp = np.sum(x,axis = 1)
         x / = tmp.reshape((x.shape [0],1))
    其他:
         #向量
         tmp = np.max(x)
         x- = tmp
         x = np.exp(x)
         tmp = np.sum(x)
         x / = tmp
    返回x

hidden_​​nodes = 3
output_labels = 2
dx = np。array([[7.5,5.5],[3,12.5],[6.6,3.5],[1.2,7.5],
            dtype = np.float32)
test_x = np。array([[2.8,5.9],[4.8,3.3]],dtype = np.float32)
dt = np。数组([[1,0],[0,1],[1,0],[0,1]],dtype = np.float32)
wh = np。数组([[0.1,0.5,0.1],
             [0.1,0.5,0.1]],dtype = np.float32)
bh = np.array([0.5,0.5,0.5],dtype = np.float32)
wo = np。数组([[0.1,0.5],[0.5,0.5],[0.5,0.1]],dtype = np.float32)
bo = np.array([0.5,0.5],dtype = np.float32)
lr = 0.05
yv = 0
def one_round(x,t):
    全球wh,bh,wo,bo,lr,yv
    #-----开始训练-----------------------
    #feedforward
    yh = np.dot(x,wh)+ bh
    zh =乙状结肠(yh)
    yo = np.dot(zh,wo)+ bo
    zo = softmax(yo)
    #BP用于输出---------------------
    误差= t-zo
   增量= lr *错误
    error_h = np.dot(delta,wo.T)
    dw_o = np.zeros((3,2),np.float32)
    对于我在范围(3)中:
        对于范围(2)中的j:
            dw_o [i,j] = zh  * delta [j]
    db_o =增量
    #隐藏的BP
    delta_h = zh *(1-zh)* error_h
    dw_h = np.zeros((2,3),np.float32)
    对于我在范围(2)中:
        对于范围(3)中的j:
            dw_h [i,j] = x  * delta_h [j]
    db_h =增量_h
    #更新权重
    wh + = dw_h
    bh + = db_h
    wo + = dw_o
    bo + = db_o
    yv + = 1
#------------------------------------
def train(ep):
    全球wh,bh,wo,bo,lr,yv
    对于范围(100)中的k:
        对于我在范围(4)中:
            one_round(dx ,dt )
    返回yv
#-----预测------------------------
def预测(x):
    全局wh,bh,wo,bo,lr,yv,test_x
    yh = np.dot(test_x,wh)+ bh
    zh =乙状结肠(yh)
    yo = np.dot(zh,wo)+ bo
    zo = softmax(yo)
    pv = np.round(zo,5)
   返回PV
# 结束
2.之前的Python程序码的说明
   这是一个二元分类的范例。其中有2只<玩具兔>和2只<玩具猫>。其中,主要的特征在于兔子是:耳朵长,尾巴短;而猫则是:尾巴长,耳朵短。其资料如下:
     
※正向推演(Feed-Forward)阶段
上述Python程式,建立了一个两层的NN模型(含有一个隐藏层):
3.png
其中,权重(W)则代表讯息传递的强弱。然后,需要使用到不同的数学式来计算各个y值(包括y0、y1、y2、y3),这些数学式,就如下图所示:  
   所谓正向推演部分,就是将x0和x1训练资料喂给(Feed)这NN模型的输入层,然后透过上图的数学式的计算,推演出下一层(即隐藏层)的y0,y1和y2。,基于这些y []值,计算出z []值,再透过数学式的计算,推演到下一层(即输出层)的z3值。
※反向传播(反向传播)阶段
  通过先前的正向推演计算,得到了输出层的z3值之后,就可以展开反向传播的运算了。首先计算落差值(t-z3),再从这落差值计算出<反向修正值( Delta)>,如下图:

  然后,拿这反向修正(Delta)值来与w03相乘,就反向推演出隐藏层第#0神经元(即y0)的误差值了。如下图:
同样地,拿这delta值来与w13相乘,就反向推演出隐藏层y1神经元的误差值了。如下图:  
5.png
同样地,拿这delta值来与w13相乘,就反向推演出隐藏层y2神经元的误差值了。如下图:  
到此已经反向推演出隐藏层的各神经元的落差值:loss_y0,loss_y1和loss_y2值了。然后,就根据落差值来计算出修正值:delta_y0,delta_y1和delta_y2值。权重(Weight)值了。例如,从loss_y0计算出delta_y0,继续通过由delta_y0来修正w00和w10值,来提升这NN模型的智慧,如下图:
        一样地,也从loss_y1计算出delta_y1,继续通过由delta_y1来修正w01和w11的值。一样地,也从loss_y2计算出delta_y2,继续通过由delta_y2来修正w02和w12的值,来记录NN模型的智慧,如下图:
    最后,依据输出层的delta值来修正输出层的权重(Weight)如下图:
于是,完成了这个2层AI模型的训练了。
3. 开发Java程式:定义UI
   开始以Java设计UI部分,兹修改myActivity.java如下:
9.png
其完整程序如下:
#myActivity.java
package com.example.chaquo01;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import java.util.List;
import com.chaquo.python.android.AndroidPlatform;
import com.chaquo.python.*;

public class myActivity extends AppCompatActivity {
    TextView tv1, tv2, tv3, tv4, tv5, tv6;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1 = (TextView) findViewById(R.id.tv_device);
        tv2 = (TextView) findViewById(R.id.tv_device2);
        tv3 = (TextView) findViewById(R.id.tv_device3);
        tv4 = (TextView) findViewById(R.id.tv_device4);
        tv5 = (TextView) findViewById(R.id.tv_device5);
        tv6 = (TextView) findViewById(R.id.tv_device6);
        tv2.setText("    ....... Prediction .......");
        //-------------------------------------------------------------------------
        if (!Python.isStarted()) {
            Python.start(new AndroidPlatform(this));
        }
        //------- 呼叫 Python(myHello)程式里的函数:mul_add()
        Python py = Python.getInstance();
        PyObject obj1 = py.getModule("myHello").callAttr("train", 1000);
        PyObject obj2 =
py.getModule("myHello").callAttr("predict", 1000);
        List pyList = obj2.asList();
        String ss1 = pyList.get(0).toString();
        String ss2 = pyList.get(1).toString();
        tv3.setText("    ["+ss1);
        tv4.setText("     "+ss2 + "]");
   }}
4.执行这个Android App程序
  执行这个Android App程序,它首先启动myActivity.java。执行到指令:
     PyObject obj1 = py.getModule(“ myHello”)。callAttr(“ train”,1000);

就调用myHello.py的火车()函数。进行AI模型的训练。训练好了,就执行到指令:
     PyObject obj2 = py.getModule(“ myHello”)。callAttr(“预测”,1000);

就此调用myHello.py的predicyt( )函数,进行预测的任务。然后,输出预测的结果,如下图所示:
  


更多回帖

发帖
×
20
完善资料,
赚取积分