improved-gan-master:中的代码:

**Status:** Archive (code is provided as-is, no updates expected)

# improved-gan
code for the paper "Improved Techniques for Training GANs"

MNIST, SVHN, CIFAR10 experiments in the mnist_svhn_cifar10 folder

imagenet experiments in the imagenet folder

# MNIST/SVHN/CIFAR-10 experiments

This part of the code is built using Theano and Lasagne. Any recent version of these packages should work for running the code.

The experiments are run using the train*.py files. All experiments perform semi-supervised learning with a set of labeled examples and a set of unlabeled examples. There are two kinds of models: the "feature matching" models that achieve the best predictive performance, and the "minibatch discrimination" models that achieve the best image quality.

The provided train*.py files each train a single model for a single random labeled/unlabeled data split and a single random parameter initialization. To reproduce our results using ensembling / averaging over random seeds, you can run these files multiple times using different inputs for the "seed" and "seed_data" arguments, and then combine the results.

This code is still being developed and subject to change.
实验室电脑遇到问题:

Traceback (most recent call last):
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py", line 4, in <module>
    import theano as th
ModuleNotFoundError: No module named 'theano'

Process finished with exit code 1

尽量用conda安装theano,尤其是在windows:conda install theano pygpu 安装 

安装后:

Traceback (most recent call last):
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py", line 4, in <module>
    import theano as th
  File "/home/gis/anaconda3/lib/python3.6/site-packages/theano/__init__.py", line 88, in <module>
    from theano.configdefaults import config
  File "/home/gis/anaconda3/lib/python3.6/site-packages/theano/configdefaults.py", line 137, in <module>
    in_c_key=False)
  File "/home/gis/anaconda3/lib/python3.6/site-packages/theano/configparser.py", line 287, in AddConfigVar
    configparam.__get__(root, type(root), delete_key=True)
  File "/home/gis/anaconda3/lib/python3.6/site-packages/theano/configparser.py", line 335, in __get__
    self.__set__(cls, val_str)
  File "/home/gis/anaconda3/lib/python3.6/site-packages/theano/configparser.py", line 346, in __set__
    self.val = self.filter(val)
  File "/home/gis/anaconda3/lib/python3.6/site-packages/theano/configdefaults.py", line 116, in filter
    'You are tring to use the old GPU back-end. '
ValueError: You are tring to use the old GPU back-end. It was removed from Theano. Use device=cuda* now. See https://github.com/Theano/Theano/wiki/Converting-to-the-new-gpu-back-end%28gpuarray%29 for more information.

Process finished with exit code 1

gedit ~/.theanorc   #   如果不存在该文件则会建立,不需要使用sudo命令!
1
然后在 .theanorc 中添加配置如下:

[global]
floatX=float32
device=cuda1
root=/usr/local/cuda-9.0  # 这个是自己cuda的安装路径

[gpuarray]
preallocate = 1
--------------------- 

原来的是这个内容:去掉

[global] 
device=gpu
floatX=float32
[nvcc]
fastmath=True
[cuda]
root=/usr/local/cuda/bin/

其实我说的坑就是这里,因为网上好多设置GPU的时候将这里device=gpu ,这样的话就会导致错误比如类似这种,说是old GPU back-end。另外还有一些设置nvcc变量的。

...
ValueError: You are tring to use the old GPU back-end. It was removed from Theano. Use device=cuda* now. See for more information.
(py27) iMacvanQuinten:AI_Writer quintendewilde$ python -c "from theano.sandbox.cuda.dnn import dnn_available as d; print(d() or d.msg)"
Traceback (most recent call last)
...

其实哩,不能说是上面的device=gpu 错误,只能说Theano版本更新了,以前的不支持了。其实我们可以看一下Theano的发行版本就知道了,2017/08/09已经移除了device=gpu了。

2017/11/15: Release of Theano 1.0.0. Everybody is encouraged to update.
2017/10/30: Release of Theano 1.0.0rc1, new features and many bugfixes, final release to coming.
2017/10/16: Release of Theano 0.10.0beta4, new features and many bugfixes, release candidate to coming.
2017/09/28: IMPORTANT: MILA will stop developing Theano and the next release (renamed to 1.0) will be the last main release.
2017/09/20: Release of Theano 0.10.0beta3, new features and many bugfixes, release candidate to coming.
2017/09/07: Release of Theano 0.10.0beta2, new features and many bugfixes, release candidate to coming.
2017/08/09: Release of Theano 0.10.0beta1, many improvements and bugfixes, release candidate to coming.
Removed support for the old (device=gpu) backend. Use the new backend (device=cuda) for gpu computing. See Converting to the new gpu back end(gpuarray) for help with conversion.
2017/03/20: Release of Theano 0.9.0. Everybody is encouraged to update.
2017/03/13: Release of Theano 0.9.0rc4, with crash fixes and bug fixes.
2017/03/06: Release of Theano 0.9.0rc3, with crash fixes, bug fixes and improvements.
2017/02/27: Release of Theano 0.9.0rc2, with crash fixes, bug fixes and improvements.
2017/02/20: Release of Theano 0.9.0rc1, many improvements and bugfixes, final release to coming.
2017/01/24: Release of Theano 0.9.0beta1, many improvements and bugfixes, release candidate to coming.
2016/05/09: New technical report on Theano: Theano: A Python framework for fast computation of mathematical expressions. This is the new preferred reference.
2016/04/21: Release of Theano 0.8.2, adding support for CuDNN v5
...

