<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>torch on kpkaiser.com</title><link>https://www.kpkaiser.com/tag/torch/</link><description>Recent content in torch on kpkaiser.com</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Mon, 25 Apr 2016 02:49:33 +0000</lastBuildDate><atom:link href="https://www.kpkaiser.com/tag/torch/index.xml" rel="self" type="application/rss+xml"/><item><title>Training Neural Networks to Generate Terrible Amazon Products</title><link>https://www.kpkaiser.com/machine-learning/training-neural-networks-to-generate-crappy-amazon-products/</link><pubDate>Mon, 11 Jan 2016 01:46:01 +0000</pubDate><guid>https://www.kpkaiser.com/machine-learning/training-neural-networks-to-generate-crappy-amazon-products/</guid><description>&lt;p&gt;&lt;center&gt;&lt;img src="https://www.kpkaiser.com/wp-content/uploads/2016/01/out.gif" /&gt;&lt;img src="https://www.kpkaiser.com/wp-content/uploads/2016/01/out.gif" /&gt;&lt;img src="https://www.kpkaiser.com/wp-content/uploads/2016/01/out.gif" /&gt;&lt;/center&gt;&lt;/p&gt;&#10;&lt;div id="amWrapper" style="width: 140%; margin-left: -186px;"&gt;&#10;&lt;div id="amazonproducts" style="background-color: #A9A9A9;&#10;text-align: center;&#10;margin-bottom: 50px;&#10;padding-bottom: 50px; &#10;padding-top: 50px;&#10;margin-left: 12%; margin-right: 12%;display: none;"&gt;&lt;/p&gt;&#10;&lt;div id="productImage" style="float: left; margin-left: 87px;"&gt;&#10;&lt;/div&gt;&#10;&lt;div id="productName" style="text-align: left; margin-left: 312px; margin-top: -10px; padding-right: 169px;"&gt;&#10;&lt;/div&gt;&#10;&lt;div id="price" style="text-align: left; padding-left: 312px;"&gt;&#10;&lt;/div&gt;&#10;&lt;div id="review" style="text-align:left;margin-left: 119px;"&gt;&#10;&lt;/div&gt;&#10;&lt;div id="controller" style="margin-top: 32px; text-align: right; padding-right: 195px;"&gt;&#10;&lt;button id="nextProd"&gt;Next Product&lt;/button&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&lt;center&gt;&lt;strong style="font-size: 150%;"&gt;Teaching Machines Nonsense&lt;/strong&gt;&lt;/center&gt;&lt;/p&gt;&#10;&lt;p&gt;Last Wednesday, while joking at the end of the workday, the idea came up to make an neural network that generates Amazon reviews. &lt;/p&gt;&#10;&lt;p&gt;Above you can see the results for images, reviews, prices, and product names generated by neural networks trained on Amazon&amp;#8217;s data.&lt;/p&gt;&#10;&lt;p&gt;All of this was possible thanks to the dataset provided by Julian McAuley, used in the &lt;a href="http://cseweb.ucsd.edu/~jmcauley/pdfs/sigir15.pdf"&gt;SIGIR&lt;/a&gt; and &lt;a href="http://cseweb.ucsd.edu/~jmcauley/pdfs/kdd15.pdf"&gt;KDD&lt;/a&gt; papers, along with the torch-gan and char-rnn sources. We&amp;#8217;ll walk through adapting this dataset and adapting it to train these neural networks in this writeup.&lt;/p&gt;&#10;&lt;p&gt;We&amp;#8217;ll step through the thought process behind adapting and extending a dataset, and we&amp;#8217;ll document the road blocks as we run into them along the way. I hope leaving these in will help beginners see that very often, programming requires running into wall after wall until you finally reach the other side.&lt;/p&gt;&#10;&lt;p&gt;We&amp;#8217;ll cover how to load the dataset, how to generate fake product images, reviews, prices, and product names, and then export them for presentation. I hope you&amp;#8217;ll enjoy the ride, even if you&amp;#8217;re not necessarily into programming. I just want to give you an idea for how writing and extending an AI bot works when working from a given data set.&lt;/p&gt;&#10;&lt;p&gt;The finished neural networks and code with instructions are at &lt;a href="https://www.kpkaiser.com/"&gt;Github&lt;/a&gt;. &lt;/p&gt;&#10;&lt;p&gt;So, let&amp;#8217;s begin.&lt;/p&gt;&#10;&lt;p&gt;&lt;script type="text/javascript"&gt;&#10;&lt;!--&#10;var productData = [];&#10;jQuery(document).ready(function($) {&#10;url = '/uploads/divinations.json';&#10;$.getJSON( url, function( data ) {&#10; var items = [];&#10; productData = data;&#10; chosenOne = Math.floor((Math.random() * productData.length) + 1);&#10; productCamel = productData[chosenOne].productName.replace(&#10; /(^|\s+)(\S)(\S*)/g,&#10; function(match, whitespace, firstLetter, rest) {&#10; return whitespace + firstLetter.toUpperCase() + rest.toLowerCase();&#10; }&#10;);&#10; $('#productName').html('&lt;strong style="font-size: 150%;"&gt;' + productCamel + '&lt;/strong&gt;');&#10; $('#price').text(productData[chosenOne].price);&#10; $('#review').html(productData[chosenOne].finalReview);&#10; $('#review h2').prepend('&lt;img src="https://www.kpkaiser.com/images/onestar.png" /&gt;');&#10; $('#productImage').html('&lt;img src="' + productData[chosenOne].finalImage + '" width="128" height="128" /&gt;');&#10;});&#10;$('#nextProd').click(function() {&#10; chosenOne = Math.floor((Math.random() * productData.length) + 1);&#10; productCamel = productData[chosenOne].productName.replace(&#10; /(^|\s+)(\S)(\S*)/g,&#10; function(match, whitespace, firstLetter, rest) {&#10; return whitespace + firstLetter.toUpperCase() + rest.toLowerCase();&#10; }&#10;);&#10; $('#productName').html('&lt;strong style="font-size: 150%;"&gt;' + productCamel + '&lt;/strong&gt;');&#10; $('#price').text(productData[chosenOne].price);&#10; $('#review').html(productData[chosenOne].finalReview);&#10; $('#review h2').prepend('&lt;img src="https://www.kpkaiser.com/images/onestar.png" /&gt;');&#10; $('#productImage').html('&lt;img src="' + productData[chosenOne].finalImage + '" width="128" height="128" /&gt;');&#10;});&#10;});&#10;&#10;//--&gt;&lt;/script&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;center&gt;&lt;strong style="font-size: 150%;"&gt;Meeting Your Data&lt;/strong&gt;&lt;/center&gt;&lt;/p&gt;&#10;&lt;p&gt;The very first thing I did once I received the data set was to take a look at it, to get an idea for its formatting. It was originally compressed with gzip, and so I needed to uncompress it on my external drive.&lt;/p&gt;&#10;&lt;p&gt;Uncompressed, it was 68 gigabytes. When you&amp;#8217;re working with large files, it can get tricky to figure out what you&amp;#8217;ve got, and to make the most basic of assumptions. So the first thing to do is take a look at what you&amp;#8217;re working with, and how messy your data might be.&lt;/p&gt;&#10;&lt;p&gt;In my case, I just used the &amp;#8216;less&amp;#8217; command, to take a look at the first few lines in my terminal. This is easy enough to do in the command line:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ less user_dedup.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;reviewerID&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;A00000262KYZUE4J55XGL&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;asin&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;B003UYU16G&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;reviewerName&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Steven N Elich&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;helpful&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;0, 0&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;reviewText&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;It is and does exactly what the description said it would be and would do. Couldn&amp;#39;t be happier with it.&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;overall&amp;#34;&lt;/span&gt;: 5.0, &lt;span class="s2"&gt;&amp;#34;summary&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Does what it&amp;#39;s supposed to do&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;unixReviewTime&amp;#34;&lt;/span&gt;: 1353456000, &lt;span class="s2"&gt;&amp;#34;reviewTime&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;11 21, 2012&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;reviewerID&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;A000008615DZQRRI946FO&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;asin&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;B005FYPK9C&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;reviewerName&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;mj waldon&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;helpful&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;0, 0&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;reviewText&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;I was sketchy at first about these but once you wear them for a couple hours they break in they fit good on my board an have little wear from skating in them. They are a little heavy but won&amp;#39;t get eaten up as bad by your grip tape like poser dc shoes.&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;overall&amp;#34;&lt;/span&gt;: 5.0, &lt;span class="s2"&gt;&amp;#34;summary&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;great buy&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;unixReviewTime&amp;#34;&lt;/span&gt;: 1357603200, &lt;span class="s2"&gt;&amp;#34;reviewTime&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;01 8, 2013&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;reviewerID&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;A00000922W28P2OCH6JSE&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;asin&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;B000VEBG9Y&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;reviewerName&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Gabriel Merrill&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;helpful&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;0, 0&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;reviewText&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Very mobile product. Efficient. Easy to use; however product needs a varmint guard. Critters are able to gorge themselves without a guard.&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;overall&amp;#34;&lt;/span&gt;: 3.0, &lt;span class="s2"&gt;&amp;#34;summary&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Great product but needs a varmint guard.&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;unixReviewTime&amp;#34;&lt;/span&gt;: 1395619200, &lt;span class="s2"&gt;&amp;#34;reviewTime&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;03 24, 2014&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;reviewerID&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;A00000922W28P2OCH6JSE&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;asin&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;B001EJMS6K&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;reviewerName&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Gabriel Merrill&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;helpful&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;0, 0&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;reviewText&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Easy to use a mobile. If you&amp;#39;re taller than 4ft, be ready to tuck your legs behind you as you hang and pull.&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;overall&amp;#34;&lt;/span&gt;: 4.0, &lt;span class="s2"&gt;&amp;#34;summary&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Great inexpensive product. Mounts easily and transfers to the ground for multiple push up positions.&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;unixReviewTime&amp;#34;&lt;/span&gt;: 1395619200, &lt;span class="s2"&gt;&amp;#34;reviewTime&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;03 24, 2014&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;p&gt;We can immediately see that our JSON file isn&amp;#8217;t really in JSON, but it&amp;#8217;s in a kind of Python dictionary object. And indeed, when I look at the web url that I got this info from, it says specifically that each line can just be &amp;#8216;eval&amp;#8217;d in Python in order to generate one object at a time.&lt;/p&gt;&#10;&lt;p&gt;This makes it easier to deal with this large of a file, because it means we don&amp;#8217;t need to read the entire list into memory just to create our object. (Which could take minutes to hours to do.) Instead, we can go line by line in our file, and each review individually into memory.&lt;/p&gt;&#10;&lt;p&gt;</description></item></channel></rss>