এই অটোরকোডার নেটওয়ার্কটি সঠিকভাবে ফাংশন করতে পারে না (কনভোলিউশনাল এবং ম্যাক্সপুল স্তর সহ)


9

অটেনকোডার নেটওয়ার্কগুলি সাধারণ শ্রেণিবদ্ধ এমএলপি নেটওয়ার্কগুলির চেয়ে বেশি কৌশলযুক্ত বলে মনে হয়। পুনর্গঠিত আউটপুটে আমি যা পেয়েছি লাসাগনকে ব্যবহার করার পরে বেশ কয়েকটি চেষ্টার পরে এমন একটি জিনিস যা এমএনআইএসটি ডাটাবেসের সমস্ত চিত্রের ইনপুট ডিজিটটি আসলে কী তা কোনও পার্থক্য ছাড়াই তার অস্পষ্ট গড়ের সাথে সাদৃশ্যপূর্ণ

আমি যে নেটওয়ার্ক কাঠামোটি বেছে নিয়েছি তা হ'ল নিম্নলিখিত ক্যাসকেড স্তরগুলি:

  1. ইনপুট স্তর (28x28)
  2. 2 ডি রূপান্তরকারী স্তর, ফিল্টার আকার 7x7
  3. সর্বাধিক পুলিং স্তর, আকার 3x3, স্ট্রাইড 2x2
  4. ঘন (সম্পূর্ণ সংযুক্ত) সমতল স্তর, 10 ইউনিট (এটিই বাধা)
  5. ঘন (সম্পূর্ণ সংযুক্ত) স্তর, 121 ইউনিট
  6. স্তরটিকে 11x11 এ পুনরায় আকার দিন
  7. 2 ডি কনভোলিউশনাল স্তর, ফিল্টার আকার 3x3
  8. 2 ডি আপসালিং স্তর স্তর 2
  9. 2 ডি কনভোলিউশনাল স্তর, ফিল্টার আকার 3x3
  10. 2 ডি আপসালিং স্তর স্তর 2
  11. 2 ডি রূপান্তরকারী স্তর, ফিল্টার আকার 5x5
  12. সর্বাধিক পুলিং বৈশিষ্ট্য (31x28x28 থেকে 28x28 পর্যন্ত)

সমস্ত 2 ডি কনজ্যুশনাল স্তরগুলিতে বায়াসগুলি অবিরত, সিগময়েড অ্যাক্টিভেশন এবং 31 টি ফিল্টার রয়েছে।

সমস্ত সম্পূর্ণ সংযুক্ত স্তরগুলিতে সিগময়েড অ্যাক্টিভেশন রয়েছে।

ব্যবহৃত ক্ষতি ফাংশনটি স্কোয়ার ত্রুটি , আপডেট ফাংশন adagrad। শেখার জন্য অংশটির দৈর্ঘ্য 100 টি নমুনা, 1000 গুণগুলির জন্য গুণিত।

নীচে সমস্যার উদাহরণ রয়েছে: উপরের সারিটি নেটওয়ার্কের ইনপুট হিসাবে সেট করা কয়েকটি নমুনা, নীচের সারিটি পুনর্নির্মাণ:

স্বয়ংক্রিয়কোডার ইনপুট এবং আউটপুট

কেবল সম্পূর্ণতার জন্য, নিম্নলিখিত কোডগুলি আমি ব্যবহার করেছি:

import theano.tensor as T
import theano
import sys
sys.path.insert(0,'./Lasagne') # local checkout of Lasagne
import lasagne
from theano import pp
from theano import function
import gzip
import numpy as np
from sklearn.preprocessing import OneHotEncoder
import matplotlib.pyplot as plt
def load_mnist():

    def load_mnist_images(filename):
        with gzip.open(filename, 'rb') as f:
            data = np.frombuffer(f.read(), np.uint8, offset=16)
        # The inputs are vectors now, we reshape them to monochrome 2D images,
        # following the shape convention: (examples, channels, rows, columns)
        data = data.reshape(-1, 1, 28, 28)
        # The inputs come as bytes, we convert them to float32 in range [0,1].
        # (Actually to range [0, 255/256], for compatibility to the version
        # provided at http://deeplearning.net/data/mnist/mnist.pkl.gz.)
        return data / np.float32(256)

    def load_mnist_labels(filename):
        # Read the labels in Yann LeCun's binary format.
        with gzip.open(filename, 'rb') as f:
            data = np.frombuffer(f.read(), np.uint8, offset=8)
        # The labels are vectors of integers now, that's exactly what we want.
        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')
    return X_train, y_train, X_test, y_test

