    (max-pooling kernel-dim kernel-dim pad pad stride stride)))
 
 
+(defn split
+  [branches]
+  [{:type :split :branches branches}])
+
+
 (def example-mnist-description
   [(input 28 28 1)
    (convolutional 5 0 1 20)

  [desc]
  (layers/dropout [(:output-size desc)] (:probability desc)))

(defn build-full-network-description
  "build step verifies the network and fills in the implicit entries calculating
  things like the convolutional layer's output size."
  [input-desc-seq]
  (let [input-desc-seq (flatten input-desc-seq)]
    (reduce (fn [accum item]
              (let [previous (last accum)]
                (conj accum (build-desc previous item))))
            [(first input-desc-seq)]
            (rest input-desc-seq))))

(defn create-network
  "Create the live network modules from the built description"

  (let [io-size (:output-size previous)]
    (assoc item :input-size io-size :output-size io-size)))

(defmethod build-desc :split
  [previous item]
  (let [retval (build-pass-through-desc previous item)
        {:keys [branches] } retval
        branches (mapv #(vec (rest (recurse-build-desc retval (flatten %)))) branches)]
    (assoc retval :branches branches)))

(defmethod build-desc :convolutional
  [previous item]
