Acitivation 함수란 ?

-  각 Layer의 말단에서 일정 값 기준으로 classification 해주는 것

 

Sigmoid function의 단점

   Backpropagation에서 Layer가 많아질수록 정확성이 매우 떨어진다. (Sigmoid를 통과하기 때문에 항상 1보다 작은 값이고 0에 가까운 값이 된다.) 결국은 입력이 크게 영향을 미치지 않고 0에 가까워져버리게된다. 

Vanishing gradient 문제가 발생하여 gradient가 아주 작아지는 앞쪽 Layer에서는 제대로 된 학습이 이루어 질 수 없다. local minimum에 정착되업린다.

 

ReLu : Rectified Linear Unit

  • 0보다 작을 경우 버리고 0보다 클 경우 값에 비례해서 커진다. 
  • 마지막 Layer의 출력은 반드시 Sigmoid를 사용해야한다. (마지막 Layer의 출력은 0~1 사이의 값이여야 하므로)

'Deep Learning' 카테고리의 다른 글

ConvNet Max pooling 과 Full Network  (1) 2019.06.24
CNN - Convolutional Neural Network  (0) 2019.06.24

안드로이드 웹 통신하기


안드로이드 진저브레드 이상에서는 Main Thread에서 네트워킹 관련 클래스 사용하면 에러가 발생합니다.

그래서 네트워킹 관련 클래스를 사용할때는 다른 Thread를 사용해야 합니다.



아래 예제는 String인 urlStr에 입력되어있는 웹페이지의 내용을 가져와서 TextView에 보여주는 예제입니다.

HttpUrlConnection은 네트워킹 관련 클래스 이므로 별도의 Thread를 생성해서 사용해야합니다.

HttpURlConnection을 사용 할 때 몇가지 속성을 더 추가해 줄 수 있습니다.

  • .setConnectTime(10000) - 해당 웹 페이지 연결시간을 10초로 설정
  • .setRequestMethod("POST") - Get/Post 방식 설정 
  • .setDoOutput(true) - outputStream으로 데이터를 넘겨주겠다고 설정
  • .setDoInput(true) - InputStream으로 데이터를 읽겠다고 설정  
  • .getResponseCode() - 연결 상태 확인
아래 코드에서 getResponseCode()를 통해 웹 페이지와 연결이 됐는지 확인하고 됐으면 웹 페이지의 글들을 가져와서 textView에 보여줍니다.
연결되지 않았다면 에러 발생이라는 토스트 메세지를 보여줍니다.
class mThread extends Thread{
@Override
public void run() {
try {
URL url = new URL(urlStr);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
if(urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK){
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in);
urlConnection.disconnect();
}else{
Toast.makeText(getApplicationContext(), "에러발생", Toast.LENGTH_SHORT).show();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}

public void readStream(InputStream in){
final String data = readData(in);
mHandler.post(new Runnable() {
@Override
public void run() {
tv.setText(data);
}
});
}
public String readData(InputStream is){
String data = "";
Scanner s = new Scanner(is);
while(s.hasNext()) data += s.nextLine() + "\n";
s.close();
return data;
}

Handler mHandler = new Handler();


아래 예제는 HttpURLConnection을 사용했습니다.

 


  


 


https://github.com/Ywook/AndroidPractice12


안드로이드 handler, AsyncThread 사용하기


Handler


안드로이드의 UI는 메인 스레드에서만 변경할 수 있습니다.

그래서 만약 서브 스레드에서 UI를 변경하고 싶으면 Handler를 사용해야합니다.

즉, 서브 스레드 -> Handler -> 메인 스레드 과정을 거쳐서 서브 스레드에서 UI를 변경할 수 있습니다.


아래 예제는 서브 스레드에서 TextView의 글자를 바꾸는 예제입니다.

Handler를 생성하는 스레드만 다른 스레드가 보내는 Message 객체나 Runnable 객체를 받을 수 있으므로 

메인 스레드에서 Handler를 생성해 줘야합니다.

public class MainActivity extends AppCompatActivity {
TextView tv;
int i;

Handler mhandler = new Handler(){
@Override
public void handleMessage(Message msg) {
tv.setText("숫자 : "+ i);

}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tv = (TextView)findViewById(R.id.text1);
}

public void onClick(View v){
SubThread th = new SubThread();
th.start();
}

class SubThread extends Thread{
@Override
public void run() {
for(i = 1; i <= 10; i++){
try {
Thread.sleep(1000);
Message msg = mhandler.obtainMessage();
mhandler.sendMessage(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}


Handler를 이용해서 로딩화면을 구현해 줄 수 있습니다.

Handler의 postDelayed는 첫 번째 인자로 Runnable 객체, 두 번째 인자로 입력된 시간 후에 Runnable객체가 실행되게 합니다.

아래 예제에서는 3초후에 화면이 바뀌도록 설정한 예제입니다.

public class LoadingActivity extends AppCompatActivity {
Handler mhandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loading);
mhandler = new Handler();
mhandler.postDelayed(new Runnable() {
@Override
public void run() {
Intent i = new Intent(LoadingActivity.this, MainActivity.class);
startActivity(i);
finish();
}
}, 3000);
}
}


AsyncTask


AsyncTask는 Handler를 사용하지 않고 UI 처리를 할 수 있고, Background 작업을 할 수  있습니다.

AsyncTask에는 5개의 Override 메소드가 있습니다.

  • onPreExecute() - AsyncTask가 실행될 때 처음 실행되는 메소드로 UI 변경을 할 수 있습니다.
  • doInBackground(Params...) - 백그라운드 스레드에서 처리되는 메소드 입니다. 진행 중 UI작업이 필요한 경우 publish Progress함수를 호출하면 UI 작업을 하는 onProgressUpdate가 호출됩니다.
  • onProgressUpdate - doInBackground에서 publishProgress를 호출하면 실행되는 메소드로 UI를 변경할 수 있습니다.
  • onPostExecute(Result) - doInBackGround 메소드 종료 후 호출되고 doInBackGround의 리턴 값을 받습니다.
  • onCancelled() - doInBackground 메소드에서 작업이 호출되면 onPostExecute 대신 호출됩니다.


생성법은 아래와 같습니다.

AsyncTask<String, Integer, Long>  

  • String - doInBackground 메소드의 전달 값 
  • Integer - onProgressUpdate 메소드의 전달 값
  • Void - doInBackground의 반환 값

class myTask extends AsyncTask<String,Integer,Void>{
@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected Long doInBackground(String... params) {
return null;
}

@Override
protected void onProgressUpdate(Integer... values) {
}

@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}


@Override
protected void onCancelled() {
super.onCancelled();
}
}

생성한 AsyncTask를 실행하고 싶을 때는 .execute() 종료하고 싶을 때는 .cancel(true)를 생성합니다.

.execute에 넣어준 인자는 doInBackground에서 사용할 수 있습니다.

myTask task = new myTask();
task.execute(0);
task.cancel(true);


아래 예제는 Handler와 AsyncTask를 사용한 예제입니다.

코드는 깃 허브에서 볼 수 있습니다.

https://github.com/Ywook/AndroidPractice11


  


 


+ Recent posts