TensorFlow, Julia // Как использовать разные размеры пакета в моей нейронной сети?
Привет
Я создал код с TensorFlow и Джулией для создания нейронной сети.
У меня проблема: моя сеть работает с размером пакета 1 и не работает, когда размер пакета больше...
Вот мой код:
Вы можете изменить batch_size
от 1 до 10
ENV["CUDA_VISIBLE_DEVICES"] = "0" # It is to use the gpu
using TensorFlow
using Distributions
sess = Session(Graph())
batch_size = 10 # For this example, 0 < batch_size < 11
num_pixels = 64
###########
# Data base: 10 arrays, the first array is fill with 1, the second with 2 etc...
arrays = zeros(Float32,10,num_pixels,num_pixels)
arrays_2 = zeros(Float32,10)
for i in 1:10
for j in 1:num_pixels
for k in 1:num_pixels
arrays[i,j,k] = i
end
end
end
for i in 1:10
arrays_2[i] = i
end
###########
# inputs
x = placeholder(Float32, shape= [batch_size, 1, 1, 1])
y = placeholder(Float32)
###########
# Function to create a batch
function create_batch(batch_size)
x = zeros(Float32, batch_size,num_pixels, num_pixels)
y = zeros(Float32, batch_size)
for i in 1:batch_size
x[i, : ,:] = arrays[i,:,:]
y[i] = arrays_2[i]
end
y, x
end
###########
# Create the different layers ; poids = weight
variable_scope("mymodel" * randstring(), initializer=Normal(0, .001)) do
global poids_1 = get_variable("p1", [2,2,2,1], Float32)
global poids_2 = get_variable("p2",[4,4,3,2],Float32)
global poids_3 = get_variable("p3",[2,2,4,3],Float32)
global poids_4 = get_variable("p4",[1,4,4,4],Float32)
global poids_5 = get_variable("p5",[1,4,4,4],Float32)
global poids_6 = get_variable("p6",[1,4,4,4],Float32)
global biases_1 = get_variable("b1",[2],Float32)
global biases_2 = get_variable("b2",[3],Float32)
global biases_3 = get_variable("b3",[4],Float32)
global biases_4 = get_variable("b4",[4],Float32)
global biases_5 = get_variable("b5",[4],Float32)
global biases_6 = get_variable("b6",[4],Float32)
end
logits_1 = nn.relu(nn.conv2d_transpose(x, poids_1, [batch_size,2,2,2], [1,2,2,1],padding = "SAME") + biases_1)
logits_2 = nn.relu(nn.conv2d_transpose(logits_1,poids_2, [batch_size,4,4,3], [1,2,2,1],padding = "SAME") + biases_2)
logits_3 = nn.relu(nn.conv2d_transpose(logits_2,poids_3, [batch_size,8,8,4], [1,2,2,1],padding = "SAME") + biases_3)
logits_4 = nn.relu(nn.conv2d_transpose(logits_3,poids_4, [batch_size,16,16,4], [1,2,2,1],padding = "SAME") + biases_4)
logits_5 = nn.relu(nn.conv2d_transpose(logits_4,poids_5, [batch_size,32,32,4], [1,2,2,1],padding = "SAME") + biases_5)
logits_6 = nn.relu(nn.conv2d_transpose(logits_5,poids_6, [batch_size,64,64,4], [1,2,2,1],padding = "SAME") + biases_6)
logits_6 = reduce_sum(logits_6, axis=[4])
if batch_size == 1
logits = reshape(logits_6, [num_pixels,num_pixels])
else
logits = reshape(logits_6, [batch_size,num_pixels,num_pixels])
end
smax = nn.softmax(logits)
cross_entropy = reduce_mean(-reduce_sum(y.*log(smax))) # loss function
optimizer = train.AdamOptimizer(0.0001)
train_op = train.minimize(optimizer,cross_entropy)
batch = create_batch(batch_size)
run(sess, global_variables_initializer())
x_ = run(sess, train_op, Dict(x => reshape(batch[1], (batch_size,1,1,1)), y => reshape(batch[2], (batch_size,num_pixels,num_pixels))))
Если batch_size больше 1, у меня есть следующая ошибка, где входные фигуры [batch_size,num_pixels,num_pixels], [batch_size*num_pixels, 1]
:
ERROR: LoadError: On worker 2:
Python error: PyObject ValueError(u"Dimensions must be equal, but are 64 and 640 for 'gradients/Softmax_grad/sub' (op: 'Sub') with input shapes: [10,64,64], [640,1].",)
Если batch_size равен 1, мои логиты должны быть тензором 2 измерений, но если batch_size больше 1, должны ли мои логиты быть тензором 3 измерений (добавить batch_size к измерениям)?
Как я могу изменить размер batch_size?
Спасибо
1 ответ
Решение
Я нашел решение.
При изменении формы логитов используйте следующую форму:
logits = reshape(logits_6, [batch_size,num_pixels*num_pixels])