def plot_filters(conv_layer):
    W = conv_layer.get_params()[0]
    W_fn = theano.function([],W)
    params = W_fn()
    ks = np.squeeze(params)
    kstack = np.vstack(ks)
    plt.imshow(kstack,interpolation='none')
    plt.show()

def main():

    #theano.config.exception_verbosity="high"
    #theano.config.optimizer='None'

    X_train, y_train, X_test, y_test = load_mnist()
    ohe = OneHotEncoder()

    y_train = ohe.fit_transform(np.expand_dims(y_train,1)).toarray()
    chunk_len = 100
    visamount = 10
    num_epochs = 1000
    num_filters=31
    dropout_p=.0
    print "X_train.shape",X_train.shape,"y_train.shape",y_train.shape
    input_var = T.tensor4('X')
    output_var = T.tensor4('X')
    conv_nonlinearity = lasagne.nonlinearities.sigmoid
    net = lasagne.layers.InputLayer((chunk_len,1,28,28), input_var)
    conv1 = net = lasagne.layers.Conv2DLayer(net,num_filters,(7,7),nonlinearity=conv_nonlinearity,untie_biases=True)
    net = lasagne.layers.MaxPool2DLayer(net,(3,3),stride=(2,2))
    net = lasagne.layers.DropoutLayer(net,p=dropout_p)
    #conv2_layer = lasagne.layers.Conv2DLayer(dropout_layer,num_filters,(3,3),nonlinearity=conv_nonlinearity)
    #pool2_layer = lasagne.layers.MaxPool2DLayer(conv2_layer,(3,3),stride=(2,2))
    net = lasagne.layers.DenseLayer(net,10,nonlinearity=lasagne.nonlinearities.sigmoid)

    #augment_layer1 = lasagne.layers.DenseLayer(reduction_layer,33,nonlinearity=lasagne.nonlinearities.sigmoid)
    net = lasagne.layers.DenseLayer(net,121,nonlinearity=lasagne.nonlinearities.sigmoid)

    net = lasagne.layers.ReshapeLayer(net,(chunk_len,1,11,11))

    net = lasagne.layers.Conv2DLayer(net,num_filters,(3,3),nonlinearity=conv_nonlinearity,untie_biases=True)
    net = lasagne.layers.Upscale2DLayer(net,2)

    net = lasagne.layers.Conv2DLayer(net,num_filters,(3,3),nonlinearity=conv_nonlinearity,untie_biases=True)
    #pool_after0 = lasagne.layers.MaxPool2DLayer(conv_after1,(3,3),stride=(2,2))
    net = lasagne.layers.Upscale2DLayer(net,2)

    net = lasagne.layers.DropoutLayer(net,p=dropout_p)

    #conv_after2 = lasagne.layers.Conv2DLayer(upscale_layer1,num_filters,(3,3),nonlinearity=conv_nonlinearity,untie_biases=True)
    #pool_after1 = lasagne.layers.MaxPool2DLayer(conv_after2,(3,3),stride=(1,1))
    #upscale_layer2 = lasagne.layers.Upscale2DLayer(pool_after1,4)

    net = lasagne.layers.Conv2DLayer(net,num_filters,(5,5),nonlinearity=conv_nonlinearity,untie_biases=True)
    net = lasagne.layers.FeaturePoolLayer(net,num_filters,pool_function=theano.tensor.max)
    print "output_shape:",lasagne.layers.get_output_shape(net)
    params = lasagne.layers.get_all_params(net, trainable=True)
    prediction = lasagne.layers.get_output(net)
    loss = lasagne.objectives.squared_error(prediction, output_var)
    #loss = lasagne.objectives.binary_crossentropy(prediction, output_var)
    aggregated_loss = lasagne.objectives.aggregate(loss)
    updates = lasagne.updates.adagrad(aggregated_loss,params)
    train_fn = theano.function([input_var, output_var], loss, updates=updates)

    test_prediction = lasagne.layers.get_output(net, deterministic=True)
    predict_fn = theano.function([input_var], test_prediction)

    print "starting training..."
    for epoch in range(num_epochs):
        selected = list(set(np.random.random_integers(0,59999,chunk_len*4)))[:chunk_len]
        X_train_sub = X_train[selected,:]
        _loss = train_fn(X_train_sub, X_train_sub)
        print("Epoch %d: Loss %g" % (epoch + 1, np.sum(_loss) / len(X_train)))
        """
        chunk = X_train[0:chunk_len,:,:,:]
        result = predict_fn(chunk)
        vis1 = np.hstack([chunk[j,0,:,:] for j in range(visamount)])
        vis2 = np.hstack([result[j,0,:,:] for j in range(visamount)])
        plt.imshow(np.vstack([vis1,vis2]))
        plt.show()
        """
    print "done."

    chunk = X_train[0:chunk_len,:,:,:]
    result = predict_fn(chunk)
    print "chunk.shape",chunk.shape
    print "result.shape",result.shape
    plot_filters(conv1)
    for i in range(chunk_len/visamount):
        vis1 = np.hstack([chunk[i*visamount+j,0,:,:] for j in range(visamount)])
        vis2 = np.hstack([result[i*visamount+j,0,:,:] for j in range(visamount)])
        plt.imshow(np.vstack([vis1,vis2]))
        plt.show()
    import ipdb; ipdb.set_trace()

