tensorflow 실전 독학 [2]

14036 단어 독학Tensorflow
tensor flow 소음 제거 인 코더 실현
자체 인 코더 (autoencoder): 무 감독 학습 알고리즘 으로 주로 데이터 의 차원 을 낮 추거 나 특징 을 추출 하 는 데 사용 된다.깊이 있 는 학습 에서 autoencoder 는 훈련 이 시작 되 기 전에 가중치 행렬 의 초기 값 을 제공 할 수 있 습 니 다.Xaiver Glorot 와 Yoshua Bengio 는 한 논문 에서 깊이 있 는 학습 모델 의 가중치 초기 화가 너무 작 으 면 신 호 는 각 층 간 에 전달 할 때 점점 축소 되 어 작용 하기 어렵 고 가중치 가 너무 크 면 각 층 간 에 전달 할 때 점점 확대 되 고 발산 과 실 효 를 초래 할 것 이 라 고 지적 했다.Xaiver 초기 화 기 는 가중치 행렬 을 크게 초기 화 하 는 것 이 적당 하 다.수학의 측면 에서 볼 때 Xaiver 는 가중치 가 0 의 평균 값 을 만족 시 키 는 동시에 방 차 는 2n i n + n o u t \ \ frac {2} {n {in} + n {out} nin + nout 2 이 고 분 포 는 고 르 게 분포 하거나 고 스 로 분포 할 수 있 습 니 다.
실현 은 주로 다음 과 같은 몇 가지 부분 을 포함한다.
1. 표준 의 균일 한 분 포 를 실현 하 는 Xaiver 초기 화 기: xavierinit(fan_in,fan_out,constant=1)
def xavier_init(fan_in,fan_out,constant=1):
    #fan_in fan_out         ,     Wights
    #      0  ,   2/(fan_in+fan_out)
    low=-constant*np.sqrt(6.0/(fan_in+fan_out))
    high=constant*np.sqrt(6.0/(fan_in+fan_out))
    
    return tf.random_uniform((fan_in,fan_out),minval=low,\
                             maxval=high,dtype=tf.float32)

2. 노 이 즈 인 코딩 을 정의 하 는 class: AdditiveGaussianNoiseAutocoder (object)
class AdditiveGaussianNoiseAutocoder(object):
    #        class
    def __init__(self,n_input,n_hidden,\
                 transfer_function=tf.nn.softplus,\
                 optimizer=tf.train.AdamOptimizer(),scale=0.1):
        
        self.n_input=n_input#     
        self.n_hidden=n_hidden#      
        self.transfer=transfer_function#       
        self.scale=tf.placeholder(tf.float32)#      
        self.training_scale=scale#    
        
        network_weights=self._initialize_weights()
        self.weights=network_weights
        
        self.x=tf.placeholder(tf.float32,[None,self.n_input])#  
        self.hidden=self.transfer(tf.add(tf.matmul(\
                        self.x+scale*tf.random_normal((n_input,)),\
                        self.weights['w1']),self.weights['b1']))#     
        self.reconstruction=tf.add(tf.matmul(\
                            self.hidden,self.weights['w2']),\
                            self.weights['b2'])#    
        
        self.cost=0.5*tf.reduce_sum(tf.pow(tf.subtract(\
                        self.reconstruction,self.x),2.0))#         
        
        self.optimizer=optimizer.minimize(self.cost)#     self.cost
        
        init=tf.global_variables_initializer()
        self.sess=tf.Session()
        self.sess.run(init)#         
        
    def _initialize_weights(self):#       
        all_weights=dict()
        all_weights['w1']=tf.Variable(xavier_init(self.n_input,\
                           self.n_hidden))
        all_weights['b1']=tf.Variable(tf.zeros([self.n_hidden],\
                           dtype=tf.float32))
        all_weights['w2']=tf.Variable(tf.zeros([self.n_hidden,\
                           self.n_input],dtype=tf.float32))
        all_weights['b2']=tf.Variable(tf.zeros([self.n_input],\
                           dtype=tf.float32))
        return all_weights
    
    def partial_fit(self,X):#    
        cost,opt=self.sess.run((self.cost,self.optimizer),\
                    feed_dict={self.x:X,self.scale:self.training_scale})
        return cost
    
    def calc_total_cost(self,X):#  cost   ,               
        return self.sess.run(self.cost,feed_dict={self.x:X,\
                            self.scale:self.training_scale})
    
    def transform(self,X):#              
        return self.sess.run(self.hidden,feed_dict={self.x:X,\
                            self.scale:self.training_scale})
    
    def generate(self,hidden=None):#            
        if hidden is None:
            hidden=np.random.normal(size=self.weights['b1'])
        return self.sess.run(self.reconstruction,\
                            feed_dict={self.hidden:hidden})
        
    def reconstruct(self,X):#          ,  transform generate
        return self.sess.run(self.reconstruction,feed_dict={self.x:X,\
                            self.scale:self.training_scale})
    
    def getWeight(self):#       w1
        return self.sess.run(self.weights['w1'])
    
    def getBiases(self):#        b1
        return self.sess.run(self.weights['b1'])

3. 훈련 집 을 표준화 처리 하 는 함수 정의: standardscale(X_train,X_test)
def standard_scale(X_train,X_test):#              
    preprocessor=prep.StandardScaler().fit(X_train)
    X_train=preprocessor.transform(X_train)
    X_test=preprocessor.transform(X_test)
    return X_train,X_test

4. 표본 추출 방식 으로 batch 무 작위 추출size 크기 의 Block: getrandom_block_from_data(data,batch_size)
def get_random_block_from_data(data,batch_size):
    #    0 len(data)-batch_size       ,
    #         block     ,      batch_size   
    #    ,       
    start_index=np.random.randint(0,len(data)-batch_size)
    return data[start_index:(start_index+batch_size)]

전체 코드
# -*- coding: utf-8 -*-
"""
Created on Mon Jul 22 10:11:34 2019

@author: Administrator
"""

import numpy as np
import sklearn.preprocessing as prep
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import ssl


def xavier_init(fan_in,fan_out,constant=1):
    #fan_in fan_out         ,     Wights
    #    0  ,   2/(fan_in+fan_out)
    low=-constant*np.sqrt(6.0/(fan_in+fan_out))
    high=constant*np.sqrt(6.0/(fan_in+fan_out))
    
    return tf.random_uniform((fan_in,fan_out),minval=low,\
                             maxval=high,dtype=tf.float32)

class AdditiveGaussianNoiseAutocoder(object):
    #        class
    def __init__(self,n_input,n_hidden,\
                 transfer_function=tf.nn.softplus,\
                 optimizer=tf.train.AdamOptimizer(),scale=0.1):
        
        self.n_input=n_input#     
        self.n_hidden=n_hidden#      
        self.transfer=transfer_function#       
        self.scale=tf.placeholder(tf.float32)#      
        self.training_scale=scale#    
        
        network_weights=self._initialize_weights()
        self.weights=network_weights
        
        self.x=tf.placeholder(tf.float32,[None,self.n_input])#  
        #     ,scale*tf.random_normal((n_input,))     
        self.hidden=self.transfer(tf.add(tf.matmul(\
                        self.x+scale*tf.random_normal((n_input,)),\
                        self.weights['w1']),self.weights['b1']))
        self.reconstruction=tf.add(tf.matmul(\
                            self.hidden,self.weights['w2']),\
                            self.weights['b2'])#    
        
        self.cost=0.5*tf.reduce_sum(tf.pow(tf.subtract(\
                        self.reconstruction,self.x),2.0))#         
        
        self.optimizer=optimizer.minimize(self.cost)#     self.cost
        
        init=tf.global_variables_initializer()
        self.sess=tf.Session()
        self.sess.run(init)#         
        
    def _initialize_weights(self):#       
        all_weights=dict()
        all_weights['w1']=tf.Variable(xavier_init(self.n_input,\
                           self.n_hidden))
        all_weights['b1']=tf.Variable(tf.zeros([self.n_hidden],\
                           dtype=tf.float32))
        all_weights['w2']=tf.Variable(tf.zeros([self.n_hidden,\
                           self.n_input],dtype=tf.float32))
        all_weights['b2']=tf.Variable(tf.zeros([self.n_input],\
                           dtype=tf.float32))
        return all_weights
    
    def partial_fit(self,X):#    
        cost,opt=self.sess.run((self.cost,self.optimizer),\
                    feed_dict={self.x:X,self.scale:self.training_scale})
        return cost
    
    def calc_total_cost(self,X):#  cost   ,               
        return self.sess.run(self.cost,feed_dict={self.x:X,\
                            self.scale:self.training_scale})
    
    def transform(self,X):#              
        return self.sess.run(self.hidden,feed_dict={self.x:X,\
                            self.scale:self.training_scale})
    
    def generate(self,hidden=None):#            
        if hidden is None:
            hidden=np.random.normal(size=self.weights['b1'])
        return self.sess.run(self.reconstruction,\
                            feed_dict={self.hidden:hidden})
        
    def reconstruct(self,X):#          ,  transform generate
        return self.sess.run(self.reconstruction,feed_dict={self.x:X,\
                            self.scale:self.training_scale})
    
    def getWeight(self):#       w1
        return self.sess.run(self.weights['w1'])
    
    def getBiases(self):#        b1
        return self.sess.run(self.weights['b1'])
    
ssl._create_default_https_context = ssl._create_unverified_context
mnist=input_data.read_data_sets('MNIST_data',one_hot=True)

def standard_scale(X_train,X_test):#              
    preprocessor=prep.StandardScaler().fit(X_train)
    X_train=preprocessor.transform(X_train)
    X_test=preprocessor.transform(X_test)
    return X_train,X_test

def get_random_block_from_data(data,batch_size):
    #    0 len(data)-batch_size       ,
    #         block     ,      batch_size   
    #    ,       
    start_index=np.random.randint(0,len(data)-batch_size)
    return data[start_index:(start_index+batch_size)]

X_train,X_test=standard_scale(mnist.train.images,mnist.test.images)

n_samples=int(mnist.train.num_examples)#      
training_epochs=20#      
batch_size=128
display_step=1# display_step    cost

autoencoder=AdditiveGaussianNoiseAutocoder(n_input=784,\
            n_hidden=200,\
            transfer_function=tf.nn.softplus,\
            optimizer=tf.train.AdamOptimizer(learning_rate=0.001),\
            scale=0.01)

for epoch in range(training_epochs):
    avg_cost=0
    total_batch=int(n_samples/batch_size)
    for i in range(total_batch):
        batch_xs=get_random_block_from_data(X_train,batch_size)
        
        cost=autoencoder.partial_fit(batch_xs)
        avg_cost+=cost/n_samples*batch_size
    
    if epoch %display_step==0:
        print('Epoch','%04d'%(epoch+1),\
              'cost=','{:.9f}'.format(avg_cost))

부분 함수 주석
tf.random_uniform(shape,minval=0,maxval=None,dtype=tf.float32,seed=None,name=None)
균일 분포 에서 무 작위 값 을 출력 합 니 다.생 성 된 값 은 이 [minval, maxval) 범위 내 에서 균일 한 분 포 를 따 릅 니 다. 하한 minval 은 범위 내 에 포함 되 어 있 으 며, 상한 maxval 은 제외 되 어 있 습 니 다. 부동 소수점 에 대해 기본 범 위 는?[0, 1). 정수 에 대해 서 는 최소한 maxval 이 명확 하 게 지정 되 어야 합 니 다. 정수 상황 에서 무 작위 정 수 는 maxval - minval 이 2 의 정확 한 멱 을 제외 하고 약간 오차 가 있 습 니 다. maxval - minval 의 값 에 대해 서 는 편차 가 적 습 니 다. shape: 1 차원 정수 장 량 또는 Python 배열, 출력 장 량 의 형태 입 니 다. minval: dtype 형식의 0 차원 장 량 또는 Python 값, 생 성 된 무 작위 값 범위 의 하한 선 입 니 다. 묵.0. maxval: dtype 형식의 0 차원 장 량 이나 Python 값 이 라 고 생각 합 니 다. 생 성 할 무 작위 값 범위 의 상한 선 입 니 다. dtype 이 부동 소수점 이 라면 기본 값 은 1 입 니 다. dtype: 출력 유형: float 16, float 32, float 64, int 32, orint 64. seed: Python 정수 입 니 다. 분포 에 무 작위 피 드 를 만 드 는 데 사 용 됩 니 다. name: 작업 이름 (선택 가능).
# -*- coding: utf-8 -*-
"""
Created on Mon Jul 22 12:35:21 2019

@author: Administrator
"""

import tensorflow as tf

A=tf.random_uniform(shape=(4,1),minval=0,maxval=None,\
                    dtype=tf.float32,seed=None,name=None)
B=tf.random_uniform(shape=(3,3),minval=0,maxval=None,\
                    dtype=tf.float32,seed=None,name=None)
C=tf.random_uniform(shape=(1,5),minval=0,maxval=23,\
                    dtype=tf.int32,seed=None,name=None)

print('A:',A.eval())
print('B:',B.eval())
print('C:',C.eval())

#  :
#A: [[0.02448559]
# [0.7221812 ]
# [0.15603411]
# [0.4908315 ]]
#B: [[0.45691633 0.8306242  0.24430227]
#  [0.90618944 0.23485541 0.00950408]
#  [0.51974654 0.51217234 0.6660249 ]]
#C: [[22 18  2 14  3]]

tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
함 수 는 지 정 된 정적 분포 수치 에서 지 정 된 개수 의 값 을 꺼 내 는 데 사 용 됩 니 다. shape: 출력 장 량 의 모양, 필수 입 니 다. mean: 정적 분포 의 평균 값, 기본 값 은 0 입 니 다. stddev: 정적 분포 의 표준 차, 기본 값 은 1.0 입 니 다. dtype: 출력 유형, 기본 값 은 tf. float 32 입 니 다. seed: 랜 덤 피 드 는 하나의 정수 입 니 다. 설정 후 매번 생 성 되 는 랜 덤 수 입 니 다.모두 같 습 니 다. name: 작업 의 이름 입 니 다.
# -*- coding: utf-8 -*-
"""
Created on Mon Jul 22 12:35:21 2019

@author: Administrator
"""

import tensorflow as tf
A=tf.random_normal(shape=(3,2), mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
print(A.eval())
#  
#array([[-0.3779934 ,  0.5889418 ],
#    [-0.08279686, -0.21108189],
#    [-0.06789723,  0.87856984]], dtype=float32)

sklearn.preprocessing.Standardscaler
데 이 터 를 기한 내 속성 (열 별로 진행) 에서 평균 값 을 빼 고 방 차 로 나 누 었 습 니 다. 결 과 는 각 속성 / 열 마다 모든 데 이 터 를 0 근처에 모 으 고 방 차 는 1 입 니 다. sklearn. preprocessing. Standardscaler. fit (X train) 을 사용 하면 X train 을 직접 훈련 하고 관련 파 라 메 터 를 보존 하 며 대상 을 직접 사용 하여 테스트 집합 데 이 터 를 변환 할 수 있 습 니 다.
preprocessor=sklearn.preprocessing.Standardscaler.fit(X_train)
X_train=preprocessor.transform(X_train)
X_test=preprocessor.transform(X_test)

numpy.random.randint(low, high=None, size=None, dtype=‘l’)
함수 의 역할 은 분 산 된 고 르 게 분 포 된 정 수 를 만 드 는 것 입 니 다. 범 위 는 낮은 (포함) 에서 높 은 (포함 하지 않 음), 즉 [low, high) 입 니 다. 매개 변수 high 의 값 을 쓰 지 않 으 면 [0, low) 의 값 을 되 돌려 줍 니 다. low: int; 생 성 된 수 치 는 최소 low 보다 커 야 합 니 다. (hign = None 시 생 성 된 수 치 는 [0, low) 구간 내 에 있어 야 합 니 다. high: int (선택 가능); 이 값 을 사용 하면 생 성 된 수 치 는 [low, high) 구간 에 있 습 니 다. size: int or tuple of ints (선택 가능), 출력 난수 의 크기, 예 를 들 어 size = (m * n * k) 는 같은 규모 의 m * n * k 개의 난수 를 출력 합 니 다. 기본 값 은 None 이 며, 요 구 를 만족 시 키 는 단일 난수 만 되 돌려 줍 니 다. dtype: dtype (선택 가능): 출력 하고 싶 은 형식 입 니 다. 예 를 들 어 int 64, int 등 입 니 다. 출력: int or ndarray of ints 는 난수 나 난수 그룹 을 되 돌려 줍 니 다.
import numpy as np

a=np.random.randint(14,size=3)
b=np.random.randint(3,20)
print(a,'
',b) # #[ 0 8 10] #7

좋은 웹페이지 즐겨찾기