TensorFlow에서 전체 결합 신경망 구현 + 가중치 획득
19304 단어 파이썬DeepLearningTensorFlow인공지능심층 학습
소개
이번에는 tensorflow에서 전체 결합 신경망의 구현을 시도했을 때의 이야기를 씁니다.
초보자용의 일본어 기사를 여러가지 검색해 보았습니다만, 순수한 전 결합 뉴럴넷의 구현 기사는 적지요?
tensorflow 튜토리얼의 처음이 CNN이 되었기 때문에 모두 그곳을 먼저 구현할까요?
아니면 단순히 너무 쉽고 아무도 쓰지 않습니까?
덧붙여서, 영어 기사를 검색할 때 "dense network"라고 조사하면 CNN의 dense net이 나와 버리므로, 제대로 "dense layer"라고 검색합시다.
모든 결합 신경망을 작성해보십시오.
두 기사를 참고로 구현을 시도했습니다.
1, htps : // 기 st. 기주 b. 코 m / 코 아닌 g / c26b2d5c2b
2, htps : // 기주 b. 코 m/피나에/텐소 rFぉw-M에 ST-에ぁmpぇ/bぉb/마s테 r/푹 ly-이런 c d. py
1번은 tf.layers.dense를 사용한 구현.
2번은 좀 더 세밀하고, 전체 결합층의 가중 W·바이어스 B를 따로 정의하고 있었습니다.
우선 자신은 1번 분의 실장을 모방해 보았습니다.
입력층에의 입력은, 보통(배치 사이즈*입력 차원)이 됩니다만, 이번은 단순하게 「수치를 1개 넣으면 1개의 수치가 출력된다」네트워크를 만들었습니다.
import numpy as np
import tensorflow as tf
x = tf.placeholder(tf.float32, shape=[1, 1]) # 入力
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1")
dense_2 = tf.layers.dense(dense_1, 10, activation=tf.nn.relu, name="dense2")
dense_3 = tf.layers.dense(dense_2, 1, activation=None, name="dense3")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 変数を初期化
input_value = [[10]]
result = sess.run(dense_3, feed_dict={x:input_value})
print(result) # [[ 0.20399502]]
우선, 제대로 움직였습니다.
죄송합니다.
오차 함수나 옵티마이저의 정의도 간단했으므로, 거기에 관해서는 조금의 링크처의 코드를 참고로 해 보세요.
가중치를 얻고 싶습니다.
중간층의 가중치를 보존하고 싶습니다만, 이것이 의외로 귀찮습니다.
방법도 여러 가지 있는 것 같습니다만, 자신은 tf.get_collection 함수를 사용해 보았습니다.
x = tf.placeholder(tf.float32, shape=[1, 1]) # 入力
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1") # 全結合層
# ここに注目
L1 = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense1")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 変数を初期化
print(L1)
dense1의 가중치를 얻는 것을 목적으로, 자신이 한 일을 최소한의 코드로 설명하겠습니다.
위의 코드를 실행하면 다음이 인쇄되었습니다.
[<tf.Variable 'dense1/kernel:0' shape=(1, 10) dtype=float32_ref>, <tf.Variable 'dense1/bias:0' shape=(10,) dtype=float32_ref>]
모두 2개의 오브젝트가 들어 있고, 각각 가중치(dense1/kernel:0)와 바이어스(dense1/bias:0)군요.
일단 tensorboard로 가시화한 결과도 붙여 둡니다.
이상의 결과로부터,dense_1의 가중치 행렬의 이름은 "dense1/kernel:0"이라고 알았으므로, 이것을 직접 꺼내 봅니다.
x = tf.placeholder(tf.float32, shape=[1, 1]) # 入力
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1") # 全結合層
W1 = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense1/kernel")[0] # dense_1の重み
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 変数を初期化
print(W1)
print(W1.eval()) # 重みの値をプリント
# <tf.Variable 'dense1/kernel:0' shape=(1, 10) dtype=float32_ref>
# [[ 0.72343653 0.27341634 0.03631765 -0.09714276 0.42991978 0.64759761
# -0.06103593 0.47831839 -0.17354167 0.62190872]]
잘 작동했습니다!
tf.get_collection 함수는 스코프에 해당하는 변수를 모두 취득하므로, 만약 dense1 안에 "dense1/kernel:0"과 "dense1/kernel:1"의 2개가 있으면,
tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense1/kernel")
는 길이가 2인 목록을 반환합니다.
ls 명령과 비슷한 것입니다.
네임스페이스 정보
변수가 많고 이름을 찾기가 힘들다면 tf.variable_scope를 사용하여 PC에 디렉토리를 만들고 구성하는 것처럼 네임 스페이스를 사용자 정의 할 수 있습니다.
with tf.variable_scope("hoge"):
x = tf.placeholder(tf.float32, shape=[1, 1]) # 入力
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1")
dense_2 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense2")
HOGE = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="hoge")
W2 = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="hoge/dense2/kernel")
W2_bad = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense2/kernel")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 変数を初期化
print(HOGE)
print(W2)
print(W2_bad)
# [<tf.Variable 'hoge/dense1/kernel:0' shape=(1, 10) dtype=float32_ref>, <tf.Variable 'hoge/dense1/bias:0' shape=(10,) dtype=float32_ref>, <tf.Variable 'hoge/dense2/kernel:0' shape=(1, 10) dtype=float32_ref>, <tf.Variable 'hoge/dense2/bias:0' shape=(10,) dtype=float32_ref>]
# [<tf.Variable 'hoge/dense2/kernel:0' shape=(1, 10) dtype=float32_ref>]
# []
네임 스페이스에 "hoge"라는 디렉토리를 만드는 이미지입니까?
주의점은 W2와 W2_bad를 비교하면 알 수 있다고 생각합니다.
중간층의 출력을 저장하고 싶습니다.
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1")
dense_2 = tf.layers.dense(dense_1, 10, activation=tf.nn.relu, name="dense2")
dense_3 = tf.layers.dense(dense_2, 1, activation=None, name="dense3")
의 3층이 있었다고 해, 학습중에 dense_2의 출력을 보존해 두고 싶은 경우 어떻게 하면 좋을까요.
이것에 대한 좋은 방법을 모르고, 자신은
output = sess.run(dense_3)
middle = sess.run(dense_2)
같이 두 번 수고를 걸어 줄까라고 생각하고 있습니다만, 좋은 방법을 알고 있는 분이 있으면 가르쳐 주셨으면 합니다.
Reference
이 문제에 관하여(TensorFlow에서 전체 결합 신경망 구현 + 가중치 획득), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nyancook/items/0ae0138d0abfe6750ed2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
두 기사를 참고로 구현을 시도했습니다.
1, htps : // 기 st. 기주 b. 코 m / 코 아닌 g / c26b2d5c2b
2, htps : // 기주 b. 코 m/피나에/텐소 rFぉw-M에 ST-에ぁmpぇ/bぉb/마s테 r/푹 ly-이런 c d. py
1번은 tf.layers.dense를 사용한 구현.
2번은 좀 더 세밀하고, 전체 결합층의 가중 W·바이어스 B를 따로 정의하고 있었습니다.
우선 자신은 1번 분의 실장을 모방해 보았습니다.
입력층에의 입력은, 보통(배치 사이즈*입력 차원)이 됩니다만, 이번은 단순하게 「수치를 1개 넣으면 1개의 수치가 출력된다」네트워크를 만들었습니다.
import numpy as np
import tensorflow as tf
x = tf.placeholder(tf.float32, shape=[1, 1]) # 入力
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1")
dense_2 = tf.layers.dense(dense_1, 10, activation=tf.nn.relu, name="dense2")
dense_3 = tf.layers.dense(dense_2, 1, activation=None, name="dense3")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 変数を初期化
input_value = [[10]]
result = sess.run(dense_3, feed_dict={x:input_value})
print(result) # [[ 0.20399502]]
우선, 제대로 움직였습니다.
죄송합니다.
오차 함수나 옵티마이저의 정의도 간단했으므로, 거기에 관해서는 조금의 링크처의 코드를 참고로 해 보세요.
가중치를 얻고 싶습니다.
중간층의 가중치를 보존하고 싶습니다만, 이것이 의외로 귀찮습니다.
방법도 여러 가지 있는 것 같습니다만, 자신은 tf.get_collection 함수를 사용해 보았습니다.
x = tf.placeholder(tf.float32, shape=[1, 1]) # 入力
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1") # 全結合層
# ここに注目
L1 = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense1")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 変数を初期化
print(L1)
dense1의 가중치를 얻는 것을 목적으로, 자신이 한 일을 최소한의 코드로 설명하겠습니다.
위의 코드를 실행하면 다음이 인쇄되었습니다.
[<tf.Variable 'dense1/kernel:0' shape=(1, 10) dtype=float32_ref>, <tf.Variable 'dense1/bias:0' shape=(10,) dtype=float32_ref>]
모두 2개의 오브젝트가 들어 있고, 각각 가중치(dense1/kernel:0)와 바이어스(dense1/bias:0)군요.
일단 tensorboard로 가시화한 결과도 붙여 둡니다.
이상의 결과로부터,dense_1의 가중치 행렬의 이름은 "dense1/kernel:0"이라고 알았으므로, 이것을 직접 꺼내 봅니다.
x = tf.placeholder(tf.float32, shape=[1, 1]) # 入力
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1") # 全結合層
W1 = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense1/kernel")[0] # dense_1の重み
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 変数を初期化
print(W1)
print(W1.eval()) # 重みの値をプリント
# <tf.Variable 'dense1/kernel:0' shape=(1, 10) dtype=float32_ref>
# [[ 0.72343653 0.27341634 0.03631765 -0.09714276 0.42991978 0.64759761
# -0.06103593 0.47831839 -0.17354167 0.62190872]]
잘 작동했습니다!
tf.get_collection 함수는 스코프에 해당하는 변수를 모두 취득하므로, 만약 dense1 안에 "dense1/kernel:0"과 "dense1/kernel:1"의 2개가 있으면,
tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense1/kernel")
는 길이가 2인 목록을 반환합니다.
ls 명령과 비슷한 것입니다.
네임스페이스 정보
변수가 많고 이름을 찾기가 힘들다면 tf.variable_scope를 사용하여 PC에 디렉토리를 만들고 구성하는 것처럼 네임 스페이스를 사용자 정의 할 수 있습니다.
with tf.variable_scope("hoge"):
x = tf.placeholder(tf.float32, shape=[1, 1]) # 入力
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1")
dense_2 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense2")
HOGE = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="hoge")
W2 = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="hoge/dense2/kernel")
W2_bad = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense2/kernel")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 変数を初期化
print(HOGE)
print(W2)
print(W2_bad)
# [<tf.Variable 'hoge/dense1/kernel:0' shape=(1, 10) dtype=float32_ref>, <tf.Variable 'hoge/dense1/bias:0' shape=(10,) dtype=float32_ref>, <tf.Variable 'hoge/dense2/kernel:0' shape=(1, 10) dtype=float32_ref>, <tf.Variable 'hoge/dense2/bias:0' shape=(10,) dtype=float32_ref>]
# [<tf.Variable 'hoge/dense2/kernel:0' shape=(1, 10) dtype=float32_ref>]
# []
네임 스페이스에 "hoge"라는 디렉토리를 만드는 이미지입니까?
주의점은 W2와 W2_bad를 비교하면 알 수 있다고 생각합니다.
중간층의 출력을 저장하고 싶습니다.
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1")
dense_2 = tf.layers.dense(dense_1, 10, activation=tf.nn.relu, name="dense2")
dense_3 = tf.layers.dense(dense_2, 1, activation=None, name="dense3")
의 3층이 있었다고 해, 학습중에 dense_2의 출력을 보존해 두고 싶은 경우 어떻게 하면 좋을까요.
이것에 대한 좋은 방법을 모르고, 자신은
output = sess.run(dense_3)
middle = sess.run(dense_2)
같이 두 번 수고를 걸어 줄까라고 생각하고 있습니다만, 좋은 방법을 알고 있는 분이 있으면 가르쳐 주셨으면 합니다.
Reference
이 문제에 관하여(TensorFlow에서 전체 결합 신경망 구현 + 가중치 획득), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nyancook/items/0ae0138d0abfe6750ed2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
x = tf.placeholder(tf.float32, shape=[1, 1]) # 入力
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1") # 全結合層
# ここに注目
L1 = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense1")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 変数を初期化
print(L1)
[<tf.Variable 'dense1/kernel:0' shape=(1, 10) dtype=float32_ref>, <tf.Variable 'dense1/bias:0' shape=(10,) dtype=float32_ref>]
x = tf.placeholder(tf.float32, shape=[1, 1]) # 入力
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1") # 全結合層
W1 = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense1/kernel")[0] # dense_1の重み
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 変数を初期化
print(W1)
print(W1.eval()) # 重みの値をプリント
# <tf.Variable 'dense1/kernel:0' shape=(1, 10) dtype=float32_ref>
# [[ 0.72343653 0.27341634 0.03631765 -0.09714276 0.42991978 0.64759761
# -0.06103593 0.47831839 -0.17354167 0.62190872]]
tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense1/kernel")
변수가 많고 이름을 찾기가 힘들다면 tf.variable_scope를 사용하여 PC에 디렉토리를 만들고 구성하는 것처럼 네임 스페이스를 사용자 정의 할 수 있습니다.
with tf.variable_scope("hoge"):
x = tf.placeholder(tf.float32, shape=[1, 1]) # 入力
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1")
dense_2 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense2")
HOGE = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="hoge")
W2 = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="hoge/dense2/kernel")
W2_bad = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="dense2/kernel")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 変数を初期化
print(HOGE)
print(W2)
print(W2_bad)
# [<tf.Variable 'hoge/dense1/kernel:0' shape=(1, 10) dtype=float32_ref>, <tf.Variable 'hoge/dense1/bias:0' shape=(10,) dtype=float32_ref>, <tf.Variable 'hoge/dense2/kernel:0' shape=(1, 10) dtype=float32_ref>, <tf.Variable 'hoge/dense2/bias:0' shape=(10,) dtype=float32_ref>]
# [<tf.Variable 'hoge/dense2/kernel:0' shape=(1, 10) dtype=float32_ref>]
# []
네임 스페이스에 "hoge"라는 디렉토리를 만드는 이미지입니까?
주의점은 W2와 W2_bad를 비교하면 알 수 있다고 생각합니다.
중간층의 출력을 저장하고 싶습니다.
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1")
dense_2 = tf.layers.dense(dense_1, 10, activation=tf.nn.relu, name="dense2")
dense_3 = tf.layers.dense(dense_2, 1, activation=None, name="dense3")
의 3층이 있었다고 해, 학습중에 dense_2의 출력을 보존해 두고 싶은 경우 어떻게 하면 좋을까요.
이것에 대한 좋은 방법을 모르고, 자신은
output = sess.run(dense_3)
middle = sess.run(dense_2)
같이 두 번 수고를 걸어 줄까라고 생각하고 있습니다만, 좋은 방법을 알고 있는 분이 있으면 가르쳐 주셨으면 합니다.
Reference
이 문제에 관하여(TensorFlow에서 전체 결합 신경망 구현 + 가중치 획득), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nyancook/items/0ae0138d0abfe6750ed2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
dense_1 = tf.layers.dense(x, 10, activation=tf.nn.sigmoid, name="dense1")
dense_2 = tf.layers.dense(dense_1, 10, activation=tf.nn.relu, name="dense2")
dense_3 = tf.layers.dense(dense_2, 1, activation=None, name="dense3")
output = sess.run(dense_3)
middle = sess.run(dense_2)
Reference
이 문제에 관하여(TensorFlow에서 전체 결합 신경망 구현 + 가중치 획득), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nyancook/items/0ae0138d0abfe6750ed2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)