Python Deep Learning 18 - 생성적 딥러닝의 DeepDream
DeepDream 소개
DeepDream은 예술적 이미지 수정 기술로, 주로 훈련된 컨벌루션 신경망 CNN을 기반으로 이미지를 생성합니다.
이미지를 생성할 때 신경망은 동결됩니다. 즉, 네트워크의 가중치는 더 이상 업데이트되지 않으며 입력 이미지만 업데이트하면 됩니다. 일반적으로 사용되는 사전 훈련된 컨벌루션 네트워크에는 Google의 Inception, VGG 네트워크 및 ResNet 네트워크 등이 포함됩니다.
DeePDream의 기본 단계:
- 입력 이미지 가져오기
- 이미지를 네트워크에 입력하고 시각화하려는 뉴런의 출력 값 가져오기
- 이미지의 각 픽셀에 대한 뉴런 출력 값의 기울기 계산
- 그라디언트 디센트를 사용하여 Picture를 지속적으로 업데이트
설정된 조건이 충족될 때까지 2, 3, 4단계를 반복합니다.
다음은 Keras를 사용하여 DeepDream을 구현하는 일반적인 프로세스입니다.
Keras를 사용하여 DeepDream 구현
테스트 사진을 받아보세요
[1]에서:
# --------------- from tensorflow import keras import matplotlib.pyplot as plt %matplotlib inline base_image_path = keras.utils.get_file( "coast.jpg", origin="https://img-datasets.s3.amazonaws.com/coast.jpg") plt.axis("off") plt.imshow(keras.utils.load_img(base_image_path)) plt.show()
위는 Keras와 함께 제공되는 해안선 사진입니다. 이 그림의 변경 사항은 다음과 같습니다.
사전 훈련된 모델 InceptionV3 준비
In [2]:
# 使用Inception V3实现 from keras.applications import inception_v3 # 使用预训练的ImageNet权重来加载模型 model = inception_v3.InceptionV3(weights="imagenet", # 构建不包含全连接层的Inceptino include_top=False) Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/inception_v3/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5 87916544/87910968 [==============================] - 74s 1us/step 87924736/87910968 [==============================] - 74s 1us/step
In [3]:
model.summary()
DeepDream 구성 설정
In [4]:
# 层的名称 + 系数:该层对需要最大化的损失的贡献大小 layer_settings = {"mixed4":1.0, "mixed5":1.5, "mixed6":2.0, "mixed7":2.5} outputs_dict = dict( [ (layer.name, layer.output) # 层的名字 + 该层的输出 for layer in [model.get_layer(name) for name in layer_settings.keys()] ] ) outputs_dict
Out[4]:
{'mixed4': <KerasTensor: shape=(None, None, None, 768) dtype=float32 (created by layer 'mixed4')>, 'mixed5': <KerasTensor: shape=(None, None, None, 768) dtype=float32 (created by layer 'mixed5')>, 'mixed6': <KerasTensor: shape=(None, None, None, 768) dtype=float32 (created by layer 'mixed6')>, 'mixed7': <KerasTensor: shape=(None, None, None, 768) dtype=float32 (created by layer 'mixed7')>}
In [5]:
# 特征提取 feature_extractor = keras.Model(inputs=model.inputs, outputs=outputs_dict) feature_extractor
Out[5]:
<keras.engine.functional.Functional at 0x15b5ff0d0>
계산 손실
In [6]:
def compute_loss(image): features = feature_extractor(image)# 特征提取 loss = tf.zeros(shape=())# 损失初始化 for name in features.keys():# 遍历层 coeff = layer_settings[name] # 某个层的系数 activation = features[name]# 某个层的激活函数 #为了避免出现边界伪影,损失中仅包含非边界的像素 loss += coeff * tf.reduce_mean(tf.square(activation[:, 2:-2, 2:-2, :])) # 将该层的L2范数添加到loss中; return loss
Gradient ascent process
In [7]:
import tensorflow as tf @tf.function def gradient_ascent_step(image, lr): # lr--->learning_rate学习率 with tf.GradientTape() as tape: tape.watch(image) loss = compute_loss(image)# 调用计算损失方法 grads = tape.gradient(loss, image)# 梯度更新 grads = tf.math.l2_normalize(grads) image += lr * grads return loss, image def gradient_ascent_loop(image, iterations, lr, max_loss=None): for i in range(iterations): loss, image = gradient_ascent_step(image, lr) if max_loss is not None and loss > max_loss: break print(f"第{i}步的损失值是{loss:.2f}") return image
이미지 생성
np. Expand_dims 사용법(개인 추가)
In [8]:
import numpy as np array = np.array([[1,2,3], [4,5,6]] ) array
Out[8]:
array([[1, 2, 3], [4, 5, 6]])
In [9]:
array.shape
Out[9]:
(2, 3)
In [10]:
array1 = np.expand_dims(array,axis=0) array1
Out[ 10] :
array([[[1, 2, 3], [4, 5, 6]]])
In [11]:
array1.shape
Out[11]:
(1, 2, 3)
In [12]:
array2 = np.expand_dims(array,axis=1) array2
Out[12]:
array([[[1, 2, 3]], [[4, 5, 6]]])
In [13]:
array2.shape
Out[13] :
(2, 1, 3)
In [14]:
array3 = np.expand_dims(array,axis=-1) array3
Out[14]:
array([[[1], [2], [3]], [[4], [5], [6]]])
In [15]:
array3.shape
Out[15]:
(2, 3, 1)
np.clip 기능(개인 추가)
np.clip( array, min(array), max(array), out=None):
In [16 ]:
array = np.array([1,2,3,4,5,6]) np.clip(array, 2, 5)# 输出长度和原数组相同
Out[16]:
array([2, 2, 3, 4, 5, 5])
In [17]:
array = np.arange(18).reshape((6,3)) array
Out[17]:
array([[ 0,1,2], [ 3,4,5], [ 6,7,8], [ 9, 10, 11], [12, 13, 14], [15, 16, 17]])
In [18]:
np.clip(array, 5, 15)
Out[18]:
array([[ 5,5,5], [ 5,5,5], [ 6,7,8], [ 9, 10, 11], [12, 13, 14], [15, 15, 15]])
매개변수 설정
In [19 ]:
step = 20.#梯度上升的步长 num_octave = 3# 运行梯度上升的尺度个数 octave_scale = 1.4# 两个尺度间的比例大小 iterations = 30# 在每个尺度上运行梯度上升的步数 max_loss = 15.# 损失值若大于15,则中断梯度上升过程
이미지 사전 처리
In [20]:
import numpy as np def preprocess_image(image_path):# 预处理 img = keras.utils.load_img(image_path)# 导入图片 img = keras.utils.img_to_array(img)# 转成数组 img = np.expand_dims(img, axis=0)# 增加数组维度;见上面解释(x,y) ---->(1,x,y) img = keras.applications.inception_v3.preprocess_input(img) return img def deprocess_image(img):# 图片压缩处理 img = img.reshape((img.shape[1], img.shape[2], 3)) img /= 2.0 img += 0.5 img *= 255. # np.clip:截断功能,保证数组中的取值在0-255之间 img = np.clip(img, 0, 255).astype("uint8") return img
generated image
In [21]:
# step = 20.#梯度上升的步长 # num_octave = 3# 运行梯度上升的尺度个数 # octave_scale = 1.4# 两个尺度间的比例大小 # iterations = 30# 在每个尺度上运行梯度上升的步数 # max_loss = 15.0# 损失值若大于15,则中断梯度上升过程 original_img = preprocess_image(base_image_path)# 预处理函数 original_shape = original_img.shape[1:3] print(original_img.shape)# 四维图像 print(original_shape)# 第2和3维度的值 (1, 900, 1200, 3) (900, 1200)
In [22]:
successive_shapes = [original_shape] for i in range(1, num_octave): shape = tuple([int(dim / (octave_scale ** i)) for dim in original_shape]) successive_shapes.append(shape) successive_shapes = successive_shapes[::-1]# 翻转 shrunk_original_img = tf.image.resize(original_img, successive_shapes[0]) img = tf.identity(original_img) for i, shape in enumerate(successive_shapes): print(f"Processing octave {i} with shape {shape}") # resize img = tf.image.resize(img, shape) img = gradient_ascent_loop(# 梯度上升函数调用 img, iteratinotallow=iterations, lr=step, max_loss=max_loss ) # resize upscaled_shrunk_original_img = tf.image.resize(shrunk_original_img, shape) same_size_original = tf.image.resize(original_img, shape) lost_detail = same_size_original - upscaled_shrunk_original_img img += lost_detail shrunk_original_img = tf.image.resize(original_img, shape) keras.utils.save_img("dream.png", deprocess_image(img.numpy()))
결과는 다음과 같습니다:
Processing octave 0 with shape (459, 612) 第0步的损失值是0.80 第1步的损失值是1.07 第2步的损失值是1.44 第3步的损失值是1.82 ...... 第26步的损失值是11.44 第27步的损失值是11.72 第28步的损失值是12.03 第29步的损失值是12.49
동시에 , 새로운 이미지가 로컬에서 생성됩니다. 사진, 효과 살펴보기:
원본 사진 다시 보기: 비교해 보면 새 사진은 약간 몽환적입니다!
위 내용은 Python Deep Learning 18 - 생성적 딥러닝의 DeepDream의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