那么我们的解决方式可以参考官网的API介绍,里面一段话说的很清楚了

你可以使用以下设备:
String value: either 'cpu', 'cuda', 'cuda0', 'cuda1', 'opencl0:0', 'opencl0:1', ...

Default device for computations. If 'cuda*, change the default to try to move computation to the GPU using CUDA libraries. If 'opencl*', the OpenCL libraries will be used. To let the driver select the device, use 'cuda' or 'opencl'. If we are not able to use the GPU, either we fall back on the CPU, or an error is raised, depending on the force_device flag.

另外有一些Theano config keys 也是被废除了, Converting to the new gpu back end(gpuarray)

The following Theano config keys sections don't have any effect on the new backend and should be removed:
1. nvcc.*
2. cuda.root
3. lib.cnmem (replace by gpuarray.preallocate) 
Important: The default changed to be faster, but cause more memory fragmentation. To keep the speed and remove the fragmentation, use the flag gpuarray.preallocate=1 (or any value greater then 0, see the dot. To have the old default of Theano, use the flag: gpuarray.preallocate=-1

然而这样配置完了之后,我运行了theano的代码,并没与调用gpu. 我们还需要将CUDA的路径添加到环境变量中。参考这两篇文章Linux下非root用户安装Theano并配置GPU(以及集群上安装自己所需要的python依赖, Checking cuda for theano errors.. #839

vim ~/.bashrc 
然后添加代码:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/
export PATH=$PATH:/usr/local/cuda/bin

这样我们的环境算是搭建好了。

2. 测试
为了测试theano在cpu和gpu分别的表现,我们按照网上推荐的代码,测试Theano使用GPU并行计算,以验证环境搭建是否成功

首先我们创建一个test.py文件 
添加如下内容:

from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in range(iters):
    r = f()
t1 = time.time()
print("Looping %d times took %f seconds" % (iters, t1 - t0))
print("Result is %s" % (r,))
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print('Used the cpu')
else:
    print('Used the gpu')

然后保存文件。

2.1 使用cpu跑这个代码
首先我们更改 .theanorc 这个文件,将其中device=cpu, 
 
然后我们在终端输入命令: python test.py 测试结果如下:

需要时间2.53s

2.2 使用gpu跑这个代码
首先我们更改 .theanorc 这个文件,将其中device=cuda0, 
然后我们在终端输入命令: python test.py 测试结果如下: 
 
需要时间0.27s

3. 展望
好像theano在去年已经不进行更新了,MILA will stop developing Theano,如何看待 Yoshua Bengio 宣布停止 Theano 维护与开发?经历了十个年头,已经完成了他的使命了,好多开发人员都转去开发其他框架了,比如tensorflow了。其实我只是取跑一个实验,咋就写了这么多了~~

提示错误:

Traceback (most recent call last):
  File "/home/gis/anaconda3/lib/python3.6/site-packages/theano/gpuarray/__init__.py", line 227, in <module>
    use(config.device)
  File "/home/gis/anaconda3/lib/python3.6/site-packages/theano/gpuarray/__init__.py", line 214, in use
    init_dev(device, preallocate=preallocate)
  File "/home/gis/anaconda3/lib/python3.6/site-packages/theano/gpuarray/__init__.py", line 140, in init_dev
    context.free_gmem / MB))
RuntimeError: Trying to preallocate 10618 MB of GPU memory while only 95 MB are available.
Traceback (most recent call last):
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py", line 7, in <module>
    import lasagne
ModuleNotFoundError: No module named 'lasagne'  人脸识别库

Process finished with exit code 1

Lasagne

安装

Lasagne是写在Theano之上的库包,可以使用户更简单的使用深层学习训练 这里将要安装的是Lasagne 0.2.dev1版本,直接执行 >conda install -c http://conda.anaconda.org/toli lasagne

教程

这里有Lasagne tutorial 和 Lasagne tutorial2的简单ipython教程

需要下载的东西比较多,折腾半天。

重新执行:又有错误:

Using cuDNN version 7005 on context None
ERROR (theano.gpuarray): Could not initialize pygpu, support disabled
Traceback (most recent call last):
  File "/home/gis/anaconda3/lib/python3.5/site-packages/theano/gpuarray/__init__.py", line 227, in <module>
    use(config.device)
  File "/home/gis/anaconda3/lib/python3.5/site-packages/theano/gpuarray/__init__.py", line 214, in use
    init_dev(device, preallocate=preallocate)
  File "/home/gis/anaconda3/lib/python3.5/site-packages/theano/gpuarray/__init__.py", line 140, in init_dev
    context.free_gmem / MB))
RuntimeError: Trying to preallocate 10618 MB of GPU memory while only 95 MB are available.
Traceback (most recent call last):
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py", line 7, in <module>
    import lasagne
  File "/home/gis/anaconda3/lib/python3.5/site-packages/lasagne/__init__.py", line 19, in <module>
    from . import layers
  File "/home/gis/anaconda3/lib/python3.5/site-packages/lasagne/layers/__init__.py", line 7, in <module>
    from .pool import *
  File "/home/gis/anaconda3/lib/python3.5/site-packages/lasagne/layers/pool.py", line 6, in <module>
    from theano.tensor.signal import downsample
ImportError: cannot import name 'downsample'

Process finished with exit code 1