if __name__ == "__main__":
    main()

যুক্তিসঙ্গতভাবে কাজ করা অটোরকোডারটি পেতে এই নেটওয়ার্ককে কীভাবে উন্নত করা যায় সে সম্পর্কে কোনও ধারণা?

সমস্যা সমাধান!

কনফিউশনাল স্তরগুলিতে সিগময়েড ফাংশনের পরিবর্তে ফুটো রেকটিফায়ার ব্যবহার করে, কেবলমাত্র 2 (!!) নোডগুলি এবং শেষ প্রান্তে 1x1 কার্নেলের সাথে কনভোলিউশনগুলি ব্যবহার করে তা সম্পূর্ণ ভিন্ন With

এখানে কিছু পুনর্নির্মাণের ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

কোড:

import theano.tensor as T
import theano
import sys
sys.path.insert(0,'./Lasagne') # local checkout of Lasagne
import lasagne
from theano import pp
from theano import function
import theano.tensor.nnet
import gzip
import numpy as np
from sklearn.preprocessing import OneHotEncoder
import matplotlib.pyplot as plt
def load_mnist():

    def load_mnist_images(filename):
        with gzip.open(filename, 'rb') as f:
            data = np.frombuffer(f.read(), np.uint8, offset=16)
        # The inputs are vectors now, we reshape them to monochrome 2D images,
        # following the shape convention: (examples, channels, rows, columns)
        data = data.reshape(-1, 1, 28, 28)
        # The inputs come as bytes, we convert them to float32 in range [0,1].
        # (Actually to range [0, 255/256], for compatibility to the version
        # provided at http://deeplearning.net/data/mnist/mnist.pkl.gz.)
        return data / np.float32(256)

    def load_mnist_labels(filename):
        # Read the labels in Yann LeCun's binary format.
        with gzip.open(filename, 'rb') as f:
            data = np.frombuffer(f.read(), np.uint8, offset=8)
        # The labels are vectors of integers now, that's exactly what we want.
        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')
    return X_train, y_train, X_test, y_test