VS 코드는 Windows 8에서 실행될 수 있지만 경험은 크지 않을 수 있습니다. 먼저 시스템이 최신 패치로 업데이트되었는지 확인한 다음 시스템 아키텍처와 일치하는 VS 코드 설치 패키지를 다운로드하여 프롬프트대로 설치하십시오. 설치 후 일부 확장은 Windows 8과 호환되지 않을 수 있으며 대체 확장을 찾거나 가상 시스템에서 새로운 Windows 시스템을 사용해야합니다. 필요한 연장을 설치하여 제대로 작동하는지 확인하십시오. Windows 8에서는 VS 코드가 가능하지만 더 나은 개발 경험과 보안을 위해 새로운 Windows 시스템으로 업그레이드하는 것이 좋습니다.

VS 코드는 파이썬을 작성하는 데 사용될 수 있으며 파이썬 애플리케이션을 개발하기에 이상적인 도구가되는 많은 기능을 제공합니다. 사용자는 다음을 수행 할 수 있습니다. Python 확장 기능을 설치하여 코드 완료, 구문 강조 및 디버깅과 같은 기능을 얻습니다. 디버거를 사용하여 코드를 단계별로 추적하고 오류를 찾아 수정하십시오. 버전 제어를 위해 git을 통합합니다. 코드 서식 도구를 사용하여 코드 일관성을 유지하십시오. 라인 도구를 사용하여 잠재적 인 문제를 미리 발견하십시오.

