[tensorflow] tf2.0 简单例子
tf2.0笔记
感觉,都统一了,pytorch tensorflow mxnet,大家都差不多了
gan例子笔记
import tensorflow as tf
from tensorflow.keras import Model,layers
import numpy as np
from tensorflow.keras.datasets import mnist
num_features = 784
lr_generator = 0.0002
lr_descriminator = 0.0002
training_steps = 20000
batch_size = 128
display_step = 500
noise_dim = 500
def getDataset():
(x_train,y_train),(x_test,y_test) = mnist.load_data()
x_train,x_test = np.array(x_train,np.float32),np.array(x_test,np.float32)
x_train,x_test = x_train/255.0,x_test/255.0
return x_train,y_train,x_test,y_test
x_train,y_train,x_test,y_test = getDataset()
# n轴拆分
train_data = tf.data.Dataset.from_tensor_slices((x_train,y_train))
# 这里学习一下
# tf.data.Dataset.repeat(count) 为空或-1无限延长
# shuffle这里填的buffer_size是一个epoch的样本数
# batch化
# 预读取一个数据
train_data = train_data.repeat().shuffle(10000).batch(batch_size).prefetch(1)
# Generator 过程
'''
b*500 -(fc之后)-> n*(7*7*128) -(reshape)-> n*7*7*128 -(upsample)-> n*14*14*64 -(upsample)->n*28*28*1
'''
class Generator(Model):
def __init__(self):
super(Generator,self).__init__()
self.fc1 = layers.Dense(7*7*128)
self.bn1 = layers.BatchNormalization()
# upsample卷积,反卷积
# https://github.com/vdumoulin/conv_arithmetic/raw/master/gif/padding_strides_transposed.gif
# 洞洞卷积,相当于same的stride=1,w=14,所以输出14*14
self.conv2tr1 = layers.Conv2DTranspose(64,5,strides=2,padding="SAME")#filters,kernel size
# 在batch维度和channel维度标准化
self.bn2 = layers.BatchNormalization()
self.conv2tr2 = layers.Conv2DTranspose(1,5,strides=2,padding="SAME")
def __call__(self,x,is_training = False):
x = self.fc1(x)
x = self.bn1(x,training = is_training)
# leaky_relu x<0时为x/a而不是0,防止梯度消失
x = tf.nn.leaky_relu(x)
x = tf.reshape(x,shape = [-1,7,7,128])
x = self.conv2tr1(x)
x = self.bn2(x,training = is_training)
x = tf.nn.leaky_relu(x)
x = self.conv2tr2(x)
x = tf.nn.tanh(x)
return x
# Discriminator 过程
'''
n*768 -> n*28*28*1 -> n*14*14*64 -> n*7*7*128 -> n*(7*7*128) -> n*1024 -> n*2
'''
class Discriminator(Model):
def __init__(self):
super(Discriminator,self).__init__()
self.conv1 = layers.Conv2D(64,5,strides = 2,padding = "SAME")
self.bn1 = layers.BatchNormalization()
self.conv2 = layers.Conv2D(128,5,strides = 2,padding = "SAME")
self.bn2 = layers.BatchNormalization()
self.flatten = layers.Flatten()
self.fc1 = layers.Dense(1024)
self.bn3 = layers.BatchNormalization()
self.fc2 = layers.Dense(2)
def __call__(self,is_training = False):
x = tf.reshape(x,[-1,28,28,1])
x = self.conv1(x)
x = self.bn1(x,training = is_training)
x = tf.nn.leaky_relu(x)
x = self.conv2(x)
x = self.bn2(x,training = is_training)
x = tf.nn.leaky_relu(x)
x = self.flatten(x)
x = self.fc1(x)
x = self.bn3(x,training = is_training)
x = tf.nn.leaky_relu()
x = self.fc2(x)
return x
generator = Generator()
discriminator = Discriminator()
def generator_loss(reconstructed_image):
gen_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits = reconstructed_image,labels = tf.ones([batch_size],dtype = tf.int32)))
return gen_loss
def discriminator_loss(disc_fake,disc_real):
# loss、
disc_loss_real = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=disc_real,labels = tf.ones([batch_size],dtype=tf.int32)))
disc_loss_fake = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits = disc_fake,labels = tf.zeros([batch_size],dtype = tf.int32)))
return disc_loss_real + disc_loss_fake
optimizer_gen = tf.optimizers.Adam(learning_rate = lr_generator)
optimizer_disc = tf.optimizers.Adam(learning_rate = lr_descriminator)
def run_optimization(real_images):
real_images = real_images * 2. -1 #(-1,1)范围内
noise = np.random.normal(-1.,1.,size=[batch_size,noise_dim])
# 通过随机生成噪声数据,用正太分布的噪声去生成图片,生成器的作用就是生成fake images
with tf.GradientTape() as g:
fake_images = generator(noise,is_training = True)
disc_fake = discriminator(fake_images,is_training = True)
disc_real = discriminator(real_images,is_training = True)
disc_loss = discriminator_loss(disc_fake,disc_real)
gradients_disc = g.gradient(disc_loss,discriminator.trainable_vatiables)
optimizer_disc.apply_gradients(zip(gradients_disc,discriminator.trainable_variables))
# 由于上面判别器的梯度已经进行更新了,这里又用到判别器来判别fake_images,上面会影响这里判别器的判断,所以不能直接用前面生成好的噪声数据
# 我认为判别器梯度更新在前应该有利于收敛吧,不然最开始先更新生成器梯度的话,最开始训练的时候效果应该不太好
noise = np.random.normal(-1.,1.,size = [batch_size,noise_dim]).astype(np.float32)
with tf.GradientTape() as g:
fake_images = generator(noise,is_training = True)
disc_fake = discriminator(fake_images)
gen_loss = generator_loss(disc_fake)
gradients_gen = g.gradient(gen_loss,generator.trainable_variables)
optimizer_gen.apply_gradients(zip(gradients_gen, generator.trainable_variables))
return gen_loss,disc_loss
for step, (batch_x, _) in enumerate(train_data.take(training_steps + 1)):
if step == 0:
noise = np.random.normal(-1., 1., size=[batch_size, noise_dim]).astype(np.float32)
gen_loss = generator_loss(discriminator(generator(noise)))
disc_loss = discriminator_loss(discriminator(batch_x), discriminator(generator(noise)))
print("initial: gen_loss: %f, disc_loss: %f" % (gen_loss, disc_loss))
continue
gen_loss, disc_loss = run_optimization(batch_x)
if step % display_step == 0:
print("step: %i, gen_loss: %f, disc_loss: %f" % (step, gen_loss, disc_loss))
# 保存权重
generator.save_weights(file_path = "./gen.ckpt")
discriminator.save_weights(file_path = "./disc.ckpt")
[tensorflow] tf2.0 简单例子的更多相关文章
- 三分钟快速上手TensorFlow 2.0 (后续)——扩展和附录
TensorFlow Hub 模型复用 TF Hub 网站 打开主页 https://tfhub.dev/ ,在左侧有 Text.Image.Video 和 Publishers 等选项,可以选取关注 ...
- 三分钟快速上手TensorFlow 2.0 (下)——模型的部署 、大规模训练、加速
前文:三分钟快速上手TensorFlow 2.0 (中)——常用模块和模型的部署 TensorFlow 模型导出 使用 SavedModel 完整导出模型 不仅包含参数的权值,还包含计算的流程(即计算 ...
- 『TensorFlow2.0正式版教程』极简安装TF2.0正式版(CPU&GPU)教程
0 前言 TensorFlow 2.0,今天凌晨,正式放出了2.0版本. 不少网友表示,TensorFlow 2.0比PyTorch更好用,已经准备全面转向这个新升级的深度学习框架了. 本篇文章就 ...
- 『TensorFlow2.0正式版』TF2.0+Keras速成教程·零:开篇简介与环境准备
此篇教程参考自TensorFlow 2.0 + Keras Crash Course,在原文的基础上进行了适当的总结与改编,以适应于国内开发者的理解与使用,水平有限,如果写的不对的地方欢迎大家评论指出 ...
- [转帖]谷歌TF2.0凌晨发布!“改变一切,力压PyTorch”
谷歌TF2.0凌晨发布!“改变一切,力压PyTorch” https://news.cnblogs.com/n/641707/ 投递人 itwriter 发布于 2019-10-01 12:38 评论 ...
- 极简安装 TensorFlow 2.0 GPU
前言 之前写了几篇关于 TensorFlow 1.x GPU 版本安装的博客,但几乎没怎么学习过.之前基本在搞 Machine Learning 和 Data Mining 方面的东西,极少用到 NN ...
- 三分钟快速上手TensorFlow 2.0 (上)——前置基础、模型建立与可视化
本文学习笔记参照来源:https://tf.wiki/zh/basic/basic.html 学习笔记类似提纲,具体细节参照上文链接 一些前置的基础 随机数 tf.random uniform(sha ...
- 使用TensorFlow v2.0构建卷积神经网络
使用TensorFlow v2.0构建卷积神经网络. 这个例子使用低级方法来更好地理解构建卷积神经网络和训练过程背后的所有机制. CNN 概述 MNIST 数据集概述 此示例使用手写数字的MNIST数 ...
- Tensorflow 2.0 深度学习实战 —— 详细介绍损失函数、优化器、激活函数、多层感知机的实现原理
前言 AI 人工智能包含了机器学习与深度学习,在前几篇文章曾经介绍过机器学习的基础知识,包括了监督学习和无监督学习,有兴趣的朋友可以阅读< Python 机器学习实战 >.而深度学习开始只 ...
随机推荐
- 写守护进程时碰到open函数的参数,没记住
今天写一个最简单的守护进程, 要成为一个守护进程,其实很简单了.主要步骤就4步: 1,创建进程. 2,父进程退出. 3,成为会话的头领进程. 4,将工作目录改成根目录,并把标准输入输出重定向到空设备. ...
- [小工具] C#多线程|匿名委托传参数|测试网站压力--升级版
上次文章链接:http://www.sufeinet.com/thread-11-1-1.html写这些并不是不会用测试工具,也并不是无视测试工具,而是做为一个程序员希望用自己写的东西来完成一些功能, ...
- The King’s Ups and Downs
有n个高矮不同的士兵,现在要将他们按高,矮依次排列,问有多少种情况. 化简为 n个人,求出可以形成波浪形状的方法数 #include <iostream> #include <cma ...
- 2017-8-31 NOIP模拟赛
可接受序列 [题目描述] 让计算机这样读入一列非负整数: 1.读入数T. 2.接着往下读入T个数. 3.如果数列读完了,则停止,否则,转到1. 但是,往往会出现这样的问题:执行第2步时,数列已经没有T ...
- 洛谷P2950 [USACO09OPEN]牛绣Bovine Embroidery
P2950 [USACO09OPEN]牛绣Bovine Embroidery 题目描述 Bessie has taken up the detailed art of bovine embroider ...
- uoj#348/洛谷P4221 [WC2018]州区划分(FWT)
传送门(uoj) 传送门(洛谷) 全世界都会子集卷积就咱不会--全世界都在写\(FMT\)就咱只会\(FWT\)-- 前置芝士 或运算\(FWT\)或者\(FMT\) 左转洛谷模板区,包教包会 子集卷 ...
- [Xcode 实际操作]七、文件与数据-(11)数据持久化存储框架CoreData的使用:创建CoreData实体并插入数据
目录:[Swift]Xcode实际操作 本文将演示[CoreData]数据持久化存储框架的使用. 点击[Create a new Xcode project]创建一个新的项目 ->[Single ...
- java利用URL发送get和post请求
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- Vue2中实现微信分享支付功能
Vue2中实现微信分享支付功能 近期做了一个微信公众号前后分离项目,前端采用Vue2开发,后端SpringBoot,今天迫不及待的来给大家分享一下这次在开发中遇到的一些坑以及解决办法. 在这里,一些 ...
- docker网络设置(待整理)
手动指定容器的配置 -h HOSTNAME or --hostname=HOSTNAME \\设定容器的主机名. --dns=IP_ADDRESS \\指定DNS地址. ...