def main():

    X_train, y_train, X_test, y_test = load_mnist()
    ohe = OneHotEncoder()

    y_train = ohe.fit_transform(np.expand_dims(y_train,1)).toarray()
    chunk_len = 100
    num_epochs = 10000
    num_filters=7
    input_var = T.tensor4('X')
    output_var = T.tensor4('X')
    #conv_nonlinearity = lasagne.nonlinearities.sigmoid
    #conv_nonlinearity = lasagne.nonlinearities.rectify
    conv_nonlinearity = lasagne.nonlinearities.LeakyRectify(.1)
    softplus = theano.tensor.nnet.softplus
    #conv_nonlinearity = theano.tensor.nnet.softplus
    net = lasagne.layers.InputLayer((chunk_len,1,28,28), input_var)
    conv1 = net = lasagne.layers.Conv2DLayer(net,num_filters,(7,7),nonlinearity=conv_nonlinearity,untie_biases=True)
    net = lasagne.layers.MaxPool2DLayer(net,(3,3),stride=(2,2))
    net = lasagne.layers.DenseLayer(net,2,nonlinearity=lasagne.nonlinearities.sigmoid)
    net = lasagne.layers.DenseLayer(net,49,nonlinearity=lasagne.nonlinearities.sigmoid)
    net = lasagne.layers.ReshapeLayer(net,(chunk_len,1,7,7))
    net = lasagne.layers.Conv2DLayer(net,num_filters,(3,3),nonlinearity=conv_nonlinearity,untie_biases=True)
    net = lasagne.layers.MaxPool2DLayer(net,(3,3),stride=(1,1))
    net = lasagne.layers.Upscale2DLayer(net,4)
    net = lasagne.layers.Conv2DLayer(net,num_filters,(3,3),nonlinearity=conv_nonlinearity,untie_biases=True)
    net = lasagne.layers.MaxPool2DLayer(net,(3,3),stride=(1,1))
    net = lasagne.layers.Upscale2DLayer(net,4)
    net = lasagne.layers.Conv2DLayer(net,num_filters,(5,5),nonlinearity=conv_nonlinearity,untie_biases=True)
    net = lasagne.layers.Conv2DLayer(net,num_filters,(1,1),nonlinearity=conv_nonlinearity,untie_biases=True)
    net = lasagne.layers.FeaturePoolLayer(net,num_filters,pool_function=theano.tensor.max)
    net = lasagne.layers.Conv2DLayer(net,1,(1,1),nonlinearity=conv_nonlinearity,untie_biases=True)
    print "output shape:",net.output_shape
    params = lasagne.layers.get_all_params(net, trainable=True)
    prediction = lasagne.layers.get_output(net)
    loss = lasagne.objectives.squared_error(prediction, output_var)
    #loss = lasagne.objectives.binary_hinge_loss(prediction, output_var)
    aggregated_loss = lasagne.objectives.aggregate(loss)
    #updates = lasagne.updates.adagrad(aggregated_loss,params)
    updates = lasagne.updates.nesterov_momentum(aggregated_loss,params,0.5)#.005
    train_fn = theano.function([input_var, output_var], loss, updates=updates)

    test_prediction = lasagne.layers.get_output(net, deterministic=True)
    predict_fn = theano.function([input_var], test_prediction)

    print "starting training..."
    for epoch in range(num_epochs):
        selected = list(set(np.random.random_integers(0,59999,chunk_len*4)))[:chunk_len]
        X_train_sub = X_train[selected,:]
        _loss = train_fn(X_train_sub, X_train_sub)
        print("Epoch %d: Loss %g" % (epoch + 1, np.sum(_loss) / len(X_train)))
    print "done."

    chunk = X_train[0:chunk_len,:,:,:]
    result = predict_fn(chunk)
    print "chunk.shape",chunk.shape
    print "result.shape",result.shape
    visamount = 10
    for i in range(10):
        vis1 = np.hstack([chunk[i*visamount+j,0,:,:] for j in range(visamount)])
        vis2 = np.hstack([result[i*visamount+j,0,:,:] for j in range(visamount)])
        plt.imshow(np.vstack([vis1,vis2]))
        plt.show()

    import ipdb; ipdb.set_trace()
if __name__ == "__main__":
    main()

উত্তর:


4

আপনি কেবল পুনর্নির্মাণের পরিবর্তে ওজনগুলি কল্পনা করে আরও অন্তর্দৃষ্টি পেতে পারেন। আমার পক্ষপাতদুটিগুলি ভুল কনফিগার করা হয়েছিল তখন আমারও একই সমস্যা হয়েছিল। নীচের সমস্ত কিছুই আমার নিজের শেখার লাইব্রেরি লেখার অভিজ্ঞতার ভিত্তিতে রচিত। আপনি এখানে গিথুব http://github.com/josephcatrambone/aij কোডটি দেখতে পারেন ।

যখন কোনও পক্ষপাত নেই তখন আমার প্রোগ্রামটির একটি স্ক্রিনশট রয়েছে। এটি কেবল দশ যুগের পরে, যেহেতু আমি এই রাইটআপটি শেষ করতে খুব তাড়াতাড়ি আছি:

শুধু ওজন - কোন পক্ষপাত।

এই অপারেশনগুলি দ্বারা ওজন আপডেট করা হয়:

weights.add_i(positiveProduct.subtract(negativeProduct).elementMultiply(learningRate / (float) batchSize));
//visibleBias.add_i(batch.subtract(negativeVisibleProbabilities).meanRow().elementMultiply(learningRate));
//hiddenBias.add_i(positiveHiddenProbabilities.subtract(negativeHiddenProbabilities).meanRow().elementMultiply(learningRate));

যদি আমি দৃশ্যমান পক্ষপাত কোডটি অসম্পূর্ণ করে, আমি এই ফলাফলটি পাই:

সঠিক দৃশ্যমান পক্ষপাত।

যদি আমি দৃশ্যমান পক্ষপাতের কোডটির চিহ্নটি আঁকি (যোগ করার পরিবর্তে বিয়োগ):

visibleBias.subtract_i(batch.subtract(negativeVisibleProbabilities).meanRow().elementMultiply(learningRate));

আমি এই চিত্রটি পেয়েছি:

বিপরীত পক্ষপাতিত্ব চিহ্ন।

কোন তুষারবল এবং শেষ পর্যন্ত আপনার উপরের মতো কিছুতে পৌঁছে। আপনার ত্রুটি ফাংশন এর স্বাক্ষর পরীক্ষা করে দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.