在学习http://blog.csdn.net/u012162613/article/details/43277187时,运行代码,发现无法加载downsample模型

from theano.tensor.signal import downsample
1
ImportError: cannot import name ‘downsample’ 
查找资料发现downsample已经改为pool 
将上面代码改为from theano.tensor.signal import pool 
代码中运用到downsample的地方也要改掉

# 子采样
 pooled_out = downsample.max_pool_2d(
       input=conv_out,
       ds=poolsize,
       ignore_border=True
 )
1
2
3
4
5
6
这里直接将downsample改为pool会出错,因为里面相应的函数有变化 
查看pool.py的源码,发现downsample.max_pool_2d()与pool. pool_2d()函数功能相同,用ws代替ds

# 子采样
pooled_out = pool.pool_2d(
     input=conv_out,
     ws=poolsize,
     ignore_border=True
)
1
2
3
4
5
6
运行后,发现问题已经解决。
--------------------- 
作者:陌筱北 
来源:CSDN 
原文:https://blog.csdn.net/moxiaobeiMM/article/details/75015408 
版权声明:本文为博主原创文章,转载请附上博文链接!

后来

#from lasagne.layers import dnn
#import nn

两行一直有问题,注释了。

再运行提示:

出现这个错误,ImportError: No module named 'cPickle' 因为 python3不支持,改成了pickle即可。

然后又出错:

/home/gis/anaconda3/bin/python /home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py
Using cuDNN version 7005 on context None
ERROR (theano.gpuarray): Could not initialize pygpu, support disabled
Traceback (most recent call last):
  File "/home/gis/anaconda3/lib/python3.5/site-packages/theano/gpuarray/__init__.py", line 227, in <module>
    use(config.device)
  File "/home/gis/anaconda3/lib/python3.5/site-packages/theano/gpuarray/__init__.py", line 214, in use
    init_dev(device, preallocate=preallocate)
  File "/home/gis/anaconda3/lib/python3.5/site-packages/theano/gpuarray/__init__.py", line 140, in init_dev
    context.free_gmem / MB))
RuntimeError: Trying to preallocate 10618 MB of GPU memory while only 97 MB are available.
Namespace(batch_size=100, count=400, data_dir='./data/cifar-10-python', learning_rate=0.0003, seed=1, seed_data=1, unlabeled_weight=1.0)
Traceback (most recent call last):
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py", line 35, in <module>
    trainx, trainy = cifar10_data.load(args.data_dir, subset='train')
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/cifar10_data.py", line 34, in load
    train_data = [unpickle(os.path.join(data_dir,'cifar-10-batches-py/data_batch_' + str(i))) for i in range(1,6)]
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/cifar10_data.py", line 34, in <listcomp>
    train_data = [unpickle(os.path.join(data_dir,'cifar-10-batches-py/data_batch_' + str(i))) for i in range(1,6)]
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/cifar10_data.py", line 27, in unpickle
    d = pickle.load(fo)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6: ordinal not in range(128)

Process finished with exit code 1

也就是说pickle.load()默认解码是以encoding=”ASCII”解码的,而我们要载入的文件并不是以”ASCII”形式存储的,所以要改变参数encoding=” ” 
解决方式如下:

pickle.load(f,encoding='bytes')
1
这样编码可以用“字节”来读取这些8位字符串实例作为字节对象。

/home/gis/anaconda3/bin/python /home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py
Using cuDNN version 7005 on context None
ERROR (theano.gpuarray): Could not initialize pygpu, support disabled
Traceback (most recent call last):
  File "/home/gis/anaconda3/lib/python3.5/site-packages/theano/gpuarray/__init__.py", line 227, in <module>
    use(config.device)
  File "/home/gis/anaconda3/lib/python3.5/site-packages/theano/gpuarray/__init__.py", line 214, in use
    init_dev(device, preallocate=preallocate)
  File "/home/gis/anaconda3/lib/python3.5/site-packages/theano/gpuarray/__init__.py", line 140, in init_dev
    context.free_gmem / MB))
RuntimeError: Trying to preallocate 10618 MB of GPU memory while only 97 MB are available.
Namespace(batch_size=100, count=400, data_dir='./data/cifar-10-python', learning_rate=0.0003, seed=1, seed_data=1, unlabeled_weight=1.0)
Traceback (most recent call last):
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py", line 35, in <module>
    trainx, trainy = cifar10_data.load(args.data_dir, subset='train')
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/cifar10_data.py", line 34, in load
    train_data = [unpickle(os.path.join(data_dir,'cifar-10-batches-py/data_batch_' + str(i))) for i in range(1,6)]
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/cifar10_data.py", line 34, in <listcomp>
    train_data = [unpickle(os.path.join(data_dir,'cifar-10-batches-py/data_batch_' + str(i))) for i in range(1,6)]
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/cifar10_data.py", line 29, in unpickle
    return {'x': np.cast[np.float32]((-127.5 + d['data'].reshape((10000,3,32,32)))/128.), 'y': np.array(d['labels']).astype(np.uint8)}
KeyError: 'data'

Process finished with exit code 1

因为这个问题就是说字典datadict里面没有data这个字段罢了,所以百度了也没有办法。后来进行了debug,观察了datadict的数据发现,在key值data和labels 的前面都有一个b,后来了我就加了一个b在data和labels 前面。如下

    Y = datadict[b'labels']
    X = datadict[b'data']

