我正在开发一个Android应用程序,该程序从用户那里获取输入,并将其传递给已转换为tflite的TensorFlow机器学习模型进行预测。然而,在接收到输入后,我的应用程序崩溃了。在我编写的应用程序无法工作后,我使用了我在YouTube教程中跟随的代码,以获取一些见解。但是在两种情况下,我都得到了同样的错误。这是代码。
import androidx.appcompat.app.AppCompatActivity;import android.content.*;import android.content.res.*;import android.os.Bundle;import android.view.View;import android.widget.*;import org.tensorflow.lite.Interpreter;import java.io.FileInputStream;import java.io.IOException;import java.nio.MappedByteBuffer;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.channels.FileChannel;import android.os.Bundle;public class Input_Activity_2 extends AppCompatActivity{ EditText inputNumber; Button inferButton; TextView outputNumber; Interpreter tflite; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_input__2); inputNumber=(EditText)findViewById(R.id.inputNumber); outputNumber=(TextView)findViewById(R.id.outputNumber); inferButton=(Button)findViewById(R.id.inferButton); //final int getText1=Integer.parseInt(inputNumber.getText().toString()); try{ tflite=new Interpreter(loadModelFile()); }catch(Exception ex){ ex.printStackTrace(); } //当我们点击推理按钮时,应该进行推理 inferButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view){ float prediction=doInference(inputNumber.getText().toString()); outputNumber.setText(Float.toString(prediction)); } }); } public float doInference(String inputString){ //输入形状为[1]。单值输入 float[] inputVal=new float[1]; inputVal[0]=Float.valueOf(inputString); //输出形状为[1][1] float[][] outputval=new float[1][1]; //运行推理,传递输入形状并获取输出形状 tflite.run(inputVal, outputval); //推理值位于[0][0] float inferredValue=outputval[0][0]; return inferredValue; } private MappedByteBuffer loadModelFile() throws IOException { AssetFileDescriptor fileDescriptor=this.getAssets().openFd("test_linear.tflite"); FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor()); FileChannel fileChannel = inputStream.getChannel(); long startOffset = fileDescriptor.getStartOffset(); long declaredLength = fileDescriptor.getDeclaredLength(); return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength); }}
这是Python代码
import tensorflow as tfimport numpy as npfrom tensorflow import kerasfrom tensorflow import litemodel=keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])model.compile(optimizer='sgd', loss='mean_squared_error')xs=np.array([-1.0,0.0,1.0,2.0,3.0,4.0],dtype=float)ys=np.array([-3.0,-1.0,0.0,3.0,5.0,7.0],dtype=float)model.fit(xs,ys,epochs=500)print(model.predict([10.0]))keras_file="test_linear.h5"keras.models.save_model(model,keras_file)converter=lite.TocoConverter.from_keras_model_file(keras_file)tflite_model=converter.convert()open("test_linear.tflite","wb").write(tflite_model)
我得到了以下错误
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.androidfirebaseauth2019, PID: 10695 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at com.example.androidfirebaseauth2019.Input_Activity_2$1.onClick(Input_Activity_2.java:48) at android.view.View.performClick(View.java:7125) at android.view.View.performClickInternal(View.java:7102) at android.view.View.access$3500(View.java:801) at android.view.View$PerformClick.run(View.java:27336) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
任何帮助都将不胜感激。谢谢。
编辑:-
这是我的activity_input_2
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/background" android:exported="true" tools:context=".Input_Activity_2"> <EditText android:id="@+id/inputNumber" android:layout_width="221dp" android:layout_height="0dp" android:layout_marginTop="150dp" android:layout_marginBottom="34dp" android:ems="10" android:inputType="number" app:layout_constraintBottom_toTopOf="@+id/inferButton" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/inferButton" android:layout_width="218dp" android:layout_height="0dp" android:layout_marginBottom="55dp" android:text="Find my Organ!" app:layout_constraintBottom_toTopOf="@+id/textView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/inputNumber" /> <TextView android:id="@+id/textView" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginStart="22dp" android:layout_marginEnd="22dp" android:layout_marginBottom="97dp" android:text="TextView" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/inferButton" /></androidx.constraintlayout.widget.ConstraintLayout>
回答:
您试图在activity_input__2.xml
中查找一个不存在的TextView
。您有一个inputNumber
,但没有outputNumber
,所以这个调用返回null
:
outputNumber=(TextView)findViewById(R.id.outputNumber);