summaryrefslogtreecommitdiff
path: root/mnist/main.hs
blob: 97c76dfc2008c0660562dfde54a737e9aa88b34e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import Neuronet
import System.Random(randomRIO)
import Numeric.LinearAlgebra (Matrix,Vector,tr,scale,cmap,(#>),randn,toList,fromList,toLists,fromLists,Container)
import Data.List

main = do

    let numtrain=300000

    easynet<-neuronet [20,15,10]

    samples<-filter ((<10).uncurry (+)) <$> gensamp numtrain
    let testsmp=filter ((<10).uncurry (+))[(a,b)|a<-[0..10],b<-[0..10]]

    let trained=foldl' training easynet samples
    let res = map (\(a,b)->test trained (a,b) == a+b) testsmp
    let right=length $ filter (id) res
    let all = length res

    print $ "trained adding up to 10 with "++ show numtrain ++" random training samples"
    print $ "correct answers during testing: " ++ show right ++ "/" ++ show all ++ " (" ++ show (right*100`div`all) ++ "%)"
    print "what can I add for you?"
    str<-lines<$>getContents
    mapM_ (addit trained) str

    where  zrs= take 9 $ repeat 0.01
           val x= take x zrs ++ [0.99] ++ drop x zrs
           getVal x=snd . last . sort $ zip x [0..9]

           training net (s1,s2) = train 0.25 net (fromList $ val s1++val s2) (fromList $ val $ s1+s2)
           test net (s1,s2) = getVal . toList $ asknet net (fromList $ val s1++val s2)

           gensamp :: Int -> IO [(Int,Int)]
           gensamp  0 = return []
           gensamp n = (\a b r->(a,b):r) <$> randomRIO (0,9) <*> randomRIO (0,9) <*> gensamp (n-1)

           addit n x=   do  let w=words x
                            let a=read $ w!!0 :: Int
                            let b=read $ w!!1 :: Int
                            putStrLn $ "I try to add " ++ show a ++ " and " ++ show b
                            putStrLn $ "I think this is = " ++ show (test n (a,b) )
                            putStrLn "what two numbers do you want me to add master?"

                            
{-


train_img="train-images-idx3-ubyte"
train_lbl="train-labels-idx1-ubyte"
sel=3333

main1 = do
        h <- openFile train_img ReadMode
        h2 <- openFile train_lbl ReadMode
        BS.hGetContents h>>= showImg . BS.take (28*28) . BS.drop (28*28*sel) . BS.drop 16
        BS.hGetContents h2>>= print. BS.unpack . BS.take 1 . BS.drop (sel) . BS.drop 8



showImg a | BS.null a = print "--" 
          | otherwise = do mapM_ putVal $ BS.unpack $ BS.take 28 a
                           putStr "\n"
                           showImg $ BS.drop 28 a

putVal v | v==0 = putStr " "
         | v<50 = putStr "."
         | v<128 = putStr "o"
         | v<160 = putStr "O"
         | otherwise = putStr "0"


main2 = do 
    --              0  1   2   3   4   5   6   7   8   9 
    let m=(4><10)[  0, 100,0,  100,0,  100,0,  100,0,  100
                   ,0, 0,  100,100,0,  0,  100,100,0,  0
                   ,0, 0,  0,  0,  100,100,100,100,0,  0
                   ,0, 0,  0,  0,  0,  0,  0,  0,  100,100]

    let b=vector . take 4 . repeat $ (-50)
                
    let z= repeat 0.01
    let vv x= vector $ take x z ++ [0.99] ++ take (9-x) z
    let v = vv 6
    let z= m #> v + b
    let a= cmap sigmoid z
    print m
    print v
    print z 
    print a
-}