然后正常了…… 
百度之后才发现这个是python2和python3的问题,我使用了官方给的一个代码库,不过这个是用python2写的,而官方的训练数据也是使用python2生成的。结果我使用的python3去运行,就出现了这个错误。 
这里是百度之后的结果:

b:bytes 
python3.x里默认的str是unicode, bytes是py2.x的str, b''前缀代表的就是bytes 
python2.x里, b前缀没什么具体意义,只是为了兼容python3.x的这种写法
1
2
3
参考博客

所以我这里加上b''前缀就可以让python2的代码兼容python3了。

最后再说一句:坑的一匹的python2和3,简直坑小白神器
---------------------

/home/gis/anaconda3/bin/python /home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py
Using cuDNN version 7005 on context None
Preallocating 10618/11177 Mb (0.950000) on cuda
Mapped name None to device cuda: GeForce GTX 1080 Ti (0000:01:00.0)
Traceback (most recent call last):
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py", line 10, in <module>
    from lasagne.layers import dnn
  File "/home/gis/anaconda3/lib/python3.5/site-packages/lasagne/layers/dnn.py", line 2, in <module>
    from theano.sandbox.cuda import dnn
  File "/home/gis/anaconda3/lib/python3.5/site-packages/theano/sandbox/cuda/__init__.py", line 6, in <module>
    "You are importing theano.sandbox.cuda. This is the old GPU back-end and "
unittest.case.SkipTest: You are importing theano.sandbox.cuda. This is the old GPU back-end and is removed from Theano. Use Theano 0.9 to use it. Even better, transition to the new GPU back-end! See https://github.com/Theano/Theano/wiki/Converting-to-the-new-gpu-back-end%28gpuarray%29

Process finished with exit code 1

一、搭建环境

 安装:pip install theano==0.9.0

    卸载:pip uninstall theano
    查看版本号:import theano
                theano.__version__

    设置gpu\cpu:
        方法1:vim /root/.theanorc
                [global]
                model=FAST_RUN    (该模式运行速度快)
                device=cuda1 (或者gpu或cpu)
                floatX=float32
                [blas]
                ldflags=-L/usr/lib/libblas.so

方法2:
            THEANO_FLAGS=mode=FAST_RUN,device=cuda,floatX=float32 python test_new.py
        备注:theano0.9以上版本,使用gpu新后端,device=gpu或cpu或cuda(新后端)
            #test_theano_gpu.py测试gpu/cpu,https://www.cnblogs.com/shouhuxianjian/p/4590224.html
            THEANO_FLAGS=mode=FAST_RUN,device=cuda,floatX=float32 python test_theano_gpu.py        
                <GpuArrayType<None>(float32, (False,))>    使用cpu
            THEANO_FLAGS=mode=FAST_RUN,device=cpu,floatX=float32 python test_theano_gpu.py
                <TensorType(float32, vector)>    使用cpu
            THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python test_theano_gpu.py
                <CudaNdarrayType(float32, vector)>    使用gpu
                
    tensorflow和theano同时要使用GPU,如何设置?
        如果.theanorc中device设置为gpu,那么tensorflow将无法使用GPU;
        如果.theanorc中device设置为cuda,那么theano在第二次调用中将无法使用GPU;
        因此,如果tensorflow和theano同时要使用GPU,.theanorc中device必须设置为cuda,而且指明哪一个cuda。如上面的device=cuda1。
        与此同时,tensorflow不需要特别指定GPU。

pygpu安装:
        git clone https://github.com/Theano/libgpuarray.git
        cd libgpuarray
        mkdir Build
        cd Build
        cmake .. -DCMAKE_BUILD_TYPE=Release
        make 
        make install
        cd ..
        python setup.py build 
        python setup.py install    
        sudo ldconfig
        备注:有测试过pygpu==0.6.5与theano==0.9.0 或者pygpu==0.7.5与theano==1.0.0 OK.
            pygpu版本如果为0.65,那么theano必须为0.9。如果为1.0,不兼容。无法成功import theano。
            pygpu版本如果为0.75,那么theano必须为1.0。如果为0.9,不兼容。无法正常初始化pygpu。
    
    例子:DeepAlgnmentNetwork: theano==0.9.0
        error:immporting theano: AttributeError: 'module' object has no attribute 'find_graphviz'
        解决方案:sudo pip uninstall -y pydot 或者 pip install pydot-ng        
        安装lasagne:https://github.com/Lasagne/Lasagne  (深度框架)
            pip install https://github.com/Lasagne/Lasagne/archive/master.zip
        pip install theano==0.9.0
        安装pygpu

二、基本用法:

theano.tensor常用数据类型:
        有double、int、uchar、float等,float是因为GPU一般是float32类型.
        数值:iscalar(int32)、fscalar(float32)、wscalar(int16)、bscalar(int8)、lscalar(int64)
                a = T.scalar() #print (a.dtype) #float32
        一维向量:ivector(int 类型的向量)、fvector(float类型的向量)、
        二维矩阵:fmatrix(float类型矩阵)、imatrix(int类型的矩阵)
        三维float类型矩阵:ftensor3  
        四维float类型矩阵:ftensor4 #tensor5、tensor6、tensor7
        例子:theano.tensor.tensor3(name=None, dtype=config.floatX) #数据类型最好一致,不然会出错

