Convolutional Autoencoder

Sticking with the MNIST dataset, let's improve our autoencoder's performance using convolutional layers. Again, loading modules and the data.


In [1]:
%matplotlib inline

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

In [2]:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', validation_size=0)


Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz

In [3]:
img = mnist.train.images[2]
plt.imshow(img.reshape((28, 28)), cmap='Greys_r')


Out[3]:
<matplotlib.image.AxesImage at 0x11fd741d0>

Network Architecture

The encoder part of the network will be a typical convolutional pyramid. Each convolutional layer will be followed by a max-pooling layer to reduce the dimensions of the layers. The decoder though might be something new to you. The decoder needs to convert from a narrow representation to a wide reconstructed image. For example, the representation could be a 4x4x8 max-pool layer. This is the output of the encoder, but also the input to the decoder. We want to get a 28x28x1 image out from the decoder so we need to work our way back up from the narrow decoder input layer. A schematic of the network is shown below.

Here our final encoder layer has size 4x4x8 = 128. The original images have size 28x28 = 784, so the encoded vector is roughly 16% the size of the original image. These are just suggested sizes for each of the layers. Feel free to change the depths and sizes, but remember our goal here is to find a small representation of the input data.

What's going on with the decoder

Okay, so the decoder has these "Upsample" layers that you might not have seen before. First off, I'll discuss a bit what these layers aren't. Usually, you'll see deconvolutional layers used to increase the width and height of the layers. They work almost exactly the same as convolutional layers, but it reverse. A stride in the input layer results in a larger stride in the deconvolutional layer. For example, if you have a 3x3 kernel, a 3x3 patch in the input layer will be reduced to one unit in a convolutional layer. Comparatively, one unit in the input layer will be expanded to a 3x3 path in a deconvolutional layer. Deconvolution is often called "transpose convolution" which is what you'll find with the TensorFlow API, with tf.nn.conv2d_transpose.

However, deconvolutional layers can lead to artifacts in the final images, such as checkerboard patterns. This is due to overlap in the kernels which can be avoided by setting the stride and kernel size equal. In this Distill article from Augustus Odena, et al, the authors show that these checkerboard artifacts can be avoided by resizing the layers using nearest neighbor or bilinear interpolation (upsampling) followed by a convolutional layer. In TensorFlow, this is easily done with tf.image.resize_images, followed by a convolution. Be sure to read the Distill article to get a better understanding of deconvolutional layers and why we're using upsampling.

Exercise: Build the network shown above. Remember that a convolutional layer with strides of 1 and 'same' padding won't reduce the height and width. That is, if the input is 28x28 and the convolution layer has stride = 1 and 'same' padding, the convolutional layer will also be 28x28. The max-pool layers are used the reduce the width and height. A stride of 2 will reduce the size by 2. Odena et al claim that nearest neighbor interpolation works best for the upsampling, so make sure to include that as a parameter in tf.image.resize_images or use tf.image.resize_nearest_neighbor.


In [8]:
learning_rate = 0.001
inputs_ = tf.placeholder(tf.float32, shape=(None, 28, 28, 1))
targets_ = tf.placeholder(tf.float32, shape=(None, 28, 28, 1))

### Encoder
conv1 = tf.layers.conv2d(inputs_, 16, (3, 3), padding='SAME', activation=tf.nn.relu)
# Now 28x28x16
assert conv1.get_shape().as_list() == [None, 28, 28, 16], print(conv1.get_shape().as_list())
maxpool1 = tf.layers.max_pooling2d(conv1, (2, 2), (2, 2), padding='SAME')
# Now 14x14x16
assert maxpool1.get_shape().as_list() == [None, 14, 14, 16], print(maxpool1.get_shape().as_list())
conv2 = tf.layers.conv2d(maxpool1, 8, (3, 3), padding='SAME', activation=tf.nn.relu)
# Now 14x14x8
maxpool2 = tf.layers.max_pooling2d(conv2, (2, 2), (2, 2), padding='SAME')
# Now 7x7x8
conv3 = tf.layers.conv2d(maxpool2, 8, (3, 3), padding='SAME', activation=tf.nn.relu)
# Now 7x7x8
encoded = tf.layers.max_pooling2d(conv3, (2, 2), (2, 2), padding='SAME')
# Now 4x4x8
assert encoded.get_shape().as_list() == [None, 4, 4, 8], print(encoded.get_shape().as_list())

### Decoder
upsample1 = tf.image.resize_nearest_neighbor(encoded, (7, 7))
assert upsample1.get_shape().as_list() == [None, 7, 7, 8], print(upsample1.get_shape().as_list())
# Now 7x7x8
conv4 = tf.layers.conv2d(upsample1, 8, (3, 3), padding='SAME', activation=tf.nn.relu)
# Now 7x7x8
upsample2 = tf.image.resize_nearest_neighbor(conv4, (14, 14))
assert upsample2.get_shape().as_list() == [None, 14, 14, 8], print(upsample2.get_shape().as_list())
# Now 14x14x8
conv5 = tf.layers.conv2d(upsample2, 8, (3, 3), padding='SAME', activation=tf.nn.relu)
# Now 14x14x8
upsample3 = tf.image.resize_nearest_neighbor(conv5, (28, 28))
# Now 28x28x8
conv6 = tf.layers.conv2d(upsample3, 16, (3, 3), padding='SAME', activation=tf.nn.relu)
# Now 28x28x16

logits = tf.layers.conv2d(conv6, 1, (3, 3), padding='SAME', activation=None)
#Now 28x28x1

# Pass logits through sigmoid to get reconstructed image
decoded = tf.nn.sigmoid(logits)

# Pass logits through sigmoid and calculate the cross-entropy loss
loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=logits, labels=targets_)

# Get cost and define the optimizer
cost = tf.reduce_mean(loss)
opt = tf.train.AdamOptimizer(learning_rate).minimize(cost)

In [9]:
upsample2.get_shape()


Out[9]:
TensorShape([Dimension(None), Dimension(14), Dimension(14), Dimension(8)])

Training

As before, here wi'll train the network. Instead of flattening the images though, we can pass them in as 28x28x1 arrays.


In [10]:
sess = tf.Session()