VS 코드 확장은 악의적 인 코드 숨기기, 취약성 악용 및 합법적 인 확장으로 자위하는 등 악성 위험을 초래합니다. 악의적 인 확장을 식별하는 방법에는 게시자 확인, 주석 읽기, 코드 확인 및주의해서 설치가 포함됩니다. 보안 조치에는 보안 인식, 좋은 습관, 정기적 인 업데이트 및 바이러스 백신 소프트웨어도 포함됩니다.

vs 코드에서는 다음 단계를 통해 터미널에서 프로그램을 실행할 수 있습니다. 코드를 준비하고 통합 터미널을 열어 코드 디렉토리가 터미널 작업 디렉토리와 일치하는지 확인하십시오. 프로그래밍 언어 (예 : Python의 Python Your_file_name.py)에 따라 실행 명령을 선택하여 성공적으로 실행되는지 여부를 확인하고 오류를 해결하십시오. 디버거를 사용하여 디버깅 효율을 향상시킵니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

VS 코드는 Mac에서 사용할 수 있습니다. 강력한 확장, GIT 통합, 터미널 및 디버거가 있으며 풍부한 설정 옵션도 제공합니다. 그러나 특히 대규모 프로젝트 또는 고도로 전문적인 개발의 경우 VS 코드는 성능 또는 기능 제한을 가질 수 있습니다.