theano.tensor常用函数:
        x=theano.tensor.iscalar('x',dtype='int32')    #声明一个int类型的变量x  
        y=theano.tensor.pow(x,3)                          #定义y=x^3  
        y1= 1 / (1 + theano.tensor.exp(-x))
        f=theano.function([x],y)                       #定义函数的自变量为x(输入),因变量为y(输出) 
        print (f(2))                       #8    
        dx=theano.grad(y,x)             #偏导数函数  
   共享变量:

共享变量是多线程编程中的一个名词,故名思议就是各线程,公共拥有的变量,这个是为了多线程高效计算、
        访问而使用的变量。
        w= theano.shared(1)    #定义一个共享变量w,其初始值为1  
        print (x.get_value())     #取值
        x.set_value(2)             #设置数值

theano.tensor的层及函数:import theano.tensor as T 
        T.nnet:conv2d、softmax、
        T: T.mean、log、pow、exp、dot、argmax、tanh、grad、
        T.signal.downsample.max_pool_2d:池化操作

保存、加载模型:#import pickle
        #save model
        with open("model.pickle", "wb") as file:
            model = [w.get_value(), b.get_value()] #或写成字典的形式
            pickle.dump( model, file )
            print (model[0][:10]) #打印w的前10个数值
        #load model
        with open("model.pickle", "rb") as file:
            model = pickle.load( file )
            w.set_value( model[0] )
            b.set_value( model[1] )
            print ( w.get_value()[:10] ) #打印w的前10个数值

lasagne:https://github.com/Lasagne/Lasagne  (theano自己的深度框架)
            http://lasagne.readthedocs.io/en/latest/index.html (手册) 
        pip install -r https://raw.githubusercontent.com/Lasagne/Lasagne/master/requirements.txt (卸载)
        pip install https://github.com/Lasagne/Lasagne/archive/master.zip (安装)
        备注:batch_norm()函数存储的参数是beta、gamma、mean、inv_std共四个参数。
            # normalize
            normalized = (input - mean) * (gamma * inv_std) + beta
        
        #层:
        lasagne.layers:
            #DenseLayer、DropoutLayer、InputLayer、Conv2DLayer、MaxPool2DLayer、
            get_all_params、get_output、set_all_param_values、get_all_param_values
        lasagne.updates
        lasagne.init
        lasagne.nonlinearities
        lasagne.objectives
        lasagne.regularization
        lasagne.random
        lasagne.utils

lasagne.layers.DenseLayer(DropoutLayer、InputLayer、Conv2DLayer、MaxPool2DLayer、
                                get_all_params、get_output、set_all_param_values、get_all_param_values)
        lasagne.nonlinearities.rectify(softmax、tanh、relu)  #激活函数
        W=lasagne.init.GlorotUniform() #权值初始化
        loss = lasagne.objectives.categorical_crossentropy(prediction, target_var)
        
    手写字识别例子:
        可以参考lasagne 源码给的mnist.py例子,主要代码如下:
        import numpy as np
        import theano
        import theano.tensor as T
        import lasagne
        import sys,os
        
        def load_dataset():
            if sys.version_info[0] == 2:    # Python 2
                from urllib import urlretrieve
            else:                            # Python 3
                from urllib.request import urlretrieve

def download(filename, source='http://yann.lecun.com/exdb/mnist/'):
                print("Downloading %s" % filename)
                urlretrieve(source + filename, filename)

