2017-04-22 19 views
2

私は、TheanoまたはTensorFlowよりも簡単だと聞いているので、KerasでANNを学ぼうとしています。私は最初に入力レイヤーと関係するいくつかの質問があります。Kerasと入力層

これまでのところ、私は、入力としてのコード行を持っている:

model.add(Dense(3 ,input_shape=(2,), batch_size=50 ,activation='relu')) 

今、私がモデルに追加したいデータは、以下の形状である:私はしたい

Index(['stock_price', 'stock_volume', 'sentiment'], dtype='object') 
[[ 3.01440000e+02 7.87830000e+04 0.00000000e+00] 
[ 3.01440000e+02 7.87830000e+04 0.00000000e+00] 
[ 3.01440000e+02 7.87830000e+04 1.42857143e-01] 
[ 3.01440000e+02 7.87830000e+04 5.88235294e-02] 
[ 3.01440000e+02 7.87830000e+04 0.00000000e+00] 
[ 3.01440000e+02 7.87830000e+04 0.00000000e+00] 
[ 3.01440000e+02 7.87830000e+04 0.00000000e+00] 
[ 3.01440000e+02 7.87830000e+04 0.00000000e+00] 
[ 3.01440000e+02 7.87830000e+04 0.00000000e+00] 
[ 3.01440000e+02 7.87830000e+04 5.26315789e-02]] 

モデルでは、株価とツイートの感情の相関関係を見つけることができるかどうかを見てみると、結局のところ、それがパターンを見つけることができるかどうかを見たいので、そこにボリュームを投げただけです。

私の2番目の質問は、いくつかの異なるパラメータで入力層を実行した後で、私が説明できないこの問題が発生します。だから私はこの行を実行する場合:私は、この出力誤差を取得し、次の行で

model.add(Dense(3 ,input_shape=(2,), batch_size=50 ,activation='relu')) 

を:

ValueError: Error when checking model input: expected dense_1_input to have shape (50, 2) but got array with shape (50, 3) 

しかし、私は要求された「3」に入力形状を変更したときに、私はこのエラーを取得:

ValueError: Error when checking model target: expected dense_2 to have shape (50, 1) but got array with shape (50, 302) 

なぜ2がエラーメッセージで '302'に変更されましたか?

これはWekaのアプリケーションを以前に使っただけなので、私が実装しようとした最初のニューラルネットなので、本当に基本的な問題を見落としているでしょう。とにかくここ

は私の完全なコードのコピーです:

from keras.models import Sequential, Model 
from keras.layers import Dense, Activation, Input 
from keras.optimizers import SGD 
from keras.utils import np_utils 
import pymysql as mysql 
import pandas as pd 
import config 

import numpy 
import pprint 

model = Sequential() 
try: 
    sql = "SELECT stock_price, stock_volume, sentiment FROM tweets LIMIT 50" 
    con = mysql.connect(config.dbhost, config.dbuser, config.dbpassword, config.dbname, charset='utf8mb4', autocommit=True) 
    results = pd.read_sql(sql=sql, con=con, columns=['stock_price', 'stock_volume', 'sentiment']) 
finally: 
    con.close() 

npResults = results.as_matrix() 
cols = np_utils.to_categorical(results['stock_price'].values) 
data = results.values 

print(cols) 
# inputs: 
# 1st = stock price 
# 2nd = tweet sentiment 
# 3rd = volume 
model.add(Dense(3 ,input_shape=(3,), batch_size=50 ,activation='relu')) 
model.add(Dense(20, activation='linear')) 
sgd = SGD(lr=0.3, decay=0.01, momentum=0.2) 

model.compile(loss='sparse_categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) 

model.summary() 
model.fit(x=data, y=cols, epochs=100, batch_size=100, verbose=2) 

編集:ここでは

は、私は、コンソールをFOM得るすべての出力です:

C:\Users\Def\Anaconda3\python.exe C:/Users/Def/Dropbox/Dissertation/ann.py 
Using Theano backend. 
C:\Users\Def\Dropbox\Dissertation 
[[ 0. 0. 0. ..., 0. 0. 1.] 
[ 0. 0. 0. ..., 0. 0. 1.] 
[ 0. 0. 0. ..., 0. 0. 1.] 
..., 
[ 0. 0. 0. ..., 0. 0. 1.] 
[ 0. 0. 0. ..., 0. 0. 1.] 
[ 0. 0. 0. ..., 0. 0. 1.]] 
_________________________________________________________________ 
Layer (type)     Output Shape    Param # 
================================================================= 
dense_1 (Dense)    (50, 3)     12   
_________________________________________________________________ 
dense_2 (Dense)    (50, 20)     80   
================================================================= 
Traceback (most recent call last): 
    File "C:/Users/Def/Dropbox/Dissertation/ann.py", line 38, in <module> 
    model.fit(x=data, y=cols, epochs=100, batch_size=100, verbose=2) 
    File "C:\Users\Def\Anaconda3\lib\site-packages\keras\models.py", line 845, in fit 
    initial_epoch=initial_epoch) 
    File "C:\Users\Def\Anaconda3\lib\site-packages\keras\engine\training.py", line 1405, in fit 
    batch_size=batch_size) 
    File "C:\Users\Def\Anaconda3\lib\site-packages\keras\engine\training.py", line 1299, in _standardize_user_data 
    exception_prefix='model target') 
    File "C:\Users\Def\Anaconda3\lib\site-packages\keras\engine\training.py", line 133, in _standardize_input_data 
    str(array.shape)) 
ValueError: Error when checking model target: expected dense_2 to have shape (50, 20) but got array with shape (50, 302) 
Total params: 92.0 
Trainable params: 92 
Non-trainable params: 0.0 
_________________________________________________________________ 

Process finished with exit code 1 
+0

まず、これが回帰問題か分類問題か、予測する目標値とその次元性を定義する必要があります。 –

答えて

0

私はあなたが使用していると思います間違ったメトリック:sparse_categorical_crossentropy これを通常よりも好む理由はありますか:categorical_crossentropy

categorical_crossentropyを使用している場合は、ターゲットを1ホットコードでエンコードする必要があります(例:cols = np_utils.to_categorical(results['stock_price'].values)など)。

一方、sparse_categorical_crossentropyは整数ベースのラベルを使用します。

だからいずれかを使用:

cols = np_utils.to_categorical(results['stock_price'].values) 

model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) 

有すると(NUM-カテゴリ)ニューロン

または使用の出力層:と

cols = results['stock_price'].values.astype(np.int32) 
model.compile(loss='sparse_categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) 

と単一ニューロン出力層。

+0

出力レイヤーはニューロンの通常のセットにすぎませんか?私は入力のような特別な層は必要ありませんか? IE出力寸法や出力形状を設定する必要はありませんか?私は依頼する理由はまだ奇妙な "ValueError:モデルターゲットをチェックするときにエラーが発生しました:dense_2がshape(50,20)を持っているが、shape(50,302)の配列を持っている"と思われるエラー – Definity

+0

入力レイヤーが必要ない最初のDenseレイヤーのinput_shapeをすでに指定しています。出力層の#次元はカテゴリの数でなければなりません。いくつのカテゴリーがありますか? – Pedia

+0

私は出力として3つのカテゴリーを持っています – Definity