In [11]:
epochs = 20
batch_size = 200
sess.run(tf.global_variables_initializer())
for e in range(epochs):
    for ii in range(mnist.train.num_examples//batch_size):
        batch = mnist.train.next_batch(batch_size)
        imgs = batch[0].reshape((-1, 28, 28, 1))
        batch_cost, _ = sess.run([cost, opt], feed_dict={inputs_: imgs,
                                                         targets_: imgs})

        print("Epoch: {}/{}...".format(e+1, epochs),
              "Training loss: {:.4f}".format(batch_cost))


Epoch: 1/20... Training loss: 0.7053
Epoch: 1/20... Training loss: 0.6962
Epoch: 1/20... Training loss: 0.6905
Epoch: 1/20... Training loss: 0.6860
Epoch: 1/20... Training loss: 0.6816
Epoch: 1/20... Training loss: 0.6767
Epoch: 1/20... Training loss: 0.6702
Epoch: 1/20... Training loss: 0.6625
Epoch: 1/20... Training loss: 0.6509
Epoch: 1/20... Training loss: 0.6407
Epoch: 1/20... Training loss: 0.6265
Epoch: 1/20... Training loss: 0.6158
Epoch: 1/20... Training loss: 0.5943
Epoch: 1/20... Training loss: 0.5786
Epoch: 1/20... Training loss: 0.5603
Epoch: 1/20... Training loss: 0.5506
Epoch: 1/20... Training loss: 0.5551
Epoch: 1/20... Training loss: 0.5336
Epoch: 1/20... Training loss: 0.5475
Epoch: 1/20... Training loss: 0.5644
Epoch: 1/20... Training loss: 0.5638
Epoch: 1/20... Training loss: 0.5380
Epoch: 1/20... Training loss: 0.5396
Epoch: 1/20... Training loss: 0.5748
Epoch: 1/20... Training loss: 0.5386
Epoch: 1/20... Training loss: 0.4999
Epoch: 1/20... Training loss: 0.4763
Epoch: 1/20... Training loss: 0.4972
Epoch: 1/20... Training loss: 0.4782
Epoch: 1/20... Training loss: 0.4622
Epoch: 1/20... Training loss: 0.4640
Epoch: 1/20... Training loss: 0.4719
Epoch: 1/20... Training loss: 0.4918
Epoch: 1/20... Training loss: 0.4684
Epoch: 1/20... Training loss: 0.4681
Epoch: 1/20... Training loss: 0.4943
Epoch: 1/20... Training loss: 0.4730
Epoch: 1/20... Training loss: 0.4390
Epoch: 1/20... Training loss: 0.4261
Epoch: 1/20... Training loss: 0.4256
Epoch: 1/20... Training loss: 0.4320
Epoch: 1/20... Training loss: 0.4247
Epoch: 1/20... Training loss: 0.4097
Epoch: 1/20... Training loss: 0.4002
Epoch: 1/20... Training loss: 0.4583
Epoch: 1/20... Training loss: 0.4108
Epoch: 1/20... Training loss: 0.3724
Epoch: 1/20... Training loss: 0.3872
Epoch: 1/20... Training loss: 0.3751
Epoch: 1/20... Training loss: 0.3579
Epoch: 1/20... Training loss: 0.3439
Epoch: 1/20... Training loss: 0.3344
Epoch: 1/20... Training loss: 0.3284
Epoch: 1/20... Training loss: 0.3313
Epoch: 1/20... Training loss: 0.3254
Epoch: 1/20... Training loss: 0.3219
Epoch: 1/20... Training loss: 0.3052
Epoch: 1/20... Training loss: 0.2935
Epoch: 1/20... Training loss: 0.3012
Epoch: 1/20... Training loss: 0.2841
Epoch: 1/20... Training loss: 0.2870
Epoch: 1/20... Training loss: 0.2484
Epoch: 1/20... Training loss: 0.2533
Epoch: 1/20... Training loss: 0.2710
Epoch: 1/20... Training loss: 0.2565
Epoch: 1/20... Training loss: 0.2372
Epoch: 1/20... Training loss: 0.2413
Epoch: 1/20... Training loss: 0.2321
Epoch: 1/20... Training loss: 0.2299
Epoch: 1/20... Training loss: 0.2235
Epoch: 1/20... Training loss: 0.2237
Epoch: 1/20... Training loss: 0.2295
Epoch: 1/20... Training loss: 0.2215
Epoch: 1/20... Training loss: 0.2267
Epoch: 1/20... Training loss: 0.2203
Epoch: 1/20... Training loss: 0.2210
Epoch: 1/20... Training loss: 0.2174
Epoch: 1/20... Training loss: 0.2145
Epoch: 1/20... Training loss: 0.2233
Epoch: 1/20... Training loss: 0.2292
Epoch: 1/20... Training loss: 0.2160
Epoch: 1/20... Training loss: 0.2091
Epoch: 1/20... Training loss: 0.2062
Epoch: 1/20... Training loss: 0.2072
Epoch: 1/20... Training loss: 0.2066
Epoch: 1/20... Training loss: 0.2105
Epoch: 1/20... Training loss: 0.2144
Epoch: 1/20... Training loss: 0.2082
Epoch: 1/20... Training loss: 0.2013
Epoch: 1/20... Training loss: 0.2309
Epoch: 1/20... Training loss: 0.2193
Epoch: 1/20... Training loss: 0.2194
Epoch: 1/20... Training loss: 0.2228
Epoch: 1/20... Training loss: 0.2147
Epoch: 1/20... Training loss: 0.2049
Epoch: 1/20... Training loss: 0.2097
Epoch: 1/20... Training loss: 0.2044
Epoch: 1/20... Training loss: 0.2044
Epoch: 1/20... Training loss: 0.2008
Epoch: 1/20... Training loss: 0.2134
Epoch: 1/20... Training loss: 0.2076
Epoch: 1/20... Training loss: 0.1981
Epoch: 1/20... Training loss: 0.2169
Epoch: 1/20... Training loss: 0.2115
Epoch: 1/20... Training loss: 0.2010
Epoch: 1/20... Training loss: 0.1980
Epoch: 1/20... Training loss: 0.2089
Epoch: 1/20... Training loss: 0.2071
Epoch: 1/20... Training loss: 0.2091
Epoch: 1/20... Training loss: 0.1987
Epoch: 1/20... Training loss: 0.1958
Epoch: 1/20... Training loss: 0.1962
Epoch: 1/20... Training loss: 0.2032
Epoch: 1/20... Training loss: 0.1870
Epoch: 1/20... Training loss: 0.1887
Epoch: 1/20... Training loss: 0.2026
Epoch: 1/20... Training loss: 0.1878
Epoch: 1/20... Training loss: 0.1764
Epoch: 1/20... Training loss: 0.1952
Epoch: 1/20... Training loss: 0.2020
Epoch: 1/20... Training loss: 0.1899
Epoch: 1/20... Training loss: 0.1919
Epoch: 1/20... Training loss: 0.1828
Epoch: 1/20... Training loss: 0.1849
Epoch: 1/20... Training loss: 0.1823
Epoch: 1/20... Training loss: 0.1846
Epoch: 1/20... Training loss: 0.1907
Epoch: 1/20... Training loss: 0.1816
Epoch: 1/20... Training loss: 0.2011
Epoch: 1/20... Training loss: 0.1968
Epoch: 1/20... Training loss: 0.1918
Epoch: 1/20... Training loss: 0.1881
Epoch: 1/20... Training loss: 0.1909
Epoch: 1/20... Training loss: 0.1874
Epoch: 1/20... Training loss: 0.1890
Epoch: 1/20... Training loss: 0.1866
Epoch: 1/20... Training loss: 0.1859
Epoch: 1/20... Training loss: 0.1932
Epoch: 1/20... Training loss: 0.1961
Epoch: 1/20... Training loss: 0.1877
Epoch: 1/20... Training loss: 0.1808
Epoch: 1/20... Training loss: 0.1800
Epoch: 1/20... Training loss: 0.1674
Epoch: 1/20... Training loss: 0.1805
Epoch: 1/20... Training loss: 0.1845
Epoch: 1/20... Training loss: 0.1847
Epoch: 1/20... Training loss: 0.1785
Epoch: 1/20... Training loss: 0.1782
Epoch: 1/20... Training loss: 0.1814
Epoch: 1/20... Training loss: 0.1751
Epoch: 1/20... Training loss: 0.1810
Epoch: 1/20... Training loss: 0.1804
Epoch: 1/20... Training loss: 0.1789
Epoch: 1/20... Training loss: 0.1792
Epoch: 1/20... Training loss: 0.1779
Epoch: 1/20... Training loss: 0.1788
Epoch: 1/20... Training loss: 0.1876
Epoch: 1/20... Training loss: 0.1834
Epoch: 1/20... Training loss: 0.1788
Epoch: 1/20... Training loss: 0.1827
Epoch: 1/20... Training loss: 0.1799
Epoch: 1/20... Training loss: 0.1710
Epoch: 1/20... Training loss: 0.1722
Epoch: 1/20... Training loss: 0.1748
Epoch: 1/20... Training loss: 0.1803
Epoch: 1/20... Training loss: 0.1843
Epoch: 1/20... Training loss: 0.1795
Epoch: 1/20... Training loss: 0.1728
Epoch: 1/20... Training loss: 0.1777
Epoch: 1/20... Training loss: 0.1727
Epoch: 1/20... Training loss: 0.1804
Epoch: 1/20... Training loss: 0.1783
Epoch: 1/20... Training loss: 0.1793
Epoch: 1/20... Training loss: 0.1784
Epoch: 1/20... Training loss: 0.1866
Epoch: 1/20... Training loss: 0.1814
Epoch: 1/20... Training loss: 0.1862
Epoch: 1/20... Training loss: 0.1764
Epoch: 1/20... Training loss: 0.1705
Epoch: 1/20... Training loss: 0.1742
Epoch: 1/20... Training loss: 0.1783
Epoch: 1/20... Training loss: 0.1796
Epoch: 1/20... Training loss: 0.1745
Epoch: 1/20... Training loss: 0.1720
Epoch: 1/20... Training loss: 0.1733
Epoch: 1/20... Training loss: 0.1686
Epoch: 1/20... Training loss: 0.1832
Epoch: 1/20... Training loss: 0.1754
Epoch: 1/20... Training loss: 0.1700
Epoch: 1/20... Training loss: 0.1709
Epoch: 1/20... Training loss: 0.1609
Epoch: 1/20... Training loss: 0.1704
Epoch: 1/20... Training loss: 0.1768
Epoch: 1/20... Training loss: 0.1695
Epoch: 1/20... Training loss: 0.1689
Epoch: 1/20... Training loss: 0.1776
Epoch: 1/20... Training loss: 0.1728
Epoch: 1/20... Training loss: 0.1696
Epoch: 1/20... Training loss: 0.1729
Epoch: 1/20... Training loss: 0.1759
Epoch: 1/20... Training loss: 0.1652
Epoch: 1/20... Training loss: 0.1648
Epoch: 1/20... Training loss: 0.1685
Epoch: 1/20... Training loss: 0.1634
Epoch: 1/20... Training loss: 0.1721
Epoch: 1/20... Training loss: 0.1723
Epoch: 1/20... Training loss: 0.1777
Epoch: 1/20... Training loss: 0.1725
Epoch: 1/20... Training loss: 0.1597
Epoch: 1/20... Training loss: 0.1728
Epoch: 1/20... Training loss: 0.1736
Epoch: 1/20... Training loss: 0.1668
Epoch: 1/20... Training loss: 0.1651
Epoch: 1/20... Training loss: 0.1740
Epoch: 1/20... Training loss: 0.1690
Epoch: 1/20... Training loss: 0.1720
Epoch: 1/20... Training loss: 0.1726
Epoch: 1/20... Training loss: 0.1695
Epoch: 1/20... Training loss: 0.1681
Epoch: 1/20... Training loss: 0.1773
Epoch: 1/20... Training loss: 0.1708
Epoch: 1/20... Training loss: 0.1720
Epoch: 1/20... Training loss: 0.1724
Epoch: 1/20... Training loss: 0.1706
Epoch: 1/20... Training loss: 0.1717
Epoch: 1/20... Training loss: 0.1720
Epoch: 1/20... Training loss: 0.1747
Epoch: 1/20... Training loss: 0.1744
Epoch: 1/20... Training loss: 0.1655
Epoch: 1/20... Training loss: 0.1622
Epoch: 1/20... Training loss: 0.1714
Epoch: 1/20... Training loss: 0.1763
Epoch: 1/20... Training loss: 0.1661
Epoch: 1/20... Training loss: 0.1654
Epoch: 1/20... Training loss: 0.1704
Epoch: 1/20... Training loss: 0.1679
Epoch: 1/20... Training loss: 0.1732
Epoch: 1/20... Training loss: 0.1630
Epoch: 1/20... Training loss: 0.1741
Epoch: 1/20... Training loss: 0.1669
Epoch: 1/20... Training loss: 0.1711
Epoch: 1/20... Training loss: 0.1737
Epoch: 1/20... Training loss: 0.1631
Epoch: 1/20... Training loss: 0.1591
Epoch: 1/20... Training loss: 0.1700
Epoch: 1/20... Training loss: 0.1677
Epoch: 1/20... Training loss: 0.1672
Epoch: 1/20... Training loss: 0.1609
Epoch: 1/20... Training loss: 0.1640
Epoch: 1/20... Training loss: 0.1670
Epoch: 1/20... Training loss: 0.1688
Epoch: 1/20... Training loss: 0.1683
Epoch: 1/20... Training loss: 0.1657
Epoch: 1/20... Training loss: 0.1621
Epoch: 1/20... Training loss: 0.1542
Epoch: 1/20... Training loss: 0.1678
Epoch: 1/20... Training loss: 0.1577
Epoch: 1/20... Training loss: 0.1656
Epoch: 1/20... Training loss: 0.1641
Epoch: 1/20... Training loss: 0.1661
Epoch: 1/20... Training loss: 0.1585
Epoch: 1/20... Training loss: 0.1634
Epoch: 1/20... Training loss: 0.1689
Epoch: 1/20... Training loss: 0.1688
Epoch: 1/20... Training loss: 0.1599
Epoch: 1/20... Training loss: 0.1657
Epoch: 1/20... Training loss: 0.1569
Epoch: 1/20... Training loss: 0.1607
Epoch: 1/20... Training loss: 0.1640
Epoch: 1/20... Training loss: 0.1575
Epoch: 1/20... Training loss: 0.1597
Epoch: 1/20... Training loss: 0.1669
Epoch: 1/20... Training loss: 0.1655
Epoch: 1/20... Training loss: 0.1602
Epoch: 1/20... Training loss: 0.1595
Epoch: 1/20... Training loss: 0.1658
Epoch: 1/20... Training loss: 0.1594
Epoch: 1/20... Training loss: 0.1583
Epoch: 1/20... Training loss: 0.1590
Epoch: 1/20... Training loss: 0.1664
Epoch: 1/20... Training loss: 0.1654
Epoch: 1/20... Training loss: 0.1565
Epoch: 1/20... Training loss: 0.1639
Epoch: 1/20... Training loss: 0.1593
Epoch: 1/20... Training loss: 0.1679
Epoch: 1/20... Training loss: 0.1655
Epoch: 1/20... Training loss: 0.1557
Epoch: 1/20... Training loss: 0.1726
Epoch: 1/20... Training loss: 0.1616
Epoch: 1/20... Training loss: 0.1734
Epoch: 1/20... Training loss: 0.1711
Epoch: 1/20... Training loss: 0.1590
Epoch: 1/20... Training loss: 0.1592
Epoch: 1/20... Training loss: 0.1620
Epoch: 1/20... Training loss: 0.1597
Epoch: 1/20... Training loss: 0.1628
Epoch: 1/20... Training loss: 0.1582
Epoch: 1/20... Training loss: 0.1606
Epoch: 1/20... Training loss: 0.1565
Epoch: 1/20... Training loss: 0.1628
Epoch: 2/20... Training loss: 0.1597
Epoch: 2/20... Training loss: 0.1537
Epoch: 2/20... Training loss: 0.1546
Epoch: 2/20... Training loss: 0.1586
Epoch: 2/20... Training loss: 0.1656
Epoch: 2/20... Training loss: 0.1623
Epoch: 2/20... Training loss: 0.1575
Epoch: 2/20... Training loss: 0.1591
Epoch: 2/20... Training loss: 0.1578
Epoch: 2/20... Training loss: 0.1635
Epoch: 2/20... Training loss: 0.1628
Epoch: 2/20... Training loss: 0.1588
Epoch: 2/20... Training loss: 0.1617
Epoch: 2/20... Training loss: 0.1605
Epoch: 2/20... Training loss: 0.1565
Epoch: 2/20... Training loss: 0.1629
Epoch: 2/20... Training loss: 0.1565
Epoch: 2/20... Training loss: 0.1597
Epoch: 2/20... Training loss: 0.1619
Epoch: 2/20... Training loss: 0.1599
Epoch: 2/20... Training loss: 0.1519
Epoch: 2/20... Training loss: 0.1587
Epoch: 2/20... Training loss: 0.1622
Epoch: 2/20... Training loss: 0.1543
Epoch: 2/20... Training loss: 0.1587
Epoch: 2/20... Training loss: 0.1524
Epoch: 2/20... Training loss: 0.1523
Epoch: 2/20... Training loss: 0.1528
Epoch: 2/20... Training loss: 0.1555
Epoch: 2/20... Training loss: 0.1531
Epoch: 2/20... Training loss: 0.1564
Epoch: 2/20... Training loss: 0.1635
Epoch: 2/20... Training loss: 0.1590
Epoch: 2/20... Training loss: 0.1533
Epoch: 2/20... Training loss: 0.1516
Epoch: 2/20... Training loss: 0.1547
Epoch: 2/20... Training loss: 0.1629
Epoch: 2/20... Training loss: 0.1475
Epoch: 2/20... Training loss: 0.1583
Epoch: 2/20... Training loss: 0.1525
Epoch: 2/20... Training loss: 0.1509
Epoch: 2/20... Training loss: 0.1526
Epoch: 2/20... Training loss: 0.1542
Epoch: 2/20... Training loss: 0.1533
Epoch: 2/20... Training loss: 0.1501
Epoch: 2/20... Training loss: 0.1543
Epoch: 2/20... Training loss: 0.1556
Epoch: 2/20... Training loss: 0.1522
Epoch: 2/20... Training loss: 0.1507
Epoch: 2/20... Training loss: 0.1582
Epoch: 2/20... Training loss: 0.1569
Epoch: 2/20... Training loss: 0.1544
Epoch: 2/20... Training loss: 0.1526
Epoch: 2/20... Training loss: 0.1544
Epoch: 2/20... Training loss: 0.1578
Epoch: 2/20... Training loss: 0.1531
Epoch: 2/20... Training loss: 0.1478
Epoch: 2/20... Training loss: 0.1502
Epoch: 2/20... Training loss: 0.1545
Epoch: 2/20... Training loss: 0.1533
Epoch: 2/20... Training loss: 0.1552
Epoch: 2/20... Training loss: 0.1507
Epoch: 2/20... Training loss: 0.1508
Epoch: 2/20... Training loss: 0.1504
Epoch: 2/20... Training loss: 0.1515
Epoch: 2/20... Training loss: 0.1562
Epoch: 2/20... Training loss: 0.1505
Epoch: 2/20... Training loss: 0.1526
Epoch: 2/20... Training loss: 0.1533
Epoch: 2/20... Training loss: 0.1490
Epoch: 2/20... Training loss: 0.1516
Epoch: 2/20... Training loss: 0.1524
Epoch: 2/20... Training loss: 0.1527
Epoch: 2/20... Training loss: 0.1486
Epoch: 2/20... Training loss: 0.1590
Epoch: 2/20... Training loss: 0.1496
Epoch: 2/20... Training loss: 0.1499
Epoch: 2/20... Training loss: 0.1517
Epoch: 2/20... Training loss: 0.1518
Epoch: 2/20... Training loss: 0.1487
Epoch: 2/20... Training loss: 0.1494
Epoch: 2/20... Training loss: 0.1519
Epoch: 2/20... Training loss: 0.1486
Epoch: 2/20... Training loss: 0.1501
Epoch: 2/20... Training loss: 0.1501
Epoch: 2/20... Training loss: 0.1502
Epoch: 2/20... Training loss: 0.1500
Epoch: 2/20... Training loss: 0.1487
Epoch: 2/20... Training loss: 0.1486
Epoch: 2/20... Training loss: 0.1467
Epoch: 2/20... Training loss: 0.1498
Epoch: 2/20... Training loss: 0.1443
Epoch: 2/20... Training loss: 0.1482
Epoch: 2/20... Training loss: 0.1538
Epoch: 2/20... Training loss: 0.1525
Epoch: 2/20... Training loss: 0.1501
Epoch: 2/20... Training loss: 0.1534
Epoch: 2/20... Training loss: 0.1484
Epoch: 2/20... Training loss: 0.1475
Epoch: 2/20... Training loss: 0.1478
Epoch: 2/20... Training loss: 0.1475
Epoch: 2/20... Training loss: 0.1444
Epoch: 2/20... Training loss: 0.1465
Epoch: 2/20... Training loss: 0.1522
Epoch: 2/20... Training loss: 0.1437
Epoch: 2/20... Training loss: 0.1483
Epoch: 2/20... Training loss: 0.1441
Epoch: 2/20... Training loss: 0.1483
Epoch: 2/20... Training loss: 0.1491
Epoch: 2/20... Training loss: 0.1486
Epoch: 2/20... Training loss: 0.1550
Epoch: 2/20... Training loss: 0.1468
Epoch: 2/20... Training loss: 0.1517
Epoch: 2/20... Training loss: 0.1458
Epoch: 2/20... Training loss: 0.1455
Epoch: 2/20... Training loss: 0.1414
Epoch: 2/20... Training loss: 0.1506
Epoch: 2/20... Training loss: 0.1493
Epoch: 2/20... Training loss: 0.1516
Epoch: 2/20... Training loss: 0.1474
Epoch: 2/20... Training loss: 0.1506
Epoch: 2/20... Training loss: 0.1506
Epoch: 2/20... Training loss: 0.1449
Epoch: 2/20... Training loss: 0.1490
Epoch: 2/20... Training loss: 0.1438
Epoch: 2/20... Training loss: 0.1440
Epoch: 2/20... Training loss: 0.1468
Epoch: 2/20... Training loss: 0.1425
Epoch: 2/20... Training loss: 0.1476
Epoch: 2/20... Training loss: 0.1422
Epoch: 2/20... Training loss: 0.1474
Epoch: 2/20... Training loss: 0.1468
Epoch: 2/20... Training loss: 0.1380
Epoch: 2/20... Training loss: 0.1487
Epoch: 2/20... Training loss: 0.1482
Epoch: 2/20... Training loss: 0.1427
Epoch: 2/20... Training loss: 0.1418
Epoch: 2/20... Training loss: 0.1422
Epoch: 2/20... Training loss: 0.1467
Epoch: 2/20... Training loss: 0.1472
Epoch: 2/20... Training loss: 0.1410
Epoch: 2/20... Training loss: 0.1448
Epoch: 2/20... Training loss: 0.1474
Epoch: 2/20... Training loss: 0.1424
Epoch: 2/20... Training loss: 0.1427
Epoch: 2/20... Training loss: 0.1420
Epoch: 2/20... Training loss: 0.1466
Epoch: 2/20... Training loss: 0.1479
Epoch: 2/20... Training loss: 0.1375
Epoch: 2/20... Training loss: 0.1461
Epoch: 2/20... Training loss: 0.1470
Epoch: 2/20... Training loss: 0.1478
Epoch: 2/20... Training loss: 0.1427
Epoch: 2/20... Training loss: 0.1441
Epoch: 2/20... Training loss: 0.1467
Epoch: 2/20... Training loss: 0.1358
Epoch: 2/20... Training loss: 0.1415
Epoch: 2/20... Training loss: 0.1460
Epoch: 2/20... Training loss: 0.1440
Epoch: 2/20... Training loss: 0.1428
Epoch: 2/20... Training loss: 0.1422
Epoch: 2/20... Training loss: 0.1410
Epoch: 2/20... Training loss: 0.1495
Epoch: 2/20... Training loss: 0.1431
Epoch: 2/20... Training loss: 0.1406
Epoch: 2/20... Training loss: 0.1443
Epoch: 2/20... Training loss: 0.1395
Epoch: 2/20... Training loss: 0.1439
Epoch: 2/20... Training loss: 0.1434
Epoch: 2/20... Training loss: 0.1448
Epoch: 2/20... Training loss: 0.1454
Epoch: 2/20... Training loss: 0.1374
Epoch: 2/20... Training loss: 0.1398
Epoch: 2/20... Training loss: 0.1410
Epoch: 2/20... Training loss: 0.1429
Epoch: 2/20... Training loss: 0.1407
Epoch: 2/20... Training loss: 0.1425
Epoch: 2/20... Training loss: 0.1432
Epoch: 2/20... Training loss: 0.1523
Epoch: 2/20... Training loss: 0.1376
Epoch: 2/20... Training loss: 0.1436
Epoch: 2/20... Training loss: 0.1416
Epoch: 2/20... Training loss: 0.1416
Epoch: 2/20... Training loss: 0.1417
Epoch: 2/20... Training loss: 0.1457
Epoch: 2/20... Training loss: 0.1395
Epoch: 2/20... Training loss: 0.1420
Epoch: 2/20... Training loss: 0.1412
Epoch: 2/20... Training loss: 0.1429
Epoch: 2/20... Training loss: 0.1407
Epoch: 2/20... Training loss: 0.1446
Epoch: 2/20... Training loss: 0.1432
Epoch: 2/20... Training loss: 0.1434
Epoch: 2/20... Training loss: 0.1445
Epoch: 2/20... Training loss: 0.1374
Epoch: 2/20... Training loss: 0.1382
Epoch: 2/20... Training loss: 0.1403
Epoch: 2/20... Training loss: 0.1439
Epoch: 2/20... Training loss: 0.1395
Epoch: 2/20... Training loss: 0.1353
Epoch: 2/20... Training loss: 0.1426
Epoch: 2/20... Training loss: 0.1390
Epoch: 2/20... Training loss: 0.1398
Epoch: 2/20... Training loss: 0.1439
Epoch: 2/20... Training loss: 0.1372
Epoch: 2/20... Training loss: 0.1411
Epoch: 2/20... Training loss: 0.1428
Epoch: 2/20... Training loss: 0.1403
Epoch: 2/20... Training loss: 0.1399
Epoch: 2/20... Training loss: 0.1377
Epoch: 2/20... Training loss: 0.1355
Epoch: 2/20... Training loss: 0.1377
Epoch: 2/20... Training loss: 0.1378
Epoch: 2/20... Training loss: 0.1388
Epoch: 2/20... Training loss: 0.1398
Epoch: 2/20... Training loss: 0.1446
Epoch: 2/20... Training loss: 0.1391
Epoch: 2/20... Training loss: 0.1393
Epoch: 2/20... Training loss: 0.1396
Epoch: 2/20... Training loss: 0.1347
Epoch: 2/20... Training loss: 0.1402
Epoch: 2/20... Training loss: 0.1398
Epoch: 2/20... Training loss: 0.1293
Epoch: 2/20... Training loss: 0.1350
Epoch: 2/20... Training loss: 0.1396
Epoch: 2/20... Training loss: 0.1417
Epoch: 2/20... Training loss: 0.1394
Epoch: 2/20... Training loss: 0.1395
Epoch: 2/20... Training loss: 0.1363
Epoch: 2/20... Training loss: 0.1377
Epoch: 2/20... Training loss: 0.1384
Epoch: 2/20... Training loss: 0.1397
Epoch: 2/20... Training loss: 0.1392
Epoch: 2/20... Training loss: 0.1340
Epoch: 2/20... Training loss: 0.1365
Epoch: 2/20... Training loss: 0.1397
Epoch: 2/20... Training loss: 0.1443
Epoch: 2/20... Training loss: 0.1382
Epoch: 2/20... Training loss: 0.1386
Epoch: 2/20... Training loss: 0.1358
Epoch: 2/20... Training loss: 0.1374
Epoch: 2/20... Training loss: 0.1416
Epoch: 2/20... Training loss: 0.1404
Epoch: 2/20... Training loss: 0.1374
Epoch: 2/20... Training loss: 0.1377
Epoch: 2/20... Training loss: 0.1338
Epoch: 2/20... Training loss: 0.1400
Epoch: 2/20... Training loss: 0.1326
Epoch: 2/20... Training loss: 0.1387
Epoch: 2/20... Training loss: 0.1329
Epoch: 2/20... Training loss: 0.1413
Epoch: 2/20... Training loss: 0.1324
Epoch: 2/20... Training loss: 0.1415
Epoch: 2/20... Training loss: 0.1361
Epoch: 2/20... Training loss: 0.1370
Epoch: 2/20... Training loss: 0.1345
Epoch: 2/20... Training loss: 0.1412
Epoch: 2/20... Training loss: 0.1379
Epoch: 2/20... Training loss: 0.1383
Epoch: 2/20... Training loss: 0.1357
Epoch: 2/20... Training loss: 0.1364
Epoch: 2/20... Training loss: 0.1384
Epoch: 2/20... Training loss: 0.1376
Epoch: 2/20... Training loss: 0.1406
Epoch: 2/20... Training loss: 0.1337
Epoch: 2/20... Training loss: 0.1353
Epoch: 2/20... Training loss: 0.1358
Epoch: 2/20... Training loss: 0.1327
Epoch: 2/20... Training loss: 0.1349
Epoch: 2/20... Training loss: 0.1402
Epoch: 2/20... Training loss: 0.1376
Epoch: 2/20... Training loss: 0.1324
Epoch: 2/20... Training loss: 0.1438
Epoch: 2/20... Training loss: 0.1355
Epoch: 2/20... Training loss: 0.1416
Epoch: 2/20... Training loss: 0.1410
Epoch: 2/20... Training loss: 0.1356
Epoch: 2/20... Training loss: 0.1371
Epoch: 2/20... Training loss: 0.1347
Epoch: 2/20... Training loss: 0.1384
Epoch: 2/20... Training loss: 0.1328
Epoch: 2/20... Training loss: 0.1352
Epoch: 2/20... Training loss: 0.1389
Epoch: 2/20... Training loss: 0.1364
Epoch: 2/20... Training loss: 0.1319
Epoch: 2/20... Training loss: 0.1336
Epoch: 2/20... Training loss: 0.1343
Epoch: 2/20... Training loss: 0.1365
Epoch: 2/20... Training loss: 0.1344
Epoch: 2/20... Training loss: 0.1347
Epoch: 2/20... Training loss: 0.1372
Epoch: 2/20... Training loss: 0.1372
Epoch: 2/20... Training loss: 0.1377
Epoch: 2/20... Training loss: 0.1352
Epoch: 2/20... Training loss: 0.1342
Epoch: 2/20... Training loss: 0.1369
Epoch: 2/20... Training loss: 0.1308
Epoch: 2/20... Training loss: 0.1380
Epoch: 2/20... Training loss: 0.1386
Epoch: 2/20... Training loss: 0.1340
Epoch: 3/20... Training loss: 0.1414
Epoch: 3/20... Training loss: 0.1311
Epoch: 3/20... Training loss: 0.1340
Epoch: 3/20... Training loss: 0.1335
Epoch: 3/20... Training loss: 0.1316
Epoch: 3/20... Training loss: 0.1338
Epoch: 3/20... Training loss: 0.1325
Epoch: 3/20... Training loss: 0.1339
Epoch: 3/20... Training loss: 0.1308
Epoch: 3/20... Training loss: 0.1360
Epoch: 3/20... Training loss: 0.1317
Epoch: 3/20... Training loss: 0.1313
Epoch: 3/20... Training loss: 0.1374
Epoch: 3/20... Training loss: 0.1390
Epoch: 3/20... Training loss: 0.1361
Epoch: 3/20... Training loss: 0.1345
Epoch: 3/20... Training loss: 0.1356
Epoch: 3/20... Training loss: 0.1345
Epoch: 3/20... Training loss: 0.1356
Epoch: 3/20... Training loss: 0.1328
Epoch: 3/20... Training loss: 0.1358
Epoch: 3/20... Training loss: 0.1333
Epoch: 3/20... Training loss: 0.1326
Epoch: 3/20... Training loss: 0.1314
Epoch: 3/20... Training loss: 0.1318
Epoch: 3/20... Training loss: 0.1362
Epoch: 3/20... Training loss: 0.1307
Epoch: 3/20... Training loss: 0.1290
Epoch: 3/20... Training loss: 0.1250
Epoch: 3/20... Training loss: 0.1304
Epoch: 3/20... Training loss: 0.1370
Epoch: 3/20... Training loss: 0.1305
Epoch: 3/20... Training loss: 0.1351
Epoch: 3/20... Training loss: 0.1318
Epoch: 3/20... Training loss: 0.1316
Epoch: 3/20... Training loss: 0.1354
Epoch: 3/20... Training loss: 0.1301
Epoch: 3/20... Training loss: 0.1292
Epoch: 3/20... Training loss: 0.1356
Epoch: 3/20... Training loss: 0.1301
Epoch: 3/20... Training loss: 0.1329
Epoch: 3/20... Training loss: 0.1382
Epoch: 3/20... Training loss: 0.1302
Epoch: 3/20... Training loss: 0.1364
Epoch: 3/20... Training loss: 0.1365
Epoch: 3/20... Training loss: 0.1352
Epoch: 3/20... Training loss: 0.1322
Epoch: 3/20... Training loss: 0.1314
Epoch: 3/20... Training loss: 0.1379
Epoch: 3/20... Training loss: 0.1369
Epoch: 3/20... Training loss: 0.1322
Epoch: 3/20... Training loss: 0.1287
Epoch: 3/20... Training loss: 0.1361
Epoch: 3/20... Training loss: 0.1313
Epoch: 3/20... Training loss: 0.1339
Epoch: 3/20... Training loss: 0.1310
Epoch: 3/20... Training loss: 0.1321
Epoch: 3/20... Training loss: 0.1318
Epoch: 3/20... Training loss: 0.1380
Epoch: 3/20... Training loss: 0.1327
Epoch: 3/20... Training loss: 0.1321
Epoch: 3/20... Training loss: 0.1319
Epoch: 3/20... Training loss: 0.1345
Epoch: 3/20... Training loss: 0.1318
Epoch: 3/20... Training loss: 0.1321
Epoch: 3/20... Training loss: 0.1312
Epoch: 3/20... Training loss: 0.1337
Epoch: 3/20... Training loss: 0.1336
Epoch: 3/20... Training loss: 0.1333
Epoch: 3/20... Training loss: 0.1293
Epoch: 3/20... Training loss: 0.1319
Epoch: 3/20... Training loss: 0.1265
Epoch: 3/20... Training loss: 0.1257
Epoch: 3/20... Training loss: 0.1310
Epoch: 3/20... Training loss: 0.1325
Epoch: 3/20... Training loss: 0.1353
Epoch: 3/20... Training loss: 0.1336
Epoch: 3/20... Training loss: 0.1383
Epoch: 3/20... Training loss: 0.1342
Epoch: 3/20... Training loss: 0.1322
Epoch: 3/20... Training loss: 0.1292
Epoch: 3/20... Training loss: 0.1319
Epoch: 3/20... Training loss: 0.1318
Epoch: 3/20... Training loss: 0.1313
Epoch: 3/20... Training loss: 0.1364
Epoch: 3/20... Training loss: 0.1303
Epoch: 3/20... Training loss: 0.1335
Epoch: 3/20... Training loss: 0.1298
Epoch: 3/20... Training loss: 0.1334
Epoch: 3/20... Training loss: 0.1340
Epoch: 3/20... Training loss: 0.1296
Epoch: 3/20... Training loss: 0.1357
Epoch: 3/20... Training loss: 0.1290
Epoch: 3/20... Training loss: 0.1302
Epoch: 3/20... Training loss: 0.1288
Epoch: 3/20... Training loss: 0.1324
Epoch: 3/20... Training loss: 0.1288
Epoch: 3/20... Training loss: 0.1275
Epoch: 3/20... Training loss: 0.1280
Epoch: 3/20... Training loss: 0.1295
Epoch: 3/20... Training loss: 0.1354
Epoch: 3/20... Training loss: 0.1288
Epoch: 3/20... Training loss: 0.1329
Epoch: 3/20... Training loss: 0.1300
Epoch: 3/20... Training loss: 0.1277
Epoch: 3/20... Training loss: 0.1294
Epoch: 3/20... Training loss: 0.1309
Epoch: 3/20... Training loss: 0.1305
Epoch: 3/20... Training loss: 0.1275
Epoch: 3/20... Training loss: 0.1320
Epoch: 3/20... Training loss: 0.1296
Epoch: 3/20... Training loss: 0.1343
Epoch: 3/20... Training loss: 0.1288
Epoch: 3/20... Training loss: 0.1319
Epoch: 3/20... Training loss: 0.1285
Epoch: 3/20... Training loss: 0.1318
Epoch: 3/20... Training loss: 0.1230
Epoch: 3/20... Training loss: 0.1306
Epoch: 3/20... Training loss: 0.1265
Epoch: 3/20... Training loss: 0.1253
Epoch: 3/20... Training loss: 0.1319
Epoch: 3/20... Training loss: 0.1321
Epoch: 3/20... Training loss: 0.1287
Epoch: 3/20... Training loss: 0.1267
Epoch: 3/20... Training loss: 0.1252
Epoch: 3/20... Training loss: 0.1324
Epoch: 3/20... Training loss: 0.1275
Epoch: 3/20... Training loss: 0.1316
Epoch: 3/20... Training loss: 0.1262
Epoch: 3/20... Training loss: 0.1296
Epoch: 3/20... Training loss: 0.1335
Epoch: 3/20... Training loss: 0.1319
Epoch: 3/20... Training loss: 0.1304
Epoch: 3/20... Training loss: 0.1349
Epoch: 3/20... Training loss: 0.1254
Epoch: 3/20... Training loss: 0.1251
Epoch: 3/20... Training loss: 0.1281
Epoch: 3/20... Training loss: 0.1273
Epoch: 3/20... Training loss: 0.1287
Epoch: 3/20... Training loss: 0.1264
Epoch: 3/20... Training loss: 0.1264
Epoch: 3/20... Training loss: 0.1271
Epoch: 3/20... Training loss: 0.1287
Epoch: 3/20... Training loss: 0.1268
Epoch: 3/20... Training loss: 0.1273
Epoch: 3/20... Training loss: 0.1321
Epoch: 3/20... Training loss: 0.1262
Epoch: 3/20... Training loss: 0.1323
Epoch: 3/20... Training loss: 0.1277
Epoch: 3/20... Training loss: 0.1295
Epoch: 3/20... Training loss: 0.1249
Epoch: 3/20... Training loss: 0.1238
Epoch: 3/20... Training loss: 0.1246
Epoch: 3/20... Training loss: 0.1254
Epoch: 3/20... Training loss: 0.1277
Epoch: 3/20... Training loss: 0.1259
Epoch: 3/20... Training loss: 0.1303
Epoch: 3/20... Training loss: 0.1312
Epoch: 3/20... Training loss: 0.1292
Epoch: 3/20... Training loss: 0.1272
Epoch: 3/20... Training loss: 0.1290
Epoch: 3/20... Training loss: 0.1222
Epoch: 3/20... Training loss: 0.1315
Epoch: 3/20... Training loss: 0.1297
Epoch: 3/20... Training loss: 0.1269
Epoch: 3/20... Training loss: 0.1275
Epoch: 3/20... Training loss: 0.1301
Epoch: 3/20... Training loss: 0.1261
Epoch: 3/20... Training loss: 0.1326
Epoch: 3/20... Training loss: 0.1301
Epoch: 3/20... Training loss: 0.1286
Epoch: 3/20... Training loss: 0.1288
Epoch: 3/20... Training loss: 0.1287
Epoch: 3/20... Training loss: 0.1321
Epoch: 3/20... Training loss: 0.1286
Epoch: 3/20... Training loss: 0.1261
Epoch: 3/20... Training loss: 0.1295
Epoch: 3/20... Training loss: 0.1312
Epoch: 3/20... Training loss: 0.1281
Epoch: 3/20... Training loss: 0.1263
Epoch: 3/20... Training loss: 0.1293
Epoch: 3/20... Training loss: 0.1293
Epoch: 3/20... Training loss: 0.1300
Epoch: 3/20... Training loss: 0.1314
Epoch: 3/20... Training loss: 0.1265
Epoch: 3/20... Training loss: 0.1329
Epoch: 3/20... Training loss: 0.1273
Epoch: 3/20... Training loss: 0.1289
Epoch: 3/20... Training loss: 0.1260
Epoch: 3/20... Training loss: 0.1255
Epoch: 3/20... Training loss: 0.1272
Epoch: 3/20... Training loss: 0.1294
Epoch: 3/20... Training loss: 0.1258
Epoch: 3/20... Training loss: 0.1305
Epoch: 3/20... Training loss: 0.1282
Epoch: 3/20... Training loss: 0.1282
Epoch: 3/20... Training loss: 0.1261
Epoch: 3/20... Training loss: 0.1286
Epoch: 3/20... Training loss: 0.1294
Epoch: 3/20... Training loss: 0.1295
Epoch: 3/20... Training loss: 0.1239
Epoch: 3/20... Training loss: 0.1264
Epoch: 3/20... Training loss: 0.1257
Epoch: 3/20... Training loss: 0.1275
Epoch: 3/20... Training loss: 0.1229
Epoch: 3/20... Training loss: 0.1254
Epoch: 3/20... Training loss: 0.1275
Epoch: 3/20... Training loss: 0.1254
Epoch: 3/20... Training loss: 0.1263
Epoch: 3/20... Training loss: 0.1253
Epoch: 3/20... Training loss: 0.1310
Epoch: 3/20... Training loss: 0.1266
Epoch: 3/20... Training loss: 0.1298
Epoch: 3/20... Training loss: 0.1307
Epoch: 3/20... Training loss: 0.1267
Epoch: 3/20... Training loss: 0.1293
Epoch: 3/20... Training loss: 0.1280
Epoch: 3/20... Training loss: 0.1309
Epoch: 3/20... Training loss: 0.1267
Epoch: 3/20... Training loss: 0.1259
Epoch: 3/20... Training loss: 0.1280
Epoch: 3/20... Training loss: 0.1261
Epoch: 3/20... Training loss: 0.1259
Epoch: 3/20... Training loss: 0.1283
Epoch: 3/20... Training loss: 0.1262
Epoch: 3/20... Training loss: 0.1288
Epoch: 3/20... Training loss: 0.1318
Epoch: 3/20... Training loss: 0.1284
Epoch: 3/20... Training loss: 0.1244
Epoch: 3/20... Training loss: 0.1287
Epoch: 3/20... Training loss: 0.1268
Epoch: 3/20... Training loss: 0.1264
Epoch: 3/20... Training loss: 0.1301
Epoch: 3/20... Training loss: 0.1313
Epoch: 3/20... Training loss: 0.1244
Epoch: 3/20... Training loss: 0.1282
Epoch: 3/20... Training loss: 0.1305
Epoch: 3/20... Training loss: 0.1268
Epoch: 3/20... Training loss: 0.1320
Epoch: 3/20... Training loss: 0.1228
Epoch: 3/20... Training loss: 0.1236
Epoch: 3/20... Training loss: 0.1275
Epoch: 3/20... Training loss: 0.1240
Epoch: 3/20... Training loss: 0.1305
Epoch: 3/20... Training loss: 0.1265
Epoch: 3/20... Training loss: 0.1252
Epoch: 3/20... Training loss: 0.1267
Epoch: 3/20... Training loss: 0.1308
Epoch: 3/20... Training loss: 0.1295
Epoch: 3/20... Training loss: 0.1335
Epoch: 3/20... Training loss: 0.1223
Epoch: 3/20... Training loss: 0.1270
Epoch: 3/20... Training loss: 0.1316
Epoch: 3/20... Training loss: 0.1279
Epoch: 3/20... Training loss: 0.1259
Epoch: 3/20... Training loss: 0.1265
Epoch: 3/20... Training loss: 0.1292
Epoch: 3/20... Training loss: 0.1222
Epoch: 3/20... Training loss: 0.1219
Epoch: 3/20... Training loss: 0.1259
Epoch: 3/20... Training loss: 0.1252
Epoch: 3/20... Training loss: 0.1234
Epoch: 3/20... Training loss: 0.1293
Epoch: 3/20... Training loss: 0.1233
Epoch: 3/20... Training loss: 0.1205
Epoch: 3/20... Training loss: 0.1264
Epoch: 3/20... Training loss: 0.1263
Epoch: 3/20... Training loss: 0.1233
Epoch: 3/20... Training loss: 0.1239
Epoch: 3/20... Training loss: 0.1257
Epoch: 3/20... Training loss: 0.1242
Epoch: 3/20... Training loss: 0.1263
Epoch: 3/20... Training loss: 0.1249
Epoch: 3/20... Training loss: 0.1263
Epoch: 3/20... Training loss: 0.1292
Epoch: 3/20... Training loss: 0.1366
Epoch: 3/20... Training loss: 0.1284
Epoch: 3/20... Training loss: 0.1238
Epoch: 3/20... Training loss: 0.1277
Epoch: 3/20... Training loss: 0.1260
Epoch: 3/20... Training loss: 0.1231
Epoch: 3/20... Training loss: 0.1270
Epoch: 3/20... Training loss: 0.1273
Epoch: 3/20... Training loss: 0.1198
Epoch: 3/20... Training loss: 0.1269
Epoch: 3/20... Training loss: 0.1291
Epoch: 3/20... Training loss: 0.1264
Epoch: 3/20... Training loss: 0.1259
Epoch: 3/20... Training loss: 0.1227
Epoch: 3/20... Training loss: 0.1242
Epoch: 3/20... Training loss: 0.1297
Epoch: 3/20... Training loss: 0.1319
Epoch: 3/20... Training loss: 0.1259
Epoch: 3/20... Training loss: 0.1240
Epoch: 3/20... Training loss: 0.1291
Epoch: 3/20... Training loss: 0.1214
Epoch: 3/20... Training loss: 0.1245
Epoch: 3/20... Training loss: 0.1268
Epoch: 3/20... Training loss: 0.1286
Epoch: 3/20... Training loss: 0.1253
Epoch: 4/20... Training loss: 0.1287
Epoch: 4/20... Training loss: 0.1277
Epoch: 4/20... Training loss: 0.1232
Epoch: 4/20... Training loss: 0.1231
Epoch: 4/20... Training loss: 0.1284
Epoch: 4/20... Training loss: 0.1255
Epoch: 4/20... Training loss: 0.1201
Epoch: 4/20... Training loss: 0.1259
Epoch: 4/20... Training loss: 0.1261
Epoch: 4/20... Training loss: 0.1286
Epoch: 4/20... Training loss: 0.1259
Epoch: 4/20... Training loss: 0.1244
Epoch: 4/20... Training loss: 0.1242
Epoch: 4/20... Training loss: 0.1259
Epoch: 4/20... Training loss: 0.1233
Epoch: 4/20... Training loss: 0.1231
Epoch: 4/20... Training loss: 0.1263
Epoch: 4/20... Training loss: 0.1249
Epoch: 4/20... Training loss: 0.1225
Epoch: 4/20... Training loss: 0.1244
Epoch: 4/20... Training loss: 0.1259
Epoch: 4/20... Training loss: 0.1290
Epoch: 4/20... Training loss: 0.1229
Epoch: 4/20... Training loss: 0.1264
Epoch: 4/20... Training loss: 0.1199
Epoch: 4/20... Training loss: 0.1277
Epoch: 4/20... Training loss: 0.1237
Epoch: 4/20... Training loss: 0.1227
Epoch: 4/20... Training loss: 0.1286
Epoch: 4/20... Training loss: 0.1270
Epoch: 4/20... Training loss: 0.1251
Epoch: 4/20... Training loss: 0.1246
Epoch: 4/20... Training loss: 0.1228
Epoch: 4/20... Training loss: 0.1264
Epoch: 4/20... Training loss: 0.1269
Epoch: 4/20... Training loss: 0.1278
Epoch: 4/20... Training loss: 0.1281
Epoch: 4/20... Training loss: 0.1248
Epoch: 4/20... Training loss: 0.1236
Epoch: 4/20... Training loss: 0.1250
Epoch: 4/20... Training loss: 0.1207
Epoch: 4/20... Training loss: 0.1220
Epoch: 4/20... Training loss: 0.1219
Epoch: 4/20... Training loss: 0.1252
Epoch: 4/20... Training loss: 0.1260
Epoch: 4/20... Training loss: 0.1264
Epoch: 4/20... Training loss: 0.1238
Epoch: 4/20... Training loss: 0.1253
Epoch: 4/20... Training loss: 0.1281
Epoch: 4/20... Training loss: 0.1258
Epoch: 4/20... Training loss: 0.1264
Epoch: 4/20... Training loss: 0.1201
Epoch: 4/20... Training loss: 0.1294
Epoch: 4/20... Training loss: 0.1273
Epoch: 4/20... Training loss: 0.1213
Epoch: 4/20... Training loss: 0.1235
Epoch: 4/20... Training loss: 0.1189
Epoch: 4/20... Training loss: 0.1195
Epoch: 4/20... Training loss: 0.1209
Epoch: 4/20... Training loss: 0.1279
Epoch: 4/20... Training loss: 0.1228
Epoch: 4/20... Training loss: 0.1234
Epoch: 4/20... Training loss: 0.1221
Epoch: 4/20... Training loss: 0.1208
Epoch: 4/20... Training loss: 0.1207
Epoch: 4/20... Training loss: 0.1285
Epoch: 4/20... Training loss: 0.1275
Epoch: 4/20... Training loss: 0.1229
Epoch: 4/20... Training loss: 0.1228
Epoch: 4/20... Training loss: 0.1185
Epoch: 4/20... Training loss: 0.1233
Epoch: 4/20... Training loss: 0.1228
Epoch: 4/20... Training loss: 0.1257
Epoch: 4/20... Training loss: 0.1222
Epoch: 4/20... Training loss: 0.1217
Epoch: 4/20... Training loss: 0.1269
Epoch: 4/20... Training loss: 0.1283
Epoch: 4/20... Training loss: 0.1213
Epoch: 4/20... Training loss: 0.1232
Epoch: 4/20... Training loss: 0.1237
Epoch: 4/20... Training loss: 0.1245
Epoch: 4/20... Training loss: 0.1183
Epoch: 4/20... Training loss: 0.1248
Epoch: 4/20... Training loss: 0.1240
Epoch: 4/20... Training loss: 0.1242
Epoch: 4/20... Training loss: 0.1198
Epoch: 4/20... Training loss: 0.1185
Epoch: 4/20... Training loss: 0.1248
Epoch: 4/20... Training loss: 0.1194
Epoch: 4/20... Training loss: 0.1240
Epoch: 4/20... Training loss: 0.1261
Epoch: 4/20... Training loss: 0.1230
Epoch: 4/20... Training loss: 0.1190
Epoch: 4/20... Training loss: 0.1274
Epoch: 4/20... Training loss: 0.1199
Epoch: 4/20... Training loss: 0.1239
Epoch: 4/20... Training loss: 0.1239
Epoch: 4/20... Training loss: 0.1287
Epoch: 4/20... Training loss: 0.1195
Epoch: 4/20... Training loss: 0.1193
Epoch: 4/20... Training loss: 0.1259
Epoch: 4/20... Training loss: 0.1263
Epoch: 4/20... Training loss: 0.1168
Epoch: 4/20... Training loss: 0.1225
Epoch: 4/20... Training loss: 0.1247
Epoch: 4/20... Training loss: 0.1200
Epoch: 4/20... Training loss: 0.1215
Epoch: 4/20... Training loss: 0.1193
Epoch: 4/20... Training loss: 0.1200
Epoch: 4/20... Training loss: 0.1240
Epoch: 4/20... Training loss: 0.1194
Epoch: 4/20... Training loss: 0.1281
Epoch: 4/20... Training loss: 0.1246
Epoch: 4/20... Training loss: 0.1231
Epoch: 4/20... Training loss: 0.1226
Epoch: 4/20... Training loss: 0.1205
Epoch: 4/20... Training loss: 0.1225
Epoch: 4/20... Training loss: 0.1219
Epoch: 4/20... Training loss: 0.1228
Epoch: 4/20... Training loss: 0.1275
Epoch: 4/20... Training loss: 0.1236
Epoch: 4/20... Training loss: 0.1182
Epoch: 4/20... Training loss: 0.1211
Epoch: 4/20... Training loss: 0.1203
Epoch: 4/20... Training loss: 0.1184
Epoch: 4/20... Training loss: 0.1199
Epoch: 4/20... Training loss: 0.1231
Epoch: 4/20... Training loss: 0.1193
Epoch: 4/20... Training loss: 0.1218
Epoch: 4/20... Training loss: 0.1207
Epoch: 4/20... Training loss: 0.1215
Epoch: 4/20... Training loss: 0.1246
Epoch: 4/20... Training loss: 0.1263
Epoch: 4/20... Training loss: 0.1219
Epoch: 4/20... Training loss: 0.1228
Epoch: 4/20... Training loss: 0.1166
Epoch: 4/20... Training loss: 0.1220
Epoch: 4/20... Training loss: 0.1219
Epoch: 4/20... Training loss: 0.1220
Epoch: 4/20... Training loss: 0.1251
Epoch: 4/20... Training loss: 0.1199
Epoch: 4/20... Training loss: 0.1198
Epoch: 4/20... Training loss: 0.1199
Epoch: 4/20... Training loss: 0.1228
Epoch: 4/20... Training loss: 0.1208
Epoch: 4/20... Training loss: 0.1226
Epoch: 4/20... Training loss: 0.1220
Epoch: 4/20... Training loss: 0.1252
Epoch: 4/20... Training loss: 0.1246
Epoch: 4/20... Training loss: 0.1234
Epoch: 4/20... Training loss: 0.1191
Epoch: 4/20... Training loss: 0.1251
Epoch: 4/20... Training loss: 0.1240
Epoch: 4/20... Training loss: 0.1214
Epoch: 4/20... Training loss: 0.1235
Epoch: 4/20... Training loss: 0.1243
Epoch: 4/20... Training loss: 0.1155
Epoch: 4/20... Training loss: 0.1229
Epoch: 4/20... Training loss: 0.1194
Epoch: 4/20... Training loss: 0.1271
Epoch: 4/20... Training loss: 0.1228
Epoch: 4/20... Training loss: 0.1222
Epoch: 4/20... Training loss: 0.1224
Epoch: 4/20... Training loss: 0.1157
Epoch: 4/20... Training loss: 0.1255
Epoch: 4/20... Training loss: 0.1224
Epoch: 4/20... Training loss: 0.1239
Epoch: 4/20... Training loss: 0.1211
Epoch: 4/20... Training loss: 0.1220
Epoch: 4/20... Training loss: 0.1170
Epoch: 4/20... Training loss: 0.1198
Epoch: 4/20... Training loss: 0.1212
Epoch: 4/20... Training loss: 0.1196
Epoch: 4/20... Training loss: 0.1179
Epoch: 4/20... Training loss: 0.1201
Epoch: 4/20... Training loss: 0.1240
Epoch: 4/20... Training loss: 0.1145
Epoch: 4/20... Training loss: 0.1222
Epoch: 4/20... Training loss: 0.1188
Epoch: 4/20... Training loss: 0.1175
Epoch: 4/20... Training loss: 0.1223
Epoch: 4/20... Training loss: 0.1231
Epoch: 4/20... Training loss: 0.1209
Epoch: 4/20... Training loss: 0.1206
Epoch: 4/20... Training loss: 0.1222
Epoch: 4/20... Training loss: 0.1181
Epoch: 4/20... Training loss: 0.1177
Epoch: 4/20... Training loss: 0.1229
Epoch: 4/20... Training loss: 0.1231
Epoch: 4/20... Training loss: 0.1212
Epoch: 4/20... Training loss: 0.1146
Epoch: 4/20... Training loss: 0.1174
Epoch: 4/20... Training loss: 0.1221
Epoch: 4/20... Training loss: 0.1226
Epoch: 4/20... Training loss: 0.1238
Epoch: 4/20... Training loss: 0.1191
Epoch: 4/20... Training loss: 0.1225
Epoch: 4/20... Training loss: 0.1251
Epoch: 4/20... Training loss: 0.1218
Epoch: 4/20... Training loss: 0.1212
Epoch: 4/20... Training loss: 0.1205
Epoch: 4/20... Training loss: 0.1226
Epoch: 4/20... Training loss: 0.1208
Epoch: 4/20... Training loss: 0.1170
Epoch: 4/20... Training loss: 0.1215
Epoch: 4/20... Training loss: 0.1169
Epoch: 4/20... Training loss: 0.1126
Epoch: 4/20... Training loss: 0.1202
Epoch: 4/20... Training loss: 0.1243
Epoch: 4/20... Training loss: 0.1232
Epoch: 4/20... Training loss: 0.1225
Epoch: 4/20... Training loss: 0.1222
Epoch: 4/20... Training loss: 0.1236
Epoch: 4/20... Training loss: 0.1208
Epoch: 4/20... Training loss: 0.1254
Epoch: 4/20... Training loss: 0.1207
Epoch: 4/20... Training loss: 0.1233
Epoch: 4/20... Training loss: 0.1227
Epoch: 4/20... Training loss: 0.1173
Epoch: 4/20... Training loss: 0.1233
Epoch: 4/20... Training loss: 0.1221
Epoch: 4/20... Training loss: 0.1239
Epoch: 4/20... Training loss: 0.1254
Epoch: 4/20... Training loss: 0.1207
Epoch: 4/20... Training loss: 0.1220
Epoch: 4/20... Training loss: 0.1208
Epoch: 4/20... Training loss: 0.1221
Epoch: 4/20... Training loss: 0.1213
Epoch: 4/20... Training loss: 0.1263
Epoch: 4/20... Training loss: 0.1217
Epoch: 4/20... Training loss: 0.1229
Epoch: 4/20... Training loss: 0.1213
Epoch: 4/20... Training loss: 0.1224
Epoch: 4/20... Training loss: 0.1208
Epoch: 4/20... Training loss: 0.1181
Epoch: 4/20... Training loss: 0.1206
Epoch: 4/20... Training loss: 0.1176
Epoch: 4/20... Training loss: 0.1166
Epoch: 4/20... Training loss: 0.1213
Epoch: 4/20... Training loss: 0.1197
Epoch: 4/20... Training loss: 0.1225
Epoch: 4/20... Training loss: 0.1248
Epoch: 4/20... Training loss: 0.1193
Epoch: 4/20... Training loss: 0.1192
Epoch: 4/20... Training loss: 0.1216
Epoch: 4/20... Training loss: 0.1180
Epoch: 4/20... Training loss: 0.1205
Epoch: 4/20... Training loss: 0.1203
Epoch: 4/20... Training loss: 0.1201
Epoch: 4/20... Training loss: 0.1223
Epoch: 4/20... Training loss: 0.1210
Epoch: 4/20... Training loss: 0.1232
Epoch: 4/20... Training loss: 0.1161
Epoch: 4/20... Training loss: 0.1194
Epoch: 4/20... Training loss: 0.1229
Epoch: 4/20... Training loss: 0.1210
Epoch: 4/20... Training loss: 0.1187
Epoch: 4/20... Training loss: 0.1210
Epoch: 4/20... Training loss: 0.1237
Epoch: 4/20... Training loss: 0.1187
Epoch: 4/20... Training loss: 0.1195
Epoch: 4/20... Training loss: 0.1234
Epoch: 4/20... Training loss: 0.1257
Epoch: 4/20... Training loss: 0.1218
Epoch: 4/20... Training loss: 0.1200
Epoch: 4/20... Training loss: 0.1189
Epoch: 4/20... Training loss: 0.1180
Epoch: 4/20... Training loss: 0.1210
Epoch: 4/20... Training loss: 0.1157
Epoch: 4/20... Training loss: 0.1223
Epoch: 4/20... Training loss: 0.1243
Epoch: 4/20... Training loss: 0.1173
Epoch: 4/20... Training loss: 0.1186
Epoch: 4/20... Training loss: 0.1181
Epoch: 4/20... Training loss: 0.1222
Epoch: 4/20... Training loss: 0.1241
Epoch: 4/20... Training loss: 0.1210
Epoch: 4/20... Training loss: 0.1168
Epoch: 4/20... Training loss: 0.1201
Epoch: 4/20... Training loss: 0.1190
Epoch: 4/20... Training loss: 0.1179
Epoch: 4/20... Training loss: 0.1191
Epoch: 4/20... Training loss: 0.1177
Epoch: 4/20... Training loss: 0.1193
Epoch: 4/20... Training loss: 0.1208
Epoch: 4/20... Training loss: 0.1173
Epoch: 4/20... Training loss: 0.1195
Epoch: 4/20... Training loss: 0.1177
Epoch: 4/20... Training loss: 0.1208
Epoch: 4/20... Training loss: 0.1232
Epoch: 4/20... Training loss: 0.1157
Epoch: 4/20... Training loss: 0.1267
Epoch: 4/20... Training loss: 0.1219
Epoch: 4/20... Training loss: 0.1205
Epoch: 4/20... Training loss: 0.1197
Epoch: 4/20... Training loss: 0.1173
Epoch: 4/20... Training loss: 0.1193
Epoch: 4/20... Training loss: 0.1212
Epoch: 4/20... Training loss: 0.1221
Epoch: 4/20... Training loss: 0.1165
Epoch: 5/20... Training loss: 0.1218
Epoch: 5/20... Training loss: 0.1206
Epoch: 5/20... Training loss: 0.1189
Epoch: 5/20... Training loss: 0.1168
Epoch: 5/20... Training loss: 0.1216
Epoch: 5/20... Training loss: 0.1211
Epoch: 5/20... Training loss: 0.1147
Epoch: 5/20... Training loss: 0.1206
Epoch: 5/20... Training loss: 0.1219
Epoch: 5/20... Training loss: 0.1211
Epoch: 5/20... Training loss: 0.1217
Epoch: 5/20... Training loss: 0.1174
Epoch: 5/20... Training loss: 0.1224
Epoch: 5/20... Training loss: 0.1161
Epoch: 5/20... Training loss: 0.1130
Epoch: 5/20... Training loss: 0.1169
Epoch: 5/20... Training loss: 0.1189
Epoch: 5/20... Training loss: 0.1171
Epoch: 5/20... Training loss: 0.1140
Epoch: 5/20... Training loss: 0.1150
Epoch: 5/20... Training loss: 0.1201
Epoch: 5/20... Training loss: 0.1194
Epoch: 5/20... Training loss: 0.1191
Epoch: 5/20... Training loss: 0.1163
Epoch: 5/20... Training loss: 0.1189
Epoch: 5/20... Training loss: 0.1172
Epoch: 5/20... Training loss: 0.1211
Epoch: 5/20... Training loss: 0.1197
Epoch: 5/20... Training loss: 0.1185
Epoch: 5/20... Training loss: 0.1142
Epoch: 5/20... Training loss: 0.1207
Epoch: 5/20... Training loss: 0.1175
Epoch: 5/20... Training loss: 0.1203
Epoch: 5/20... Training loss: 0.1206
Epoch: 5/20... Training loss: 0.1227
Epoch: 5/20... Training loss: 0.1207
Epoch: 5/20... Training loss: 0.1194
Epoch: 5/20... Training loss: 0.1162
Epoch: 5/20... Training loss: 0.1171
Epoch: 5/20... Training loss: 0.1157
Epoch: 5/20... Training loss: 0.1176
Epoch: 5/20... Training loss: 0.1180
Epoch: 5/20... Training loss: 0.1163
Epoch: 5/20... Training loss: 0.1243
Epoch: 5/20... Training loss: 0.1182
Epoch: 5/20... Training loss: 0.1192
Epoch: 5/20... Training loss: 0.1146
Epoch: 5/20... Training loss: 0.1167
Epoch: 5/20... Training loss: 0.1214
Epoch: 5/20... Training loss: 0.1203
Epoch: 5/20... Training loss: 0.1165
Epoch: 5/20... Training loss: 0.1215
Epoch: 5/20... Training loss: 0.1137
Epoch: 5/20... Training loss: 0.1167
Epoch: 5/20... Training loss: 0.1193
Epoch: 5/20... Training loss: 0.1147
Epoch: 5/20... Training loss: 0.1211
Epoch: 5/20... Training loss: 0.1180
Epoch: 5/20... Training loss: 0.1166
Epoch: 5/20... Training loss: 0.1141
Epoch: 5/20... Training loss: 0.1190
Epoch: 5/20... Training loss: 0.1173
Epoch: 5/20... Training loss: 0.1174
Epoch: 5/20... Training loss: 0.1128
Epoch: 5/20... Training loss: 0.1219
Epoch: 5/20... Training loss: 0.1204
Epoch: 5/20... Training loss: 0.1166
Epoch: 5/20... Training loss: 0.1179
Epoch: 5/20... Training loss: 0.1206
Epoch: 5/20... Training loss: 0.1225
Epoch: 5/20... Training loss: 0.1231
Epoch: 5/20... Training loss: 0.1190
Epoch: 5/20... Training loss: 0.1204
Epoch: 5/20... Training loss: 0.1175
Epoch: 5/20... Training loss: 0.1136
Epoch: 5/20... Training loss: 0.1204
Epoch: 5/20... Training loss: 0.1196
Epoch: 5/20... Training loss: 0.1211
Epoch: 5/20... Training loss: 0.1173
Epoch: 5/20... Training loss: 0.1153
Epoch: 5/20... Training loss: 0.1161
Epoch: 5/20... Training loss: 0.1184
Epoch: 5/20... Training loss: 0.1198
Epoch: 5/20... Training loss: 0.1211
Epoch: 5/20... Training loss: 0.1180
Epoch: 5/20... Training loss: 0.1185
Epoch: 5/20... Training loss: 0.1183
Epoch: 5/20... Training loss: 0.1109
Epoch: 5/20... Training loss: 0.1147
Epoch: 5/20... Training loss: 0.1140
Epoch: 5/20... Training loss: 0.1148
Epoch: 5/20... Training loss: 0.1199
Epoch: 5/20... Training loss: 0.1211
Epoch: 5/20... Training loss: 0.1207
Epoch: 5/20... Training loss: 0.1163
Epoch: 5/20... Training loss: 0.1197
Epoch: 5/20... Training loss: 0.1240
Epoch: 5/20... Training loss: 0.1190
Epoch: 5/20... Training loss: 0.1196
Epoch: 5/20... Training loss: 0.1190
Epoch: 5/20... Training loss: 0.1188
Epoch: 5/20... Training loss: 0.1166
Epoch: 5/20... Training loss: 0.1171
Epoch: 5/20... Training loss: 0.1207
Epoch: 5/20... Training loss: 0.1167
Epoch: 5/20... Training loss: 0.1195
Epoch: 5/20... Training loss: 0.1192
Epoch: 5/20... Training loss: 0.1182
Epoch: 5/20... Training loss: 0.1155
Epoch: 5/20... Training loss: 0.1149
Epoch: 5/20... Training loss: 0.1178
Epoch: 5/20... Training loss: 0.1180
Epoch: 5/20... Training loss: 0.1169
Epoch: 5/20... Training loss: 0.1197
Epoch: 5/20... Training loss: 0.1185
Epoch: 5/20... Training loss: 0.1169
Epoch: 5/20... Training loss: 0.1161
Epoch: 5/20... Training loss: 0.1208
Epoch: 5/20... Training loss: 0.1135
Epoch: 5/20... Training loss: 0.1212
Epoch: 5/20... Training loss: 0.1176
Epoch: 5/20... Training loss: 0.1146
Epoch: 5/20... Training loss: 0.1186
Epoch: 5/20... Training loss: 0.1138
Epoch: 5/20... Training loss: 0.1152
Epoch: 5/20... Training loss: 0.1184
Epoch: 5/20... Training loss: 0.1194
Epoch: 5/20... Training loss: 0.1188
Epoch: 5/20... Training loss: 0.1187
Epoch: 5/20... Training loss: 0.1172
Epoch: 5/20... Training loss: 0.1199
Epoch: 5/20... Training loss: 0.1129
Epoch: 5/20... Training loss: 0.1181
Epoch: 5/20... Training loss: 0.1169
Epoch: 5/20... Training loss: 0.1156
Epoch: 5/20... Training loss: 0.1154
Epoch: 5/20... Training loss: 0.1172
Epoch: 5/20... Training loss: 0.1194
Epoch: 5/20... Training loss: 0.1136
Epoch: 5/20... Training loss: 0.1178
Epoch: 5/20... Training loss: 0.1141
Epoch: 5/20... Training loss: 0.1130
Epoch: 5/20... Training loss: 0.1144
Epoch: 5/20... Training loss: 0.1141
Epoch: 5/20... Training loss: 0.1207
Epoch: 5/20... Training loss: 0.1199
Epoch: 5/20... Training loss: 0.1168
Epoch: 5/20... Training loss: 0.1153
Epoch: 5/20... Training loss: 0.1149
Epoch: 5/20... Training loss: 0.1138
Epoch: 5/20... Training loss: 0.1175
Epoch: 5/20... Training loss: 0.1249
Epoch: 5/20... Training loss: 0.1181
Epoch: 5/20... Training loss: 0.1158
Epoch: 5/20... Training loss: 0.1137
Epoch: 5/20... Training loss: 0.1187
Epoch: 5/20... Training loss: 0.1128
Epoch: 5/20... Training loss: 0.1215
Epoch: 5/20... Training loss: 0.1153
Epoch: 5/20... Training loss: 0.1165
Epoch: 5/20... Training loss: 0.1149
Epoch: 5/20... Training loss: 0.1188
Epoch: 5/20... Training loss: 0.1158
Epoch: 5/20... Training loss: 0.1200
Epoch: 5/20... Training loss: 0.1182
Epoch: 5/20... Training loss: 0.1150
Epoch: 5/20... Training loss: 0.1179
Epoch: 5/20... Training loss: 0.1172
Epoch: 5/20... Training loss: 0.1168
Epoch: 5/20... Training loss: 0.1152
Epoch: 5/20... Training loss: 0.1207
Epoch: 5/20... Training loss: 0.1158
Epoch: 5/20... Training loss: 0.1202
Epoch: 5/20... Training loss: 0.1147
Epoch: 5/20... Training loss: 0.1168
Epoch: 5/20... Training loss: 0.1161
Epoch: 5/20... Training loss: 0.1157
Epoch: 5/20... Training loss: 0.1143
Epoch: 5/20... Training loss: 0.1114
Epoch: 5/20... Training loss: 0.1153
Epoch: 5/20... Training loss: 0.1215
Epoch: 5/20... Training loss: 0.1176
Epoch: 5/20... Training loss: 0.1151
Epoch: 5/20... Training loss: 0.1189
Epoch: 5/20... Training loss: 0.1161
Epoch: 5/20... Training loss: 0.1163
Epoch: 5/20... Training loss: 0.1156
Epoch: 5/20... Training loss: 0.1169
Epoch: 5/20... Training loss: 0.1142
Epoch: 5/20... Training loss: 0.1115
Epoch: 5/20... Training loss: 0.1200
Epoch: 5/20... Training loss: 0.1160
Epoch: 5/20... Training loss: 0.1187
Epoch: 5/20... Training loss: 0.1169
Epoch: 5/20... Training loss: 0.1153
Epoch: 5/20... Training loss: 0.1159
Epoch: 5/20... Training loss: 0.1168
Epoch: 5/20... Training loss: 0.1161
Epoch: 5/20... Training loss: 0.1169
Epoch: 5/20... Training loss: 0.1133
Epoch: 5/20... Training loss: 0.1153
Epoch: 5/20... Training loss: 0.1206
Epoch: 5/20... Training loss: 0.1206
Epoch: 5/20... Training loss: 0.1162
Epoch: 5/20... Training loss: 0.1158
Epoch: 5/20... Training loss: 0.1213
Epoch: 5/20... Training loss: 0.1164
Epoch: 5/20... Training loss: 0.1166
Epoch: 5/20... Training loss: 0.1164
Epoch: 5/20... Training loss: 0.1162
Epoch: 5/20... Training loss: 0.1185
Epoch: 5/20... Training loss: 0.1157
Epoch: 5/20... Training loss: 0.1143
Epoch: 5/20... Training loss: 0.1135
Epoch: 5/20... Training loss: 0.1203
Epoch: 5/20... Training loss: 0.1162
Epoch: 5/20... Training loss: 0.1160
Epoch: 5/20... Training loss: 0.1218
Epoch: 5/20... Training loss: 0.1155
Epoch: 5/20... Training loss: 0.1153
Epoch: 5/20... Training loss: 0.1173
Epoch: 5/20... Training loss: 0.1161
Epoch: 5/20... Training loss: 0.1140
Epoch: 5/20... Training loss: 0.1168
Epoch: 5/20... Training loss: 0.1142
Epoch: 5/20... Training loss: 0.1144
Epoch: 5/20... Training loss: 0.1138
Epoch: 5/20... Training loss: 0.1172
Epoch: 5/20... Training loss: 0.1214
Epoch: 5/20... Training loss: 0.1144
Epoch: 5/20... Training loss: 0.1155
Epoch: 5/20... Training loss: 0.1179
Epoch: 5/20... Training loss: 0.1165
Epoch: 5/20... Training loss: 0.1167
Epoch: 5/20... Training loss: 0.1132
Epoch: 5/20... Training loss: 0.1154
Epoch: 5/20... Training loss: 0.1131
Epoch: 5/20... Training loss: 0.1158
Epoch: 5/20... Training loss: 0.1187
Epoch: 5/20... Training loss: 0.1138
Epoch: 5/20... Training loss: 0.1175
Epoch: 5/20... Training loss: 0.1159
Epoch: 5/20... Training loss: 0.1158
Epoch: 5/20... Training loss: 0.1169
Epoch: 5/20... Training loss: 0.1212
Epoch: 5/20... Training loss: 0.1152
Epoch: 5/20... Training loss: 0.1190
Epoch: 5/20... Training loss: 0.1177
Epoch: 5/20... Training loss: 0.1136
Epoch: 5/20... Training loss: 0.1073
Epoch: 5/20... Training loss: 0.1156
Epoch: 5/20... Training loss: 0.1146
Epoch: 5/20... Training loss: 0.1168
Epoch: 5/20... Training loss: 0.1137
Epoch: 5/20... Training loss: 0.1154
Epoch: 5/20... Training loss: 0.1171
Epoch: 5/20... Training loss: 0.1224
Epoch: 5/20... Training loss: 0.1197
Epoch: 5/20... Training loss: 0.1155
Epoch: 5/20... Training loss: 0.1183
Epoch: 5/20... Training loss: 0.1158
Epoch: 5/20... Training loss: 0.1143
Epoch: 5/20... Training loss: 0.1132
Epoch: 5/20... Training loss: 0.1125
Epoch: 5/20... Training loss: 0.1170
Epoch: 5/20... Training loss: 0.1152
Epoch: 5/20... Training loss: 0.1132
Epoch: 5/20... Training loss: 0.1151
Epoch: 5/20... Training loss: 0.1126
Epoch: 5/20... Training loss: 0.1166
Epoch: 5/20... Training loss: 0.1143
Epoch: 5/20... Training loss: 0.1187
Epoch: 5/20... Training loss: 0.1138
Epoch: 5/20... Training loss: 0.1188
Epoch: 5/20... Training loss: 0.1127
Epoch: 5/20... Training loss: 0.1180
Epoch: 5/20... Training loss: 0.1181
Epoch: 5/20... Training loss: 0.1200
Epoch: 5/20... Training loss: 0.1140
Epoch: 5/20... Training loss: 0.1151
Epoch: 5/20... Training loss: 0.1181
Epoch: 5/20... Training loss: 0.1178
Epoch: 5/20... Training loss: 0.1161
Epoch: 5/20... Training loss: 0.1142
Epoch: 5/20... Training loss: 0.1178
Epoch: 5/20... Training loss: 0.1156
Epoch: 5/20... Training loss: 0.1162
Epoch: 5/20... Training loss: 0.1127
Epoch: 5/20... Training loss: 0.1142
Epoch: 5/20... Training loss: 0.1127
Epoch: 5/20... Training loss: 0.1216
Epoch: 5/20... Training loss: 0.1148
Epoch: 5/20... Training loss: 0.1140
Epoch: 5/20... Training loss: 0.1143
Epoch: 5/20... Training loss: 0.1162
Epoch: 5/20... Training loss: 0.1163
Epoch: 5/20... Training loss: 0.1125
Epoch: 5/20... Training loss: 0.1156
Epoch: 5/20... Training loss: 0.1166
Epoch: 5/20... Training loss: 0.1108
Epoch: 6/20... Training loss: 0.1193
Epoch: 6/20... Training loss: 0.1121
Epoch: 6/20... Training loss: 0.1155
Epoch: 6/20... Training loss: 0.1144
Epoch: 6/20... Training loss: 0.1136
Epoch: 6/20... Training loss: 0.1134
Epoch: 6/20... Training loss: 0.1170
Epoch: 6/20... Training loss: 0.1118
Epoch: 6/20... Training loss: 0.1147
Epoch: 6/20... Training loss: 0.1171
Epoch: 6/20... Training loss: 0.1139
Epoch: 6/20... Training loss: 0.1165
Epoch: 6/20... Training loss: 0.1168
Epoch: 6/20... Training loss: 0.1159
Epoch: 6/20... Training loss: 0.1156
Epoch: 6/20... Training loss: 0.1170
Epoch: 6/20... Training loss: 0.1165
Epoch: 6/20... Training loss: 0.1127
Epoch: 6/20... Training loss: 0.1188
Epoch: 6/20... Training loss: 0.1091
Epoch: 6/20... Training loss: 0.1161
Epoch: 6/20... Training loss: 0.1094
Epoch: 6/20... Training loss: 0.1150
Epoch: 6/20... Training loss: 0.1129
Epoch: 6/20... Training loss: 0.1179
Epoch: 6/20... Training loss: 0.1108
Epoch: 6/20... Training loss: 0.1122
Epoch: 6/20... Training loss: 0.1169
Epoch: 6/20... Training loss: 0.1129
Epoch: 6/20... Training loss: 0.1126
Epoch: 6/20... Training loss: 0.1156
Epoch: 6/20... Training loss: 0.1175
Epoch: 6/20... Training loss: 0.1122
Epoch: 6/20... Training loss: 0.1137
Epoch: 6/20... Training loss: 0.1135
Epoch: 6/20... Training loss: 0.1138
Epoch: 6/20... Training loss: 0.1122
Epoch: 6/20... Training loss: 0.1202
Epoch: 6/20... Training loss: 0.1151
Epoch: 6/20... Training loss: 0.1158
Epoch: 6/20... Training loss: 0.1120
Epoch: 6/20... Training loss: 0.1084
Epoch: 6/20... Training loss: 0.1120
Epoch: 6/20... Training loss: 0.1131
Epoch: 6/20... Training loss: 0.1161
Epoch: 6/20... Training loss: 0.1157
Epoch: 6/20... Training loss: 0.1149
Epoch: 6/20... Training loss: 0.1152
Epoch: 6/20... Training loss: 0.1119
Epoch: 6/20... Training loss: 0.1137
Epoch: 6/20... Training loss: 0.1147
Epoch: 6/20... Training loss: 0.1172
Epoch: 6/20... Training loss: 0.1151
Epoch: 6/20... Training loss: 0.1172
Epoch: 6/20... Training loss: 0.1134
Epoch: 6/20... Training loss: 0.1147
Epoch: 6/20... Training loss: 0.1177
Epoch: 6/20... Training loss: 0.1137
Epoch: 6/20... Training loss: 0.1155
Epoch: 6/20... Training loss: 0.1106
Epoch: 6/20... Training loss: 0.1146
Epoch: 6/20... Training loss: 0.1154
Epoch: 6/20... Training loss: 0.1138
Epoch: 6/20... Training loss: 0.1117
Epoch: 6/20... Training loss: 0.1190
Epoch: 6/20... Training loss: 0.1131
Epoch: 6/20... Training loss: 0.1156
Epoch: 6/20... Training loss: 0.1166
Epoch: 6/20... Training loss: 0.1114
Epoch: 6/20... Training loss: 0.1136
Epoch: 6/20... Training loss: 0.1158
Epoch: 6/20... Training loss: 0.1117
Epoch: 6/20... Training loss: 0.1176
Epoch: 6/20... Training loss: 0.1091
Epoch: 6/20... Training loss: 0.1134
Epoch: 6/20... Training loss: 0.1101
Epoch: 6/20... Training loss: 0.1177
Epoch: 6/20... Training loss: 0.1130
Epoch: 6/20... Training loss: 0.1168
Epoch: 6/20... Training loss: 0.1181
Epoch: 6/20... Training loss: 0.1171
Epoch: 6/20... Training loss: 0.1153
Epoch: 6/20... Training loss: 0.1153
Epoch: 6/20... Training loss: 0.1171
Epoch: 6/20... Training loss: 0.1107
Epoch: 6/20... Training loss: 0.1146
Epoch: 6/20... Training loss: 0.1170
Epoch: 6/20... Training loss: 0.1138
Epoch: 6/20... Training loss: 0.1117
Epoch: 6/20... Training loss: 0.1129
Epoch: 6/20... Training loss: 0.1165
Epoch: 6/20... Training loss: 0.1129
Epoch: 6/20... Training loss: 0.1151
Epoch: 6/20... Training loss: 0.1150
Epoch: 6/20... Training loss: 0.1114
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-11-ee1b2a582e4e> in <module>()
      7         imgs = batch[0].reshape((-1, 28, 28, 1))
      8         batch_cost, _ = sess.run([cost, opt], feed_dict={inputs_: imgs,
----> 9                                                          targets_: imgs})
     10 
     11         print("Epoch: {}/{}...".format(e+1, epochs),

/Users/llulai/anaconda/envs/dlnd/lib/python3.5/site-packages/tensorflow/python/client/session.py in run(self, fetches, feed_dict, options, run_metadata)
    765     try:
    766       result = self._run(None, fetches, feed_dict, options_ptr,
--> 767                          run_metadata_ptr)
    768       if run_metadata:
    769         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

/Users/llulai/anaconda/envs/dlnd/lib/python3.5/site-packages/tensorflow/python/client/session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
    963     if final_fetches or final_targets:
    964       results = self._do_run(handle, final_targets, final_fetches,
--> 965                              feed_dict_string, options, run_metadata)
    966     else:
    967       results = []

/Users/llulai/anaconda/envs/dlnd/lib/python3.5/site-packages/tensorflow/python/client/session.py in _do_run(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)
   1013     if handle is None:
   1014       return self._do_call(_run_fn, self._session, feed_dict, fetch_list,
-> 1015                            target_list, options, run_metadata)
   1016     else:
   1017       return self._do_call(_prun_fn, self._session, handle, feed_dict,

/Users/llulai/anaconda/envs/dlnd/lib/python3.5/site-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args)
   1020   def _do_call(self, fn, *args):
   1021     try:
-> 1022       return fn(*args)
   1023     except errors.OpError as e:
   1024       message = compat.as_text(e.message)

/Users/llulai/anaconda/envs/dlnd/lib/python3.5/site-packages/tensorflow/python/client/session.py in _run_fn(session, feed_dict, fetch_list, target_list, options, run_metadata)
   1002         return tf_session.TF_Run(session, options,
   1003                                  feed_dict, fetch_list, target_list,
-> 1004                                  status, run_metadata)
   1005 
   1006     def _prun_fn(session, handle, feed_dict, fetch_list):

KeyboardInterrupt: 

In [13]:
fig, axes = plt.subplots(nrows=2, ncols=10, sharex=True, sharey=True, figsize=(20,4))
in_imgs = mnist.test.images[:10]
reconstructed = sess.run(decoded, feed_dict={inputs_: in_imgs.reshape((10, 28, 28, 1))})

for images, row in zip([in_imgs, reconstructed], axes):
    for img, ax in zip(images, row):
        ax.imshow(img.reshape((28, 28)), cmap='Greys_r')
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)


fig.tight_layout(pad=0.1)



In [19]:
sess.close()

Denoising

As I've mentioned before, autoencoders like the ones you've built so far aren't too useful in practive. However, they can be used to denoise images quite successfully just by training the network on noisy images. We can create the noisy images ourselves by adding Gaussian noise to the training images, then clipping the values to be between 0 and 1. We'll use noisy images as input and the original, clean images as targets. Here's an example of the noisy images I generated and the denoised images.

Since this is a harder problem for the network, we'll want to use deeper convolutional layers here, more feature maps. I suggest something like 32-32-16 for the depths of the convolutional layers in the encoder, and the same depths going backward through the decoder. Otherwise the architecture is the same as before.

Exercise: Build the network for the denoising autoencoder. It's the same as before, but with deeper layers. I suggest 32-32-16 for the depths, but you can play with these numbers, or add more layers.


In [21]:
learning_rate = 0.001
inputs_ = tf.placeholder(tf.float32, (None, 28, 28, 1), name='inputs')
targets_ = tf.placeholder(tf.float32, (None, 28, 28, 1), name='targets')

### Encoder
conv1 = 
# Now 28x28x32
maxpool1 = 
# Now 14x14x32
conv2 = 
# Now 14x14x32
maxpool2 = 
# Now 7x7x32
conv3 = 
# Now 7x7x16
encoded = 
# Now 4x4x16

### Decoder
upsample1 = 
# Now 7x7x16
conv4 = 
# Now 7x7x16
upsample2 = 
# Now 14x14x16
conv5 = 
# Now 14x14x32
upsample3 = 
# Now 28x28x32
conv6 = 
# Now 28x28x32

logits = 
#Now 28x28x1

# Pass logits through sigmoid to get reconstructed image
decoded =

# Pass logits through sigmoid and calculate the cross-entropy loss
loss = 

# Get cost and define the optimizer
cost = tf.reduce_mean(loss)
opt = tf.train.AdamOptimizer(learning_rate).minimize(cost)

In [22]:
sess = tf.Session()

In [ ]:
epochs = 100
batch_size = 200
# Set's how much noise we're adding to the MNIST images
noise_factor = 0.5
sess.run(tf.global_variables_initializer())
for e in range(epochs):
    for ii in range(mnist.train.num_examples//batch_size):
        batch = mnist.train.next_batch(batch_size)
        # Get images from the batch
        imgs = batch[0].reshape((-1, 28, 28, 1))
        
        # Add random noise to the input images
        noisy_imgs = imgs + noise_factor * np.random.randn(*imgs.shape)
        # Clip the images to be between 0 and 1
        noisy_imgs = np.clip(noisy_imgs, 0., 1.)
        
        # Noisy images as inputs, original images as targets
        batch_cost, _ = sess.run([cost, opt], feed_dict={inputs_: noisy_imgs,
                                                         targets_: imgs})

        print("Epoch: {}/{}...".format(e+1, epochs),
              "Training loss: {:.4f}".format(batch_cost))

Checking out the performance

Here I'm adding noise to the test images and passing them through the autoencoder. It does a suprisingly great job of removing the noise, even though it's sometimes difficult to tell what the original number is.


In [29]:
fig, axes = plt.subplots(nrows=2, ncols=10, sharex=True, sharey=True, figsize=(20,4))
in_imgs = mnist.test.images[:10]
noisy_imgs = in_imgs + noise_factor * np.random.randn(*in_imgs.shape)
noisy_imgs = np.clip(noisy_imgs, 0., 1.)

reconstructed = sess.run(decoded, feed_dict={inputs_: noisy_imgs.reshape((10, 28, 28, 1))})

for images, row in zip([noisy_imgs, reconstructed], axes):
    for img, ax in zip(images, row):
        ax.imshow(img.reshape((28, 28)), cmap='Greys_r')
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)

fig.tight_layout(pad=0.1)