import gzip
            def load_mnist_images(filename): #下载图片
                if not os.path.exists(filename):
                    download(filename)
            
                with gzip.open(filename, 'rb') as f:
                    data = np.frombuffer(f.read(), np.uint8, offset=16)
                data = data.reshape(-1, 1, 28, 28)  #(None, channels, rows, columns)
            return data / np.float32(256)
            
            def load_mnist_labels(filename):    #下载标签
                if not os.path.exists(filename):
                    download(filename)
                with gzip.open(filename, 'rb') as f:
                    data = np.frombuffer(f.read(), np.uint8, offset=8)
                return data
            
            #下载数据        
            X_train = load_mnist_images('train-images-idx3-ubyte.gz') 
            y_train = load_mnist_labels('train-labels-idx1-ubyte.gz')
            X_test = load_mnist_images('t10k-images-idx3-ubyte.gz')
            y_test = load_mnist_labels('t10k-labels-idx1-ubyte.gz')
            
            #最后10000个用于预测
            X_train, X_val = X_train[:-10000], X_train[-10000:]
            y_train, y_val = y_train[:-10000], y_train[-10000:]
            return X_train, y_train, X_val, y_val, X_test, y_test
        
        #构建网络模型
        def build_cnn(input_var=None): 
            network = lasagne.layers.InputLayer(shape=(None, 1, 28, 28),input_var=input_var)
            network = lasagne.layers.Conv2DLayer(network, num_filters=32, filter_size=(5, 5),
                    nonlinearity=lasagne.nonlinearities.rectify,W=lasagne.init.GlorotUniform())
            network = lasagne.layers.MaxPool2DLayer(network, pool_size=(2, 2))
            network = lasagne.layers.Conv2DLayer(network, num_filters=32, filter_size=(5, 5),
                    nonlinearity=lasagne.nonlinearities.rectify)
            network = lasagne.layers.MaxPool2DLayer(network, pool_size=(2, 2))
            network = lasagne.layers.DenseLayer(lasagne.layers.dropout(network, p=.5),
                        num_units=256,nonlinearity=lasagne.nonlinearities.rectify)
            network = lasagne.layers.DenseLayer(lasagne.layers.dropout(network, p=.5),
                        num_units=10,nonlinearity=lasagne.nonlinearities.softmax)
            return network
        
        def main(num_epochs=500):
            #加载数据
            X_train, y_train, X_val, y_val, X_test, y_test = load_dataset()
            
            # 定义 Theano variables for inputs and targets
            input_var = T.tensor4('inputs')
            target_var = T.ivector('targets')
            
            network = build_cnn(input_var) #构建网络模型
            
            prediction = lasagne.layers.get_output(network) #网络返回结果
            #定义交叉商
            loss = lasagne.objectives.categorical_crossentropy(prediction, target_var)
            loss = loss.mean() # batch_size个数据的均值
            
            #要学习的网络参数
            params = lasagne.layers.get_all_params(network, trainable=True)
            #网络学习过程中梯度下降的方式
            updates = lasagne.updates.nesterov_momentum(loss, params, learning_rate=0.01, momentum=0.9)
            
            #预测,deterministic=True是进行一次前向传播,禁用dropout
            test_prediction = lasagne.layers.get_output(network, deterministic=True)
            test_loss = lasagne.objectives.categorical_crossentropy(test_prediction,target_var)
            test_loss = test_loss.mean()
            test_acc = T.mean(T.eq(T.argmax(test_prediction, axis=1), target_var),dtype=theano.config.floatX)
            
            #主要函数
            train_fn = theano.function([input_var, target_var], loss, updates=updates)
            val_fn = theano.function([input_var, target_var], [test_loss, test_acc])
            
            #开始训练
            for epoch in range(num_epochs):
                train_err = 0
                train_batches = 0    #iterate_minibatches()函数要自己写
                for batch in iterate_minibatches(X_train, y_train, 500, shuffle=True):
                    inputs, targets = batch
                    train_err += train_fn(inputs, targets)
                    train_batches += 1
            
            #测试
            test_err = 0
            test_acc = 0
            test_batches = 0
            for batch in iterate_minibatches(X_test, y_test, 500, shuffle=False):
                inputs, targets = batch
                err, acc = val_fn(inputs, targets)
                test_err += err
                test_acc += acc
                test_batches += 1
                
            #保存模型参数
            np.savez('model.npz', *lasagne.layers.get_all_param_values(network))
            #加载模型参数
            with np.load('model.npz') as f:
                param_values = [f['arr_%d' % i] for i in range(len(f.files))]
            lasagne.layers.set_all_param_values(network, param_values)
            
            备注:
                参数存储:
                    net = {}
                    net['input'] = lasagne.layers.InputLayer(shape=(None,nChannels=1,h=112,w=112), input_var=self.data)         
                    print("Input shape: {0}".format(net['input'].output_shape)) #(None, 1, 112, 112)
                    net['s1_conv1_1'] = batch_norm(Conv2DLayer(net['input'], 64, 3, pad='same', W=GlorotUniform('relu')))                         
                        #(None, 64, 112, 112)
                            0 (64, 1, 3, 3) #'s1_conv1_1',1是上一层的卷积核个数
                            1 (64,) #以下4个是存储batch_norm中的beta、gamma、mean、std
                            2 (64,)    
                            3 (64,)
                            4 (64,)
                    # batch_norm  normalize
                    normalized = (input - mean) * (gamma * inv_std) + beta
                numpy(save、load):    
                    如果你想将多个数组保存到一个文件中的话,可以使用numpy.savez函数。
                    savez函数的第一个参数是文件名,其后的参数都是需要保存的数组,
                    也可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为arr_0,
                    arr_1, …。savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个
                    save函数保存的npy文件,文件名对应于数组名。load函数自动识别npz文件,并且返回一个
                    类似于字典的对象,可以通过数组名作为关键字获取数组的内容:
                    C=np.array([1,0,1,0])
                    np.savez("files.npz",A,B,C_array=C)
                    D=np.load("files.npz")
                    >>D['arr_0']
                    >>D['arr_1']
                    >>D['C_array']

官方给出安装环境建议是:
1)conda工具安装
2)python版本支持2.7、3.4、3.5
theano官方参考网站

2.创建theano环境
根据官方要求,conda中创建theano环境是设置python=3.6

conda update -n base conda          //update最新版本的conda
conda create -n theano python=3.6   //创建theano环境
conda activate theano               //开启theano环境
conda deactivate                    //关闭环境

3.安装theano

conda activate theano
anaconda search -t conda theano
1
2

可以看到theano 1.0.3版本支持python=3.6

//查看thean版本
anaconda show conda-forge/theano
//安装theano=1.0.3
conda install --channel https://conda.anaconda.org/conda-forge theano=1.0.3    

安装过程图
1)theano=1.0.3
2)libgpuarray=0.7.6
3)pygpu=0.7.6
4)numpy=1.13.3
--------------------- 

配置虚拟环境运行:theano,

然后提示出错:

from theano.tensor.signal import downsample ImportError: cannot import name 'downsample'

mportError: cannot import name ‘downsample’ 
查找资料发现downsample已经改为pool 
将上面代码改为from theano.tensor.signal import pool 
代码中运用到downsample的地方也要改掉

# 子采样
 pooled_out = downsample.max_pool_2d(
       input=conv_out,
       ds=poolsize,
       ignore_border=True
 )

这里直接将downsample改为pool会出错,因为里面相应的函数有变化 
查看pool.py的源码,发现downsample.max_pool_2d()与pool. pool_2d()函数功能相同,用ws代替ds

# 子采样
pooled_out = pool.pool_2d(
     input=conv_out,
     ws=poolsize,
     ignore_border=True
)

运行后,发现问题已经解决。
-

又有问题:

from nose.plugins.skip import SkipTest
ModuleNotFoundError: No module named 'nose'

 pip install nose

Using cuDNN version 7005 on context None ERROR (theano.gpuarray): Could not initialize pygpu, support disabled Traceback (most recent call last):提示0.9.0版本支持。

虚拟环境下重新卸载pygpu,重新 安装

conda remove pygpu   #删除原来的pygpu

重新安装指定版本:

conda install -c conda-forge theano=0.9.0  安装这个版本 

/home/gis/anaconda3/envs/theano/bin/python /home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py
Traceback (most recent call last):
  File "/home/gis/PycharmProjects/guo/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py", line 4, in <module>
    import theano as th
  File "/home/gis/anaconda3/envs/theano/lib/python3.6/site-packages/theano/__init__.py", line 80, in <module>
    from theano.scan_module import (scan, map, reduce, foldl, foldr, clone,
  File "/home/gis/anaconda3/envs/theano/lib/python3.6/site-packages/theano/scan_module/__init__.py", line 41, in <module>
    from theano.scan_module import scan_opt
  File "/home/gis/anaconda3/envs/theano/lib/python3.6/site-packages/theano/scan_module/scan_opt.py", line 60, in <module>
    from theano import tensor, scalar
  File "/home/gis/anaconda3/envs/theano/lib/python3.6/site-packages/theano/tensor/__init__.py", line 9, in <module>
    from theano.tensor.subtensor import *
  File "/home/gis/anaconda3/envs/theano/lib/python3.6/site-packages/theano/tensor/subtensor.py", line 27, in <module>
    from cutils_ext.cutils_ext import inplace_increment
ImportError: cannot import name 'inplace_increment'

Deleting the cache manually worked.

rm -rf ~/.theano

又有错误:

raise ImportError("dnn not available")  # pragma: no cover
ImportError: dnn not available

修改代码行:

#from lasagne.layers import dnn

from theano.sandbox.cuda import dnn

nn.py中也修改。

import matplotlib
ModuleNotFoundError: No module named 'matplotlib'

Process finished with exit code 1

安装模块:conda install matplotlib

Traceback (most recent call last):
  File "train_cifar_feature_matching.py", line 15, in <module>
    import cifar10_data
  File "/home/gden/PycharmProjects/improved-gan-master/mnist_svhn_cifar10/cifar10_data.py", line 1, in <module>
    import cPickle
ImportError: No module named 'cPickle'

在python3.x下使用如下代码:

import cPickle as pk

会报如下错误:

ImportError: No module named 'cPickle'

原因:python2有cPickle,但是在python3下,是没有cPickle的;

解决办法:将cPickle改为pickle即可,代码如下:

cifar10_data.py中cpkicle都改为pickle

UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6: ordinal not in range(128)

d = pickle.load(fo)

改为:

d = pickle.load(fo,encoding='bytes')

Namespace(batch_size=100, count=400, data_dir='./data/cifar-10-python', learning_rate=0.0003, seed=1, seed_data=1, unlabeled_weight=1.0)
Traceback (most recent call last):
  File "/home/gden/PycharmProjects/improved-gan-master/mnist_svhn_cifar10/train_cifar_feature_matching.py", line 36, in <module>
    trainx, trainy = cifar10_data.load(args.data_dir, subset='train')
  File "/home/gden/PycharmProjects/improved-gan-master/mnist_svhn_cifar10/cifar10_data.py", line 34, in load
    train_data = [unpickle(os.path.join(data_dir,'cifar-10-batches-py/data_batch_' + str(i))) for i in range(1,6)]
  File "/home/gden/PycharmProjects/improved-gan-master/mnist_svhn_cifar10/cifar10_data.py", line 34, in <listcomp>
    train_data = [unpickle(os.path.join(data_dir,'cifar-10-batches-py/data_batch_' + str(i))) for i in range(1,6)]
  File "/home/gden/PycharmProjects/improved-gan-master/mnist_svhn_cifar10/cifar10_data.py", line 29, in unpickle
    return {'x': np.cast[np.float32]((-127.5 + d['data'].reshape((10000,3,32,32)))/128.), 'y': np.array(d['labels']).astype(np.uint8)}
KeyError: 'data'

KeyError:’data’

这里是在实现李飞飞-深度学习与机器视觉课程的课后作业的时候遇到的问题。使用的代码是官方给出的代码,自己只是照着敲一遍,但是却出现了KeyError:’data’。
经过查询也没有发现问题所在。出错的代码是这一段

def load_CIFAR_batch(filename):
  """ load single batch of cifar """
  with open(filename, 'rb') as f:
    datadict = pickle.load(f, encoding='bytes')
    Y = datadict['labels']
    X = datadict['data']
    X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float")
    Y = np.array(Y)
    return X, Y

因为这个问题就是说字典datadict里面没有data这个字段罢了,所以百度了也没有办法。后来进行了debug,观察了datadict的数据发现,在key值data和labels 的前面都有一个b,后来了我就加了一个b在data和labels 前面。如下

Y = datadict[b'labels']
    X = datadict[b'data']

1
    2

然后正常了……
百度之后才发现这个是python2和python3的问题,我使用了官方给的一个代码库,不过这个是用python2写的,而官方的训练数据也是使用python2生成的。结果我使用的python3去运行,就出现了这个错误。
这里是百度之后的结果:

b:bytes
python3.x里默认的str是unicode, bytes是py2.x的str, b''前缀代表的就是bytes
python2.x里, b前缀没什么具体意义,只是为了兼容python3.x的这种写法
-

cifar10_data.py  29行:data labels前加b
return {'x': np.cast[np.float32]((-127.5 + d[b'data'].reshape((10000,3,32,32)))/128.), 'y': np.array(d[b'labels']).astype(np.uint8)}

Improved Techniques for Training GANs 代码执行中的坑 python3.6 tf环境相关推荐

  1. Improved Techniques for Training GANs论文中的创新和理解

    一.题外话:非平稳性纹理合成 1.目的:使用生成对抗网络来将小纹理扩展为类似于原始样本的较大纹理: 基于实例的纹理合成的目的是生成纹理,捕获样本的视觉特征并保持逼真的外观. 非平稳性纹理包括大规模不规 ...

  2. 《Improved Techniques for Training GANs》-论文阅读笔记

    <Improved Techniques for Training GANs>-论文阅读笔记 文章目录 <Improved Techniques for Training GANs& ...

  3. Improved Techniques for Training GANs

    Improved Techniques for Training GANs paper code Introduce 对抗网络主要有两个应用:半监督学习和生成视觉相似图片.对抗网络的目的要训练生成网络 ...

  4. 学习笔记:Improved Techniques for Training GANs理解

    论文链接:https://arxiv.org/abs/1606.03498 这是一篇对GAN的训练作出改进的文章,众所周知,GAN的训练是极其不稳定的.转载请注明. 1 主要内容 对GAN网络提出一些 ...

  5. 浅谈PHP代码执行中出现过滤限制的绕过执行方法

    本篇文章总结于本人在CTF比赛中碰到的各种代码执行绕过方法 文章目录 代码执行函数 可回调函数 字符串拼接绕过 字符串转义绕过 多次传参绕过 内置函数访问绕过 异或绕过 URL编码取反绕过 代码执行函 ...

  6. 降低代码执行中得内存消耗_微服务中使用 OpenJ9 JVM内存占用降低60%!

    专注于Java领域优质技术,欢迎关注 作者: 陈一乐 来自:陈一乐 随着微服务的普及,许多企业踏上微服务之旅. 微服务化后,应用数量可能高一个数量级.一般企业,以前三五个应用能支撑业务,微服务化之后应 ...

  7. Python魔术世界 1 如何使用Visual Studio在WIN10中一键安装Python3入门编程环境并测试Django...

    本文通过VS安装Python和Django的环境,创建了一个Web程序,前后5分钟的操作,让你快速入门Python的编程世界,各种Python和Django的概念会在实战中给你娓娓道来. Django ...

  8. python执行txt中代码_【技术分享】文件解压之过 Python中的代码执行

    预估稿费:200RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 一.前言 Python中负责解压压缩文件的代码实现上并不安全,存在目录遍历漏洞,攻击者可以利用该漏洞覆盖_ ...

  9. 猥琐思路复现Spring WebFlow远程代码执行

    本文讲的是猥琐思路复现Spring WebFlow远程代码执行,说明:做安全的,思路不猥琐是日不下站的,必须变的猥琐起来,各种思路就会在你脑海中迸发. 1.不温不火的漏洞 这个漏洞在六月份的时候就被提 ...

最新文章

  1. Yii2掉index.php?r=
  2. 水仙花数 与 变种水仙花数 的求解 【C语言】
  3. Windows保护模式学习笔记(十二)—— 控制寄存器
  4. thymeleaf 学习笔记
  5. MySQL对于表中数据的增删改查
  6. Spring boot工程创建
  7. Python + selenium之组织unittest单元测试用例
  8. grafana中国地图插件
  9. 泛微协同办公平台E-cology9.0版本最全帮助文档
  10. 计算方法实验(二):龙贝格积分法
  11. 博士申请 | 美国明尼苏达大学葛畅教授招收隐私数据管理方向全奖博士/硕士/博后/访问学者...
  12. (statistic)你所不知道的P值--对统计学的批判
  13. PHP语言对用户输入的身份证信息进行实名认证(阿里云身份证实名认证接口API)
  14. Jetson NX Ubuntu 18.04下谷歌输入法候选框不显示解决办法
  15. C语言 qsort的用法 模拟EXCEL排序
  16. NBA球星库里入股FTX并担任品牌大使,后者此前已签下布雷迪
  17. 媒体该如何展示事实之美?
  18. 【查找各日期段内的银行贷款利率问题】
  19. 【财务_会计1_3】会计基本假设与会计基础
  20. 服务器2016系统怎么关防火墙,服务器怎么关闭防火墙

热门文章

  1. 网络工程师面试题(面试必看)(4)
  2. 【模型部署】NNI:剪枝和量化
  3. Java服务端集成环信IM
  4. MVC有哪几种过滤器?
  5. 人脸检测--TinaFace
  6. linux软raid mdadm命令详讲
  7. 程序员来聊一聊信用卡(三)——信用卡的一些基本分类
  8. Javascript对象相加
  9. WPA渗透-pyrit:batch-table加速attack_db模块加速_“attack_db”模块加速
  10. 1 面向对象设